首页 > 编程 > Java > 正文

java中使用zxing批量生成二维码立牌

2019-11-26 13:26:49
字体:
来源:转载
供稿:网友

使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址、文本等)生成二维码并放在该位置,最后加上立牌编号。

步骤:

1).做好背景图,如下图:

2).生成二维码BufferedImage对象。代码如下:

/**   *   * @Title: toBufferedImage   * @Description: 把文本转化成二维码图片对象   * @param text   *   二维码内容   * @param width   *   二维码高度   * @param height   *   二位宽度   * @param   * @param Exception   *   设定文件   * @return BufferedImage 返回类型   * @throws   */  public static BufferedImage toBufferedImage(String text, int width,    int height) throws Exception {   int BLACK = 0xFF000000;   int WHITE = 0xFFFFFFFF;   Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();   hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 内容所使用字符集编码   hints.put(EncodeHintType.MARGIN, 1);   BitMatrix matrix = new MultiFormatWriter().encode(text,     BarcodeFormat.QR_CODE, width, height, hints);   BufferedImage image = new BufferedImage(width, height,     BufferedImage.TYPE_INT_RGB);   for (int x = 0; x < width; x++) {    for (int y = 0; y < height; y++) {     image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);    }   }   return image;  } 

3).在立牌背景图的指定位置上生成二维码,代码如下:

/**   *   * @Title: markImageByCode   * @Description: 向图片指定位置增加二维码   * @param img   *   二维码image对象   * @param srcImgPath   *   背景图   * @param targerPath   *   目标图   * @param positionWidth   *   位置横坐标   * @param positionHeight   *   位置纵坐标   * @return void 返回类型   * @throws   */  public static void markImageByCode(Image img, String srcImgPath,    String targerPath, int positionWidth, int positionHeight) {   OutputStream os = null;   try {     Image srcImg = ImageIO.read(new File(srcImgPath));     BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),      srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);     // 1、得到画笔对象    Graphics2D g = buffImg.createGraphics();     // 2、设置对线段的锯齿状边缘处理    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,      RenderingHints.VALUE_INTERPOLATION_BILINEAR);     g.drawImage(      srcImg.getScaledInstance(srcImg.getWidth(null),        srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,      null);     g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,      alpha));     // 3、二维码位置    g.drawImage(img, positionWidth, positionHeight, null);    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));    // 4、释放资源    g.dispose();     // 5、生成图片(建议生成PNG的,jpg会失真)    os = new FileOutputStream(targerPath);    ImageIO.write(buffImg, "PNG", os);     System.out.println("二维码图片生成成功");    } catch (Exception e) {    e.printStackTrace();   } finally {    try {     if (null != os)      os.close();    } catch (Exception e) {     e.printStackTrace();    }   }  } 

4).在立牌上加上立牌编号

