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

最后加上立牌编号。

步骤:

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

扫一扫添加关注

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

[java] view plaincopy
  1. /**
  2. *
  3. * @Title: toBufferedImage
  4. * @Description: 把文本转化成二维码图片对象
  5. * @param text
  6. *            二维码内容
  7. * @param width
  8. *            二维码高度
  9. * @param height
  10. *            二位宽度
  11. * @param
  12. * @param Exception
  13. *            设定文件
  14. * @return BufferedImage 返回类型
  15. * @throws
  16. */
  17. public static BufferedImage toBufferedImage(String text, int width,
  18. int height) throws Exception {
  19. int BLACK = 0xFF000000;
  20. int WHITE = 0xFFFFFFFF;
  21. Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
  22. hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 内容所使用字符集编码
  23. hints.put(EncodeHintType.MARGIN, 1);
  24. BitMatrix matrix = new MultiFormatWriter().encode(text,
  25. BarcodeFormat.QR_CODE, width, height, hints);
  26. BufferedImage image = new BufferedImage(width, height,
  27. BufferedImage.TYPE_INT_RGB);
  28. for (int x = 0; x < width; x++) {
  29. for (int y = 0; y < height; y++) {
  30. image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
  31. }
  32. }
  33. return image;
  34. }

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

[java] view plaincopy
  1. /**
  2. *
  3. * @Title: markImageByCode
  4. * @Description: 向图片指定位置增加二维码
  5. * @param img
  6. *            二维码image对象
  7. * @param srcImgPath
  8. *            背景图
  9. * @param targerPath
  10. *            目标图
  11. * @param positionWidth
  12. *            位置横坐标
  13. * @param positionHeight
  14. *            位置纵坐标
  15. * @return void 返回类型
  16. * @throws
  17. */
  18. public static void markImageByCode(Image img, String srcImgPath,
  19. String targerPath, int positionWidth, int positionHeight) {
  20. OutputStream os = null;
  21. try {
  22. Image srcImg = ImageIO.read(new File(srcImgPath));
  23. BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
  24. srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
  25. // 1、得到画笔对象
  26. Graphics2D g = buffImg.createGraphics();
  27. // 2、设置对线段的锯齿状边缘处理
  28. g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
  29. RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  30. g.drawImage(
  31. srcImg.getScaledInstance(srcImg.getWidth(null),
  32. srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
  33. null);
  34. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
  35. alpha));
  36. // 3、二维码位置
  37. g.drawImage(img, positionWidth, positionHeight, null);
  38. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
  39. // 4、释放资源
  40. g.dispose();
  41. // 5、生成图片(建议生成PNG的,jpg会失真)
  42. os = new FileOutputStream(targerPath);
  43. ImageIO.write(buffImg, "PNG", os);
  44. System.out.println("二维码图片生成成功");
  45. } catch (Exception e) {
  46. e.printStackTrace();
  47. } finally {
  48. try {
  49. if (null != os)
  50. os.close();
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }

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

[java] view plaincopy
  1. /**
  2. *
  3. * @Title: pressText
  4. * @Description:向图片指定位置加上文字
  5. * @param pressText
  6. *            文字内容
  7. * @param srcImageFile
  8. *            原图片
  9. * @param destImageFile
  10. *            目标图片
  11. * @param x
  12. *            横坐标
  13. * @param y
  14. *            纵坐标
  15. * @param alpha
  16. *            透明度
  17. * @return void 返回类型
  18. * @throws
  19. */
  20. public final static void pressText(String pressText, String srcImageFile,
  21. String destImageFile, int x, int y, float alpha) {
  22. try {
  23. File img = new File(srcImageFile);
  24. Image src = ImageIO.read(img);
  25. int width = src.getWidth(null);
  26. int height = src.getHeight(null);
  27. BufferedImage image = new BufferedImage(width, height,
  28. BufferedImage.TYPE_INT_RGB);
  29. Graphics2D g = image.createGraphics();
  30. // 开文字抗锯齿 去文字毛刺
  31. g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
  32. RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  33. g.drawImage(src, 0, 0, width, height, null);
  34. // 设置颜色
  35. g.setColor(new Color(89, 87, 87));
  36. // 设置 Font
  37. g.setFont(new Font("方正兰亭中黑_GBK", Font.BOLD, 14));
  38. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
  39. alpha));
  40. // 第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) .
  41. g.drawString(pressText, x, y);
  42. g.dispose();
  43. ImageIO.write((BufferedImage) image, "PNG", new File(destImageFile));// 输出到文件流
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. }

