ZXing(google)生成&读取二维码内容 很简单的demo。google的ZXing易用性很高,虽然暂时项目中还没有用到,但学以备用。

主要示例代码

  1. /**
  2. * @Description
  3. * @company ND Co., Ltd
  4. * @author zys(910204)
  5. * @date 2017年3月10日 下午3:29:37
  6. */
  7. public class QRCode {
  8. private static final int BLACK = 0xFF000000;
  9. private static final int WHITE = 0xFFFFFFFF;
  10. private static final int MARGIN = 1; // 边框
  11. private static final String FORMAT = "png";
  12. private static final String TEXT = "二维码测试";
  13. public static void main(String[] args) throws WriterException, IOException {
  14. System.out.println(Charsets.UTF_8.name());
  15. BitMatrix bitMatrix = createRqCodeMatrix(TEXT, 300, 300);
  16. Path filePath = new File("F:/matrix/qrCode.png").toPath();
  17. MatrixToImageWriter.writeToPath(bitMatrix, FORMAT, filePath);
  18. BufferedImage bufferedImage = createRqCodeImage(TEXT, 800, 800);
  19. applyLogo(bufferedImage);
  20. ImageIO.write(bufferedImage, "png", new File("F:/matrix/qrCode2.png"));
  21. }
  22. /**
  23. *
  24. * @Description 生成二维码比特模型
  25. * @company ND Co., Ltd
  26. * @author zys(910204)
  27. * @date 2017年3月10日 下午3:56:25
  28. * @param content 文本内容
  29. * @param width 宽
  30. * @param height 高
  31. * @return
  32. * @throws WriterException
  33. */
  34. public static BitMatrix createRqCodeMatrix(String content, int width, int height) throws WriterException {
  35. // 生成二维码的配置项
  36. Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
  37. // 容错等级,越高则可存储的内容越少(容错等级即是二维码在部分缺失的情况下其储存数据的可恢复性)
  38. // 通常使用M等级
  39. hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
  40. // 内容所使用字符集编码
  41. hints.put(EncodeHintType.CHARACTER_SET, Charsets.UTF_8.name());
  42. // 生成的二维码图片外框边距
  43. hints.put(EncodeHintType.MARGIN, new Integer(MARGIN));
  44. BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
  45. return bitMatrix;
  46. }
  47. /**
  48. *
  49. * @Description 生成二维码图片
  50. * @company ND Co., Ltd
  51. * @author zys(910204)
  52. * @date 2017年3月10日 下午3:56:25
  53. * @param content 文本内容
  54. * @param width 宽
  55. * @param height 高
  56. * @return
  57. * @throws WriterException
  58. */
  59. public static BufferedImage createRqCodeImage(String content, int width, int height) throws WriterException {
  60. // 生成二维码的配置项
  61. Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
  62. // 内容所使用字符集编码
  63. hints.put(EncodeHintType.CHARACTER_SET, Charsets.UTF_8.name());
  64. // 通常使用M等级
  65. hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  66. // 生成的二维码图片外框边距
  67. hints.put(EncodeHintType.MARGIN, new Integer(MARGIN));
  68. BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
  69. // 通过二维码的比特模型生成image
  70. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  71. for (int x = 0; x < width; x++) {
  72. for (int y = 0; y < height; y++) {
  73. image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
  74. }
  75. }
  76. return image;
  77. }
  78. /**
  79. *
  80. * @Description 向二维码中间空白处绘制Logo
  81. * @company ND Co., Ltd
  82. * @author zys(910204)
  83. * @date 2017年3月10日 下午3:56:46
  84. * @param image
  85. * @throws IOException
  86. */
  87. public static void applyLogo(BufferedImage image) throws IOException {
  88. Graphics2D gs = image.createGraphics();
  89. ClassPathResource resource = new ClassPathResource("logo.png");// logo图片
  90. // 载入logo
  91. Image img = ImageIO.read(resource.getFile());
  92. int left = image.getWidth() / 2 - img.getWidth(null) / 2;
  93. int top = image.getHeight() / 2 - img.getHeight(null) / 2;
  94. gs.drawImage(img, left, top, null);
  95. gs.dispose();
  96. img.flush();
  97. }
  98. /**
  99. *
  100. * @Description 读取二维码文本
  101. * @company ND Co., Ltd
  102. * @author zys(910204)
  103. * @date 2017年3月10日 下午4:23:07
  104. * @param inputFile
  105. * @return
  106. * @throws NotFoundException
  107. * @throws IOException
  108. */
  109. public static String readQrCode(File inputFile) throws NotFoundException, IOException {
  110. MultiFormatReader formatReader = new MultiFormatReader();
  111. BufferedImage image = ImageIO.read(inputFile);
  112. // 这里的转换需要注意下
  113. BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
  114. // 读取二维码的配置项
  115. Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
  116. // 内容所使用字符集编码
  117. hints.put(DecodeHintType.CHARACTER_SET, Charsets.UTF_8.name());
  118. Result result = formatReader.decode(bitmap, hints);
  119. return result.getText();
  120. }
  121. }

Maven依赖

MVN Repository 链接

  1. <dependency>
  2. <groupId>com.google.zxing</groupId>
  3. <artifactId>core</artifactId>
  4. <version>3.3.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.google.zxing</groupId>
  8. <artifactId>javase</artifactId>
  9. <version>3.3.0</version>
  10. </dependency>