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

作者:Mr_Smile2014 时间:2021-12-31 04:31:03 

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

步骤:

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

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

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);
 }
 // 生成二维码
}
}

效果:

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

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

批量图:

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

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>

来源:http://blog.csdn.net/mr_smile2014/article/details/53641304

标签:java,zxing,二维码
0
投稿

猜你喜欢

  • C#获取CPU编号的方法

    2022-01-05 10:57:37
  • C#获取本地IP的四种方式示例详解

    2023-04-16 00:52:50
  • Spring StopWatch使用实例详解

    2022-03-31 02:46:57
  • Java ArrayList源码深入分析

    2023-06-16 16:30:26
  • c#如何使用 XML 文档功能

    2023-12-25 03:44:33
  • JAVA HashMap详细介绍和示例

    2023-04-07 00:17:43
  • Flutter 给列表增加下拉刷新和上滑加载更多功能

    2021-10-01 13:30:18
  • Java设计模式之模板方法模式详解

    2021-08-04 04:32:51
  • El表达式使用问题javax.el.ELException:Failed to parse the expression的解决方式

    2023-11-24 12:47:13
  • C# Winform实现进度条显示

    2023-09-14 15:47:51
  • Unity使用多态制作计算器功能

    2022-10-15 02:50:06
  • Java文件断点续传实现原理解析

    2022-08-21 02:05:39
  • Component和Configuration注解区别实例详解

    2022-04-17 01:12:24
  • java实现斗地主发牌功能

    2022-01-14 14:27:32
  • 使用Maven Helper解决Maven插件冲突的方法

    2023-11-08 06:07:05
  • C#中的事务用法实例分析

    2022-04-03 05:23:37
  • 如何为Spring Cloud Gateway加上全局过滤器

    2022-06-19 09:14:47
  • Android中实现地址栏输入网址能浏览该地址网页源码并操作访问网络

    2022-08-21 16:11:42
  • java实战之猜字小游戏

    2022-03-31 14:48:01
  • springboot集成redis并使用redis生成全局唯一索引ID

    2023-11-28 05:42:39
  • asp之家 软件编程 m.aspxhome.com