示例:

代码:

测试代码

[java] view plaincopy
  1. public class codeTest {
  2. public static void main(String[] args) throws Exception {
  3. String text = "http://www.xxx.com/"; // 二维码内容
  4. // 生成二维码
  5. //生成图片二维码存放目录
  6. String targetPath = "f:/qrcode/targetimg/" + Utils.toStr();
  7. //创建目录
  8. Utils.makeDirs(targetPath);
  9. int begin = 100;//code 开始数字
  10. int end = 101;//code结束数字
  11. for (int i = begin; i <= end; i++) {
  12. //生成含日期的16位数字如20161214000001
  13. String code = Utils.toStr() + Utils.formateNumber(i);
  14. //获取二维码对象
  15. BufferedImage image = Utils.toBufferedImage(text
  16. + "?payCode=" + code,240,240);
  17. //生成含背景图+二维码的立牌的图
  18. Utils.markImageByCode(image, "f:/qrcode/srcimg/src.png",
  19. targetPath + "/" + code + ".png", 340, 160);
  20. //立牌的图加上code编号
  21. Utils.pressText(code, targetPath + "/" + code + ".png", targetPath
  22. + "/" + code + ".png", 390, 417, 0.5f);
  23. }
  24. // 生成二维码
  25. }
  26. }

效果:

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

批量图:

utils代码:

