Java实现二维码、条形码等功能

青旅半醒 2024-03-27 11:13 229阅读 0赞

目录

一、Zxing介绍

二、关键类及方法说明

三、完整代码演示

3.1 导入依赖

3.2 代码示例

3.3 运行测试

3.4 测试Springboot生成二维码并回显到页面上

3.5 如果希望用html页面的方式展示再写页面即可


一、Zxing介绍

ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。

二、关键类及方法说明

Zxing将生成图形编码的方式抽象成了一个类com.google.zxing.Writer, 在实现类中不仅仅生成二维码,还可以生成条形码等其他图形编码。

我们实际开发中,可以选择Writer类的实现类MultiFormatWriter。

7ee786ba206d49a78c07733b9a5281e3.png

参数




























参数 说明
String contents 编码的内容
BarcodeFormat format 编码的方式(二维码、条形码…)
int width 生成的码的宽度
int height 生成的码的高度
Map<EncodeHintType,?> hints 编码时额外的参数

额外参数说明

编码额外的参数是以一个Map<EncodeHintType, ?>存在的,key为EncodeHintType枚举,那么可以看到所有的参数类型。












































参数 说明
ERROR_CORRECTION 容错率,指定容错等级,例如二维码中使用的ErrorCorrectionLevel, Aztec使用Integer
CHARACTER_SET 编码集
DATA_MATRIX_SHAPE 指定生成的数据矩阵的形状,类型为SymbolShapeHint
MARGIN 生成条码的时候使用,指定边距,单位像素,受格式的影响。类型Integer, 或String代表的数字类型
PDF417_COMPACT 指定是否使用PDF417紧凑模式(具体含义不懂)类型Boolean
PDF417_COMPACTION 指定PDF417的紧凑类型
PDF417_DIMENSIONS 指定PDF417的最大最小行列数
AZTEC_LAYERS aztec编码相关,不理解
QR_VERSION 指定二维码版本,版本越高越复杂,反而不容易解析

从上面的参数表格可以看出,适用于二维码的有:ERROR_CORRECTION, CHARACTER_SET, MARGIN, QR_VERSION。
























参数 使用说明
ERROR_CORRECTION 分为四个等级:L/M/Q/H, 等级越高,容错率越高,识别速度降低。例如一个角被损坏,容错率高的也许能够识别出来。通常为H
CHARACTER_SET 编码集,通常有中文,设置为 utf-8
MARGIN 默认为4, 实际效果并不是填写的值,一般默认值就行
QR_VERSION 通常不变,设置越高,反而不好用

代码演示

下面是最简化的生成二维码的代码:

  1. /**
  2. * 生成二维码
  3. *
  4. * @param contents 二维码内容
  5. * @return 二维码的描述对象 BitMatrix
  6. * @throws WriterException 编码时出错
  7. */
  8. private BitMatrix encode(String contents) throws WriterException {
  9. final Map<EncodeHintType, Object> hints = new HashMap<>();
  10. hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  11. hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
  12. return new QRCodeWriter().encode(contents, BarcodeFormat.QR_CODE, 320, 320, hints);
  13. }

没错,就是这么简单。但是我们得到的是一个BitMatrix, 如果需要显示出来则要根据不同平台来处理。

BitMatrix 转换成图片

首先明确Java SE平台和Android平台的区别:Android平台移除关于swing部分的代码,所以如果SE平台使用到这部分代码,Android平台则不能用,不幸的是,官方的代码恰恰用到了这部分。

明确另外一个概念:图片在一个平台的存在形式有两种,内存和文件。虽然文件在不同平台通用,但是转换成文件的过程却不是通用的。如Android中将Bitmap转换成图片文件,SE中将BufferedImage转换成图片文件。所以实际上,最重要的是将BitMatrix转换成在内存中图片的存在形式。

Java SE平台

BitMatrix转换成BufferedImage.

在官方提供的zxing-javase包中已经有了相应的方法。下面是示例代码:

  1. BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix, new MatrixToImageConfig(Color.BLACK.getRGB(), Color.WHITE.getRGB()));

其他就不过多介绍了,下面我们实际代码完整演示一遍。

三、完整代码演示

3.1 导入依赖

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

