当前位置:   article > 正文

java使用谷歌的zxing包进行二维码生成并减少周边白色区域_zxing 二维码添加白边

zxing 二维码添加白边

网上找到一些使用zxing包生成二维码的例子,但是发现周边的白色区域有点大,想减少一点,有写说法是设置参数hints.put(EncodeHintType.MARGIN, margin); // 指定二维码四周白色区域大小,感觉没用,不生效,四周的白色区域仍然很大。想了想,既然生成二维码的时候周边白色区域过大,那把二维码对象转为BufferedImage对象的时候,减少一点长宽,不就好了,试了下,感觉还行,生成出来的二维码也能正常用,只是周边的白色区域需要减少多少,就没法定了,需要根据生成二维码图片的width/height,自己一点点尝试。

 

下面的代码是网上别人的,就稍微修改了toBufferedImage的是传入要减少白色区域多少的参数。

  1. <dependency>
  2. <groupId>com.google.zxing</groupId>
  3. <artifactId>core</artifactId>
  4. <version>3.4.1</version>
  5. </dependency>
  1. package com.southgroup.psimp.util;
  2. import java.awt.BasicStroke;
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Graphics;
  6. import java.awt.Graphics2D;
  7. import java.awt.image.BufferedImage;
  8. import java.io.File;
  9. import java.io.FileOutputStream;
  10. import java.io.IOException;
  11. import java.io.OutputStream;
  12. import java.util.Date;
  13. import java.util.Hashtable;
  14. import javax.imageio.ImageIO;
  15. import org.apache.commons.lang3.StringUtils;
  16. import com.google.zxing.BarcodeFormat;
  17. import com.google.zxing.EncodeHintType;
  18. import com.google.zxing.MultiFormatWriter;
  19. import com.google.zxing.WriterException;
  20. import com.google.zxing.common.BitMatrix;
  21. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  22. /**
  23. * 二维码生成
  24. * @author Jfei
  25. *
  26. */
  27. public class QrCodeUtil {
  28. private static final int BLACK = 0xFF000000;
  29. private static final int WHITE = 0xFFFFFFFF;
  30. private static final int margin = 0;
  31. private static final int LogoPart = 4;
  32. /**
  33. * 生成二维码矩阵信息
  34. * @param content 二维码图片内容
  35. * @param width 二维码图片宽度
  36. * @param height 二维码图片高度
  37. * @throws WriterException
  38. */
  39. private static BitMatrix setBitMatrix(String content, int width, int height) throws WriterException{
  40. Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
  41. hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 指定编码方式,防止中文乱码
  42. hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 指定纠错等级
  43. hints.put(EncodeHintType.MARGIN, margin); // 指定二维码四周白色区域大小,感觉没用,不生效,四周的白色区域仍然很大
  44. BitMatrix bitMatrix = null;
  45. bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
  46. return bitMatrix;
  47. }
  48. /**
  49. * 将二维码图片输出
  50. * @param matrix 二维码矩阵信息
  51. * @param format 图片格式
  52. * @param outStream 输出流
  53. * @param logoPath logo图片路径
  54. */
  55. private static void writeToFile(BitMatrix matrix, String format, OutputStream outStream, String logoPath,int reduceWhiteArea) throws IOException {
  56. BufferedImage image = toBufferedImage(matrix,reduceWhiteArea);
  57. // 加入LOGO水印效果
  58. if (StringUtils.isNotBlank(logoPath)) {
  59. image = addLogo(image, logoPath);
  60. }
  61. ImageIO.write(image, format, outStream);
  62. }
  63. /**
  64. * 生成二维码图片
  65. * @param matrix 二维码矩阵信息
  66. */
  67. private static BufferedImage toBufferedImage(BitMatrix matrix,int reduceWhiteArea) {
  68. int width = matrix.getWidth();
  69. int height = matrix.getHeight();
  70. BufferedImage image = new BufferedImage(width-2*reduceWhiteArea, height-2*reduceWhiteArea, BufferedImage.TYPE_3BYTE_BGR);
  71. for (int x = reduceWhiteArea; x < width-reduceWhiteArea; x++) {
  72. for (int y = reduceWhiteArea; y < height-reduceWhiteArea; y++) {
  73. image.setRGB(x-reduceWhiteArea, y-reduceWhiteArea, matrix.get(x, y) ? BLACK : WHITE);
  74. }
  75. }
  76. return image;
  77. }
  78. /**
  79. * 在二维码图片中添加logo图片
  80. * @param image 二维码图片
  81. * @param logoPath logo图片路径
  82. */
  83. private static BufferedImage addLogo(BufferedImage image, String logoPath) throws IOException {
  84. Graphics2D g = image.createGraphics();
  85. BufferedImage logoImage = ImageIO.read(new File(logoPath));
  86. // 计算logo图片大小,可适应长方形图片,根据较短边生成正方形
  87. int width = image.getWidth() < image.getHeight() ? image.getWidth() / LogoPart : image.getHeight() / LogoPart;
  88. int height = width;
  89. // 计算logo图片放置位置
  90. int x = (image.getWidth() - width) / 2;
  91. int y = (image.getHeight() - height) / 2;
  92. // 在二维码图片上绘制logo图片
  93. g.drawImage(logoImage, x, y, width, height, null);
  94. // 绘制logo边框,可选
  95. // g.drawRoundRect(x, y, logoImage.getWidth(), logoImage.getHeight(), 10, 10);
  96. g.setStroke(new BasicStroke(2)); // 画笔粗细
  97. g.setColor(Color.WHITE); // 边框颜色
  98. g.drawRect(x, y, width, height); // 矩形边框
  99. logoImage.flush();
  100. g.dispose();
  101. return image;
  102. }
  103. /**
  104. * 为图片添加文字
  105. * @param pressText 文字
  106. * @param newImage 带文字的图片
  107. * @param targetImage 需要添加文字的图片
  108. * @param fontStyle 字体风格
  109. * @param color 字体颜色
  110. * @param fontSize 字体大小
  111. * @param width 图片宽度
  112. * @param height 图片高度
  113. */
  114. public static void pressText(String pressText, String newImage, String targetImage, int fontStyle, Color color, int fontSize, int width, int height) {
  115. // 计算文字开始的位置
  116. // x开始的位置:(图片宽度-字体大小*字的个数)/2
  117. int startX = (width-(fontSize*pressText.length()))/2;
  118. // y开始的位置:图片高度-(图片高度-图片宽度)/2
  119. int startY = height-(height-width)/2 + fontSize;
  120. try {
  121. File file = new File(targetImage);
  122. BufferedImage src = ImageIO.read(file);
  123. int imageW = src.getWidth(null);
  124. int imageH = src.getHeight(null);
  125. BufferedImage image = new BufferedImage(imageW, imageH, BufferedImage.TYPE_INT_RGB);
  126. Graphics g = image.createGraphics();
  127. g.drawImage(src, 0, 0, imageW, imageH, null);
  128. g.setColor(color);
  129. g.setFont(new Font(null, fontStyle, fontSize));
  130. g.drawString(pressText, startX, startY);
  131. g.dispose();
  132. FileOutputStream out = new FileOutputStream(newImage);
  133. ImageIO.write(image, "png", out);
  134. out.close();
  135. } catch (Exception e) {
  136. e.printStackTrace();
  137. }
  138. }
  139. /**
  140. * 生成二维码
  141. * @param content
  142. * @param width
  143. * @param height
  144. * @param logoPath logo的文件路径
  145. * @reduceWhiteArea 减少二维码图片周边的白色区域,默认0,可以慢慢根据width,height进行调整
  146. * @return
  147. * @throws IOException
  148. * @throws WriterException
  149. */
  150. public static BufferedImage createQrCode(String content,int width,int height,String logoPath,int reduceWhiteArea) throws IOException, WriterException{
  151. BitMatrix bitMatrix = setBitMatrix(content, width, height);
  152. BufferedImage image = toBufferedImage(bitMatrix,reduceWhiteArea);
  153. if(StringUtils.isNotBlank(logoPath)){
  154. // 加入LOGO水印效果
  155. if (StringUtils.isNotBlank(logoPath)) {
  156. image = addLogo(image, logoPath);
  157. }
  158. }
  159. return image;
  160. }
  161. public static void main(String[] args) throws WriterException {
  162. // String content = "http://www.baidu.com";
  163. String content = "测试二维码";
  164. String logoPath = null;
  165. String format = "jpg";
  166. int width = 200;
  167. int height = 200;
  168. BitMatrix bitMatrix = setBitMatrix(content, width, height);
  169. // 可通过输出流输出到页面,也可直接保存到文件
  170. OutputStream outStream = null;
  171. String path = "e:/qr"+new Date().getTime()+".png";
  172. try {
  173. outStream = new FileOutputStream(new File(path));
  174. writeToFile(bitMatrix, format, outStream, logoPath,10);
  175. outStream.close();
  176. } catch (Exception e) {
  177. e.printStackTrace();
  178. }
  179. }
  180. }
 ​​​​​​​   

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/604397
推荐阅读
相关标签
  

闽ICP备14008679号