[java] view plaincopy
  1. package cn.utils.code;
  2. import java.awt.AlphaComposite;
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Graphics2D;
  6. import java.awt.Image;
  7. import java.awt.RenderingHints;
  8. import java.awt.image.BufferedImage;
  9. import java.io.File;
  10. import java.io.FileOutputStream;
  11. import java.io.OutputStream;
  12. import java.text.DecimalFormat;
  13. import java.text.SimpleDateFormat;
  14. import java.util.Date;
  15. import java.util.Hashtable;
  16. import javax.imageio.ImageIO;
  17. import com.google.zxing.BarcodeFormat;
  18. import com.google.zxing.EncodeHintType;
  19. import com.google.zxing.MultiFormatWriter;
  20. import com.google.zxing.common.BitMatrix;
  21. /** 工具类. */
  22. public abstract class Utils {
  23. /** 日期格式:yyyy-MM-dd HH:mm:ss */
  24. public static String DF_DATETIME = "yyyyMMdd";
  25. private static float alpha = 1f;
  26. /**
  27. *
  28. * @Title: toBufferedImage
  29. * @Description: 把文本转化成二维码图片对象
  30. * @param text
  31. *            二维码内容
  32. * @param width
  33. *            二维码高度
  34. * @param height
  35. *            二位宽度
  36. * @param
  37. * @param Exception
  38. *            设定文件
  39. * @return BufferedImage 返回类型
  40. * @throws
  41. */
  42. public static BufferedImage toBufferedImage(String text, int width,
  43. int height) throws Exception {
  44. int BLACK = 0xFF000000;
  45. int WHITE = 0xFFFFFFFF;
  46. Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
  47. hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 内容所使用字符集编码
  48. hints.put(EncodeHintType.MARGIN, 1);
  49. BitMatrix matrix = new MultiFormatWriter().encode(text,
  50. BarcodeFormat.QR_CODE, width, height, hints);
  51. BufferedImage image = new BufferedImage(width, height,
  52. BufferedImage.TYPE_INT_RGB);
  53. for (int x = 0; x < width; x++) {
  54. for (int y = 0; y < height; y++) {
  55. image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
  56. }
  57. }
  58. return image;
  59. }
  60. /**
  61. *
  62. * @Title: markImageByCode
  63. * @Description: 向图片指定位置增加二维码
  64. * @param img
  65. *            二维码image对象
  66. * @param srcImgPath
  67. *            背景图
  68. * @param targerPath
  69. *            目标图
  70. * @param positionWidth
  71. *            位置横坐标
  72. * @param positionHeight
  73. *            位置纵坐标
  74. * @return void 返回类型
  75. * @throws
  76. */
  77. public static void markImageByCode(Image img, String srcImgPath,
  78. String targerPath, int positionWidth, int positionHeight) {
  79. OutputStream os = null;
  80. try {
  81. Image srcImg = ImageIO.read(new File(srcImgPath));
  82. BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
  83. srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
  84. // 1、得到画笔对象
  85. Graphics2D g = buffImg.createGraphics();
  86. // 2、设置对线段的锯齿状边缘处理
  87. g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
  88. RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  89. g.drawImage(
  90. srcImg.getScaledInstance(srcImg.getWidth(null),
  91. srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
  92. null);
  93. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
  94. alpha));
  95. // 3、二维码位置
  96. g.drawImage(img, positionWidth, positionHeight, null);
  97. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
  98. // 4、释放资源
  99. g.dispose();
  100. // 5、生成图片(建议生成PNG的,jpg会失真)
  101. os = new FileOutputStream(targerPath);
  102. ImageIO.write(buffImg, "PNG", os);
  103. System.out.println("二维码图片生成成功");
  104. } catch (Exception e) {
  105. e.printStackTrace();
  106. } finally {
  107. try {
  108. if (null != os)
  109. os.close();
  110. } catch (Exception e) {
  111. e.printStackTrace();
  112. }
  113. }
  114. }
  115. /**
  116. *
  117. * @Title: pressText
  118. * @Description:向图片指定位置加上文字
  119. * @param pressText
  120. *            文字内容
  121. * @param srcImageFile
  122. *            原图片
  123. * @param destImageFile
  124. *            目标图片
  125. * @param x
  126. *            横坐标
  127. * @param y
  128. *            纵坐标
  129. * @param alpha
  130. *            透明度
  131. * @return void 返回类型
  132. * @throws
  133. */
  134. public final static void pressText(String pressText, String srcImageFile,
  135. String destImageFile, int x, int y, float alpha) {
  136. try {
  137. File img = new File(srcImageFile);
  138. Image src = ImageIO.read(img);
  139. int width = src.getWidth(null);
  140. int height = src.getHeight(null);
  141. BufferedImage image = new BufferedImage(width, height,
  142. BufferedImage.TYPE_INT_RGB);
  143. Graphics2D g = image.createGraphics();
  144. // 开文字抗锯齿 去文字毛刺
  145. g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
  146. RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  147. g.drawImage(src, 0, 0, width, height, null);
  148. // 设置颜色
  149. g.setColor(new Color(89, 87, 87));
  150. // 设置 Font
  151. g.setFont(new Font("方正兰亭中黑_GBK", Font.BOLD, 14));
  152. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
  153. alpha));
  154. // 第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) .
  155. g.drawString(pressText, x, y);
  156. g.dispose();
  157. ImageIO.write((BufferedImage) image, "PNG", new File(destImageFile));// 输出到文件流
  158. } catch (Exception e) {
  159. e.printStackTrace();
  160. }
  161. }
  162. // 日期转字符串
  163. /** 将日期格式化为String,默认格式为yyyy-MM-dd HH:mm:ss,默认日期为当前日期. */
  164. public static String toStr() {
  165. return toStr(DF_DATETIME);
  166. }
  167. /** 将日期格式化为String,格式由参数format指定,默认日期为当前日期,format值可使用本类常量或自定义. */
  168. public static String toStr(String format) {
  169. return toStr(format, new Date());
  170. }
  171. /** 将日期格式化为String,默认格式为yyyy-MM-dd HH:mm:ss,日期由参数date指定. */
  172. public static String toStr(Date date) {
  173. return toStr(DF_DATETIME, date);
  174. }
  175. /** 将日期格式化为String,格式由参数format指定,日期由参数date指定,format值可使用本类常量或自定义. */
  176. public static String toStr(String format, Date date) {
  177. return new SimpleDateFormat(format).format(date);
  178. }
  179. public static String formateNumber(int num) {
  180. DecimalFormat df = new DecimalFormat("000000");
  181. String str2 = df.format(num);
  182. return str2;
  183. }
  184. public static boolean makeDirs(String filePath) {
  185. File folder = new File(filePath);
  186. return (folder.exists() && folder.isDirectory()) ? true : folder
  187. .mkdirs();
  188. }
  189. }

