• zxing实现java二维码生成和解析


    转自:https://blog.csdn.net/javaweiming/article/details/72844581

    生成二维码的方式有很多,在此简单介绍Google的zxing使用

    先加载需要用到的包,pom.xml文件里面添加:

    1. <!-- 二维码生成 -->
    2. <dependency>
    3. <groupId>com.google.zxing</groupId>
    4. <artifactId>core</artifactId>
    5. <version>2.2</version>
    6. </dependency>
    7.  
    8. <dependency>
    9. <groupId>com.google.zxing</groupId>
    10. <artifactId>javase</artifactId>
    11. <version>2.2</version>
    12. </dependency>


    工具类代码

    1. import java.awt.image.BufferedImage;
    2. import java.io.File;
    3. import java.io.IOException;
    4. import java.nio.file.FileSystems;
    5. import java.nio.file.Path;
    6. import java.util.HashMap;
    7. import java.util.Map;
    8.  
    9. import javax.imageio.ImageIO;
    10.  
    11. import com.google.zxing.BarcodeFormat;
    12. import com.google.zxing.Binarizer;
    13. import com.google.zxing.BinaryBitmap;
    14. import com.google.zxing.DecodeHintType;
    15. import com.google.zxing.EncodeHintType;
    16. import com.google.zxing.LuminanceSource;
    17. import com.google.zxing.MultiFormatReader;
    18. import com.google.zxing.MultiFormatWriter;
    19. import com.google.zxing.NotFoundException;
    20. import com.google.zxing.Result;
    21. import com.google.zxing.WriterException;
    22. import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    23. import com.google.zxing.client.j2se.MatrixToImageWriter;
    24. import com.google.zxing.common.BitMatrix;
    25. import com.google.zxing.common.HybridBinarizer;
    26. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    27.  
    28. import net.sf.json.JSONObject;
    29.  
    30. /**
    31. *
    32. * 处理图片url
    33. */
    34. public class QRCodeUtil {
    35.  
    36. public static void main(String[] args) throws WriterException, IOException {
    37. testEncode();
    38. testDecode();
    39. }
    40.  
    41. /**
    42. * 生成图像
    43. *
    44. * @throws WriterException
    45. * @throws IOException
    46. */
    47. public static void testEncode() throws WriterException, IOException {
    48. String filePath = "D://";
    49. String fileName = "text.png";
    50. JSONObject json = new JSONObject();
    51. json.put("url", "https://www.baidu.com");
    52. json.put("author", "zwm");
    53. String content = json.toString();// 内容
    54. int width = 200; // 图像宽度
    55. int height = 200; // 图像高度
    56. String format = "png";// 图像类型
    57. Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
    58. hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    59. BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);// 生成矩阵
    60. Path path = FileSystems.getDefault().getPath(filePath, fileName);
    61. File file = new File(filePath + fileName);
    62. MatrixToImageWriter.writeToFile(bitMatrix, format, file);// 输出图像
    63. System.out.println("图片文件已经生成.请于D盘查找");
    64. }
    65.  
    66. /**
    67. * 解析图像
    68. */
    69. public static void testDecode() {
    70. String filePath = "D://text.png";
    71. BufferedImage image;
    72. try {
    73. image = ImageIO.read(new File(filePath));
    74. LuminanceSource source = new BufferedImageLuminanceSource(image);
    75. Binarizer binarizer = new HybridBinarizer(source);
    76. BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
    77. Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
    78. hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
    79. Result result = new MultiFormatReader().decode(binaryBitmap, hints);// 对图像进行解码
    80. JSONObject content = JSONObject.fromObject(result.getText());
    81. System.out.println("图片中内容: ");
    82. System.out.println("author:" + content.getString("author"));
    83. System.out.println("url: " + content.getString("url"));
    84. System.out.println("图片中格式: ");
    85. System.out.println("encode: " + result.getBarcodeFormat());
    86. } catch (IOException e) {
    87. e.printStackTrace();
    88. } catch (NotFoundException e) {
    89. e.printStackTrace();
    90. }
    91. }
    92.  
    93. public static BufferedImage createQRCode(final String url) throws WriterException, IOException {
    94. BufferedImage image = null;
    95. // 二维码图片输出流
    96. MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
    97. HashMap<EncodeHintType, Comparable> hints = new HashMap<EncodeHintType, Comparable>();
    98. // 设置编码方式
    99. hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    100. // 设置QR二维码的纠错级别(H为最高级别)具体级别信息
    101. hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
    102. BitMatrix bitMatrix = multiFormatWriter.encode(url, BarcodeFormat.QR_CODE, 400, 400, hints);
    103. bitMatrix = updateBit(bitMatrix, 10);
    104. image = MatrixToImageWriter.toBufferedImage(bitMatrix);
    105. return image;
    106. }
    107.  
    108. /**
    109. * 自定义白边边框宽度
    110. *
    111. * @param matrix
    112. * @param margin
    113. * @return
    114. */
    115. private static BitMatrix updateBit(final BitMatrix matrix, final int margin) {
    116. int tempM = margin * 2;
    117. // 获取二维码图案的属性
    118. int[] rec = matrix.getEnclosingRectangle();
    119. int resWidth = rec[2] + tempM;
    120. int resHeight = rec[3] + tempM;
    121. // 按照自定义边框生成新的BitMatrix
    122. BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
    123. resMatrix.clear();
    124. // 循环,将二维码图案绘制到新的bitMatrix中
    125. for (int i = margin; i < resWidth - margin; i++) {
    126. for (int j = margin; j < resHeight - margin; j++) {
    127. if (matrix.get(i - margin + rec[0], j - margin + rec[1])) {
    128. resMatrix.set(i, j);
    129. }
    130. }
    131. }
    132. return resMatrix;
    133. }
    134. }


    直接运行即可看到效果,其中 createQRCode是用于直接将生成的二维码以流的形式在页面上输出,调用方法如下:

    1. /**
    2. * 根据URL生成二维码
    3. * @param model
    4. * @param request
    5. * @param response
    6. * @throws MaHuaServiceHandleException
    7. */
    8. @RequestMapping("/getQRCode")
    9. public void getQRCode(final @RequestAttribute(ReqBean.NAME) ReqBean reqBean,HttpServletRequest request, HttpServletResponse response){
    10. String url = "http://www.baidu.com";
    11. //二维码图片输出流
    12. OutputStream out = null;
    13. try{
    14. response.setContentType("image/jpeg;charset=UTF-8");
    15. BufferedImage image = QRCodeUtil.createQRCode(url);
    16. //实例化输出流对象
    17. out = response.getOutputStream();
    18. //画图
    19. ImageIO.write(image, "png", response.getOutputStream());
    20. out.flush();
    21. out.close();
    22. }catch (Exception e){
    23. e.printStackTrace();
    24. }finally {
    25. try{
    26. if (null != response.getOutputStream()) {
    27. response.getOutputStream().close();
    28. }
    29. if (null != out) {
    30. out.close();
    31. }
    32. }catch(Exception e){
    33. e.printStackTrace();
    34. }
    35. }
    36. }


     在页面上调用此方法:

     <div style="height:100%;100%"><img style="100%" id="QRCode" src="./activity/getQRCode.do?" /></div>  


      这样生成的二维码则会再这个div的地方显示出来

  • 相关阅读:
    VSCode打开大文件插件
    https Java SSL Exception protocol_version
    Error creating bean with name 'tomcatEmbeddedServletContainerFactory ' (or a BeanPostProcessor involved) returned null
    在Java8的foreach()中不能break,如果需要continue时,可以使用return
    Spring cloud 超时及重试配置【ribbon及其它http client】
    祸害阿里云宕机 3 小时的 IO HANG 究竟是个什么鬼?!
    Convertion of grey code and binary 格雷码和二进制数之间的转换
    stringstream 使用方法
    [LeetCode] 91. Decode Ways 解码方法
    QString, string, int, char* 之间相互转换
  • 原文地址:https://www.cnblogs.com/yangsanluo/p/14282635.html
Copyright © 2020-2023  润新知