/**   *   * @Title: pressText   * @Description:向图片指定位置加上文字   * @param pressText   *   文字内容   * @param srcImageFile   *   原图片   * @param destImageFile   *   目标图片   * @param x   *   横坐标   * @param y   *   纵坐标   * @param alpha   *   透明度   * @return void 返回类型   * @throws   */  public final static void pressText(String pressText, String srcImageFile,    String destImageFile, int x, int y, float alpha) {   try {    File img = new File(srcImageFile);    Image src = ImageIO.read(img);    int width = src.getWidth(null);    int height = src.getHeight(null);    BufferedImage image = new BufferedImage(width, height,      BufferedImage.TYPE_INT_RGB);    Graphics2D g = image.createGraphics();    // 开文字抗锯齿 去文字毛刺    g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,      RenderingHints.VALUE_TEXT_ANTIALIAS_ON);    g.drawImage(src, 0, 0, width, height, null);    // 设置颜色    g.setColor(new Color(89, 87, 87));    // 设置 Font    g.setFont(new Font("方正兰亭中黑_GBK", Font.BOLD, 14));    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,      alpha));    // 第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) .    g.drawString(pressText, x, y);    g.dispose();    ImageIO.write((BufferedImage) image, "PNG", new File(destImageFile));// 输出到文件流   } catch (Exception e) {    e.printStackTrace();   }  } 

示例:

代码:

测试代码

public class codeTest {  public static void main(String[] args) throws Exception {   String text = "http://www.xxx.com/"; // 二维码内容    // 生成二维码   //生成图片二维码存放目录   String targetPath = "f:/qrcode/targetimg/" + Utils.toStr();   //创建目录   Utils.makeDirs(targetPath);      int begin = 100;//code 开始数字   int end = 101;//code结束数字   for (int i = begin; i <= end; i++) {    //生成含日期的16位数字如20161214000001    String code = Utils.toStr() + Utils.formateNumber(i);    //获取二维码对象    BufferedImage image = Utils.toBufferedImage(text      + "?payCode=" + code,240,240);    //生成含背景图+二维码的立牌的图    Utils.markImageByCode(image, "f:/qrcode/srcimg/src.png",      targetPath + "/" + code + ".png", 340, 160);    //立牌的图加上code编号    Utils.pressText(code, targetPath + "/" + code + ".png", targetPath      + "/" + code + ".png", 390, 417, 0.5f);   }   // 生成二维码  } } 

效果:

批量生成的图片效果图如下

批量图:

utils代码:

package cn.utils.code;  import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Hashtable;  import javax.imageio.ImageIO;  import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix;  /** 工具类. */ public abstract class Utils {   /** 日期格式:yyyy-MM-dd HH:mm:ss */  public static String DF_DATETIME = "yyyyMMdd";  private static float alpha = 1f;   /**   *   * @Title: toBufferedImage   * @Description: 把文本转化成二维码图片对象   * @param text   *   二维码内容   * @param width   *   二维码高度   * @param height   *   二位宽度   * @param   * @param Exception   *   设定文件   * @return BufferedImage 返回类型   * @throws   */  public static BufferedImage toBufferedImage(String text, int width,    int height) throws Exception {   int BLACK = 0xFF000000;   int WHITE = 0xFFFFFFFF;   Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();   hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 内容所使用字符集编码   hints.put(EncodeHintType.MARGIN, 1);   BitMatrix matrix = new MultiFormatWriter().encode(text,     BarcodeFormat.QR_CODE, width, height, hints);   BufferedImage image = new BufferedImage(width, height,     BufferedImage.TYPE_INT_RGB);   for (int x = 0; x < width; x++) {    for (int y = 0; y < height; y++) {     image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);    }   }   return image;  }   /**   *   * @Title: markImageByCode   * @Description: 向图片指定位置增加二维码   * @param img   *   二维码image对象   * @param srcImgPath   *   背景图   * @param targerPath   *   目标图   * @param positionWidth   *   位置横坐标   * @param positionHeight   *   位置纵坐标   * @return void 返回类型   * @throws   */  public static void markImageByCode(Image img, String srcImgPath,    String targerPath, int positionWidth, int positionHeight) {   OutputStream os = null;   try {     Image srcImg = ImageIO.read(new File(srcImgPath));     BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),      srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);     // 1、得到画笔对象    Graphics2D g = buffImg.createGraphics();     // 2、设置对线段的锯齿状边缘处理    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,      RenderingHints.VALUE_INTERPOLATION_BILINEAR);     g.drawImage(      srcImg.getScaledInstance(srcImg.getWidth(null),        srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,      null);     g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,      alpha));     // 3、二维码位置    g.drawImage(img, positionWidth, positionHeight, null);    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));    // 4、释放资源    g.dispose();     // 5、生成图片(建议生成PNG的,jpg会失真)    os = new FileOutputStream(targerPath);    ImageIO.write(buffImg, "PNG", os);     System.out.println("二维码图片生成成功");    } catch (Exception e) {    e.printStackTrace();   } finally {    try {     if (null != os)      os.close();    } catch (Exception e) {     e.printStackTrace();    }   }  }   /**   *   * @Title: pressText   * @Description:向图片指定位置加上文字   * @param pressText   *   文字内容   * @param srcImageFile   *   原图片   * @param destImageFile   *   目标图片   * @param x   *   横坐标   * @param y   *   纵坐标   * @param alpha   *   透明度   * @return void 返回类型   * @throws   */  public final static void pressText(String pressText, String srcImageFile,    String destImageFile, int x, int y, float alpha) {   try {    File img = new File(srcImageFile);    Image src = ImageIO.read(img);    int width = src.getWidth(null);    int height = src.getHeight(null);    BufferedImage image = new BufferedImage(width, height,      BufferedImage.TYPE_INT_RGB);    Graphics2D g = image.createGraphics();    // 开文字抗锯齿 去文字毛刺    g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,      RenderingHints.VALUE_TEXT_ANTIALIAS_ON);    g.drawImage(src, 0, 0, width, height, null);    // 设置颜色    g.setColor(new Color(89, 87, 87));    // 设置 Font    g.setFont(new Font("方正兰亭中黑_GBK", Font.BOLD, 14));    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,      alpha));    // 第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) .    g.drawString(pressText, x, y);    g.dispose();    ImageIO.write((BufferedImage) image, "PNG", new File(destImageFile));// 输出到文件流   } catch (Exception e) {    e.printStackTrace();   }  }   // 日期转字符串   /** 将日期格式化为String,默认格式为yyyy-MM-dd HH:mm:ss,默认日期为当前日期. */  public static String toStr() {   return toStr(DF_DATETIME);  }   /** 将日期格式化为String,格式由参数format指定,默认日期为当前日期,format值可使用本类常量或自定义. */  public static String toStr(String format) {   return toStr(format, new Date());  }   /** 将日期格式化为String,默认格式为yyyy-MM-dd HH:mm:ss,日期由参数date指定. */  public static String toStr(Date date) {   return toStr(DF_DATETIME, date);  }   /** 将日期格式化为String,格式由参数format指定,日期由参数date指定,format值可使用本类常量或自定义. */  public static String toStr(String format, Date date) {   return new SimpleDateFormat(format).format(date);  }   public static String formateNumber(int num) {   DecimalFormat df = new DecimalFormat("000000");   String str2 = df.format(num);   return str2;  }   public static boolean makeDirs(String filePath) {    File folder = new File(filePath);   return (folder.exists() && folder.isDirectory()) ? true : folder     .mkdirs();  }  } 

使用的技术:

1.使用的zxing生成二维码工具。

1)下载地址:http://repo1.maven.org/maven2/com/google/zxing/javase/3.1.0/

2).maven配置

<dependency>    <groupId>com.google.zxing</groupId>    <artifactId>core</artifactId>    <version>2.2</version>   </dependency> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表