使用的技术:

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

1)下载地址:

http://repo1.maven.org/maven2/com/google/zxing/javase/3.1.0/

2).maven配置

[java] view plaincopy
  1. <dependency>
  2. <groupId>com.google.zxing</groupId>
  3. <artifactId>core</artifactId>
  4. <version>2.2</version>
  5. </dependency>

使用zxing生成二维码相关推荐

  1. Zxing生成二维码思路和源码解析

    Zxing生成二维码思路和源码解析 本博文是一篇介绍google zxing包生成二维码的思路和它的源码的文章. 一.引入 如何调用zxing的代码生成一个二维码呢?主要的函数只有一个,如下所示: B ...

  2. (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...

  3. 五十九、使用ZXing生成二维码

    @Author:Runsen @Date:2020/7/12 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  4. 27.用zxing生成二维码

    先在idea里面导入jar包 链接:https://pan.baidu.com/s/1UdorNg8o0A4FsElghqkJyw 提取码:c4bt 复制这段内容后打开百度网盘手机App,操作更方便哦 ...

  5. zxing 生成二维码,可设置logo、二维码颜色、白边大小

    主要是使用google的zxing 生成二维码,可设置logo.二维码前景色/后景色.白边大小.二维码大小 1.用到jar包 <dependency><groupId>com. ...

  6. 用ZXING生成二维码的工具类(可以去掉白边,添加logo)

    ===========================用ZXING生成二维码的工具类(可以去掉白边,添加logo)========================== /**  * @auther g ...

  7. Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码

    Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码 一.关于ZXing 1.ZXing是谷歌开源的支持二维码.条形码 等图形的生成类库:支持生成.和解码功能. G ...

  8. Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)

    说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...

  9. zxing生成二维码及解析二维码

    ZXing生成二维码 1.下载jar https://github.com/ZF520/QRCode/raw/master/zxing/bin/lib/zxing3.3.1.jar 2.生成二维码的函 ...

  10. 基于zxing生成二维码

    目录 1.二维码的原理 2.基于zxing生成二维码 3.逻辑及其应用 完整代码:https://github.com/122537067/zxingQRcodeLogoColor 效果图: 1.二维 ...

最新文章

  1. Tips/Tricks#0:母版页中对控件ID的处理
  2. macappstore登不上去_武功山观星归来,缆车登顶,不徒步攻略!
  3. EasyUI学习总结(二)——easyloader分析与使用
  4. go var 一个整数_Go语言学习基础-值、变量、常量
  5. Spring 2.5新特性及架构图
  6. macos 此服务器的证书无效_网易出现重大失误,忘记续费HTTPS证书导致大量用户受影响...
  7. 生长区域算法的php实现
  8. MATLAB —— 低通滤波器设计与信号滤波
  9. 兄弟打印机内存已满清零方法_兄弟打印机清零方法
  10. python身份证号查询信息
  11. 2019年中国航空三字代码对照表完全汇总
  12. 【数学】几何在线画图
  13. 安装Powerdesigner16.5
  14. LM358恒流恒压原理
  15. 你的成就只能代表着你过去的努力程度
  16. Dev中GridView——背景颜色改变
  17. NUC安装CentOS-8.2
  18. 欧盟 GDPR 通用数据保护条例正式生效后,各行业影响分析
  19. 珞珈一号01星(luojia1-01)的夜间灯光影像python爬取
  20. mysql 恢复 innodb_MySQL:Innodb恢复的学习笔记

热门文章

  1. torque+maui作业调度
  2. 技术分享 | 使用 C++20 Ranges 标准库实现日历程序
  3. linux一键安装rdp脚本,linux使用一键安装远程桌面环境/RDP脚本遇到问题与解决
  4. Selenium之如何定位隐藏div弹窗
  5. notepad++下载和安装
  6. RDB内存快照:Redis如何实现快速恢复数据
  7. java list集合合并_JAVA List合并集合
  8. 【错误录】System.UnauthorizedAccessException: 对路径的访问被拒绝?
  9. whereis, which详解
  10. Vmware与主机间共享文件的七种方法(附图+详解)