3.2 代码示例

  1. package com.pink.jucstudy.utils;
  2. import com.google.zxing.BarcodeFormat;
  3. import com.google.zxing.EncodeHintType;
  4. import com.google.zxing.MultiFormatWriter;
  5. import com.google.zxing.WriterException;
  6. import com.google.zxing.client.j2se.MatrixToImageWriter;
  7. import com.google.zxing.common.BitMatrix;
  8. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  9. import java.io.File;
  10. import java.io.IOException;
  11. import java.nio.file.Path;
  12. import java.util.HashMap;
  13. import java.util.Map;
  14. public class CodeX {
  15. /**
  16. * 1. 设置二维码的参数
  17. * 2. 生成二维码
  18. * 3. 将二维码导出
  19. */
  20. /**
  21. *
  22. * @param content 编码的内容
  23. * @param path 本地保存的路径
  24. * @return
  25. */
  26. public boolean createCode(String content,String path){
  27. // 1 设置基本参数
  28. int width = 300;
  29. int height = 300;
  30. String format = "png";//保存图片的格式,注意:不同平台可能有它的图片格式要求
  31. // 2 设置额外参数,一定要保存到map集合中
  32. Map map = new HashMap();
  33. // 2.1 设置容错率
  34. // 其中key键就是EncodeHintType.ERROR_CORRECTION
  35. // value值也是枚举类ErrorCorrectionLevel.M,可自行选择容错率等级l>M>Q>H
  36. // 当等级越高,扫描所需的时间越高,但是准确率越高。
  37. map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
  38. // 2.2 生成条码的时候使用,指定边距,单位像素
  39. map.put(EncodeHintType.MARGIN,2);
  40. // 2.3 设置字符集
  41. map.put(EncodeHintType.CHARACTER_SET,"utf-8");
  42. // 3 生成二维码
  43. // MultiFormatWriter继承了Writer
  44. // 通过该对象的encode方法即可生成二维码BitMatrix
  45. // 该方法形参分别对应了:
  46. // 第一个参数为编码的内容,
  47. // 第二个参数选择生成编码为二维码
  48. // 第三第四分别对应编码的宽度和高度
  49. // 第五个参数为对应的额外参数
  50. // 然后需要try、catch抛出异常
  51. try {
  52. BitMatrix encode = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, map);
  53. // 4 导出到本地
  54. File file = new File(path);
  55. Path path1 = file.toPath();
  56. System.out.println(path1);
  57. MatrixToImageWriter.writeToPath(encode,format,path1);
  58. return true;
  59. } catch (WriterException | IOException e) {
  60. e.printStackTrace();
  61. }
  62. return false;
  63. }
  64. public static void main(String[] args) {
  65. boolean code = new CodeX().createCode("夏至小姐姐,留个微信呗", "E:\\xx\\2.png");
  66. if (code){
  67. System.out.println("成功");
  68. }else {
  69. System.out.println("失败了");
  70. }
  71. }
  72. }

3.3 运行测试

21651ec4fa99422b977f3b7435e76527.png

a09bfeb8496b43229aca144ae1f4d941.png

3.4 测试Springboot生成二维码并回显到页面上

  1. @GetMapping("/qrcode")
  2. public void qrcodeTest(HttpServletResponse response) throws WriterException, IOException {
  3. ServletOutputStream outputStream = response.getOutputStream();
  4. int width = 300;
  5. int height =300;
  6. String format = "png";
  7. HashMap<EncodeHintType, Object> map = new HashMap<>();
  8. map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  9. map.put(EncodeHintType.CHARACTER_SET,"utf-8");
  10. String content = "今年是兔年,兔飞猛进!猪兔猛进!";
  11. BitMatrix encode = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, map);
  12. MatrixToImageWriter.writeToStream(encode,format,outputStream);
  13. System.out.println("成功!");
  14. }

4700c2230fea4031b8fccca666b79f2e.png

3.5 如果希望用html页面的方式展示再写页面即可

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport"
  6. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8. <title>首页</title>
  9. </head>
  10. <body>
  11. <h5>扫码获取信息</h5>
  12. <img src="/qrcode">
  13. </body>
  14. </html>

f82d5049ed9b4e4c9477351664a8277c.png

发表评论

表情:
评论列表 (有 0 条评论,229人围观)

还没有评论,来说两句吧...

相关阅读