Java实现二维码、条形码功能(案例代码)

 更新时间:2024年01月02日 09:48:58   作者:何苏三月  
ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口,Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码,这篇文章主要介绍了Java实现二维码、条形码等功能,需要的朋友可以参考下

一、Zxing介绍

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

二、关键类及方法说明

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

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

参数

参数说明
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_LAYERSaztec编码相关,不理解
QR_VERSION指定二维码版本,版本越高越复杂,反而不容易解析

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

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

代码演示

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

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

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

BitMatrix 转换成图片

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

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

Java SE平台

BitMatrix转换成BufferedImage.

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

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

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

三、完整代码演示

3.1 导入依赖

<!-- zxing生成二维码 -->
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.3.3</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.3.3</version>
</dependency>

3.2 代码示例

package com.pink.jucstudy.utils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
public class CodeX {
    /**
     * 1. 设置二维码的参数
     * 2. 生成二维码
     * 3. 将二维码导出
     */
    /**
     *
     * @param content 编码的内容
     * @param path 本地保存的路径
     * @return
     */
    public boolean createCode(String content,String path){
        // 1 设置基本参数
        int width = 300;
        int height = 300;
        String format = "png";//保存图片的格式,注意:不同平台可能有它的图片格式要求
        // 2 设置额外参数,一定要保存到map集合中
        Map map = new HashMap();
        // 2.1 设置容错率
        // 其中key键就是EncodeHintType.ERROR_CORRECTION
        // value值也是枚举类ErrorCorrectionLevel.M,可自行选择容错率等级l>M>Q>H
        // 当等级越高,扫描所需的时间越高,但是准确率越高。
        map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        // 2.2 生成条码的时候使用,指定边距,单位像素
        map.put(EncodeHintType.MARGIN,2);
        // 2.3 设置字符集
        map.put(EncodeHintType.CHARACTER_SET,"utf-8");
        // 3 生成二维码
        // MultiFormatWriter继承了Writer
        // 通过该对象的encode方法即可生成二维码BitMatrix
        // 该方法形参分别对应了:
        // 第一个参数为编码的内容,
        // 第二个参数选择生成编码为二维码
        // 第三第四分别对应编码的宽度和高度
        // 第五个参数为对应的额外参数
        // 然后需要try、catch抛出异常
        try {
            BitMatrix encode = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, map);
            // 4 导出到本地
            File file = new File(path);
            Path path1 = file.toPath();
            System.out.println(path1);
            MatrixToImageWriter.writeToPath(encode,format,path1);
            return true;
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        }
        return false;
    }
    public static void main(String[] args) {
        boolean code = new CodeX().createCode("夏至小姐姐,留个微信呗", "E:\\xx\\2.png");
        if (code){
            System.out.println("成功");
        }else {
            System.out.println("失败了");
        }
    }
}

3.3 运行测试

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

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

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

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>首页</title>
</head>
<body>
    <h5>扫码获取信息</h5>
    <img src="/qrcode">
</body>
</html>

到此这篇关于Java实现二维码、条形码等功能的文章就介绍到这了,更多相关java二维码条形码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 引用传递的三种类型小结

    java 引用传递的三种类型小结

    这篇文章主要介绍了java 引用传递的三种类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java实现邮件发送QQ邮箱带附件

    Java实现邮件发送QQ邮箱带附件

    这篇文章主要为大家详细介绍了Java实现邮件发送QQ邮箱带附件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 利用Spring JPA中的@Version注解实现乐观锁

    利用Spring JPA中的@Version注解实现乐观锁

    乐观锁是数据库和应用程序中使用的一种并发控制策略,用于在多个事务尝试更新单个记录时确保数据完整性,Java Persistence API (JPA) 提供了一种借助@Version注解在 Java 应用程序中实现乐观锁的机制,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2023-11-11
  • 如何基于JavaFX开发桌面程序

    如何基于JavaFX开发桌面程序

    这篇文章主要介绍了如何基于JavaFX开发桌面程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • mybatis调用mysql存储过程并获取返回值方式

    mybatis调用mysql存储过程并获取返回值方式

    这篇文章主要介绍了mybatis调用mysql存储过程并获取返回值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 解决nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题

    解决nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题

    这篇文章主要介绍了解决nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 浅析idea生成war包放入tomcat的路径访问问题

    浅析idea生成war包放入tomcat的路径访问问题

    这篇文章主要介绍了关于idea 生成war 包放入tomcat的路径访问问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Autowired的注入过程源码解析

    Autowired的注入过程源码解析

    这篇文章主要为大家介绍了Autowired的注入过程源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 浅谈springboot的三种启动方式

    浅谈springboot的三种启动方式

    这篇文章主要介绍了浅谈springboot的三种启动方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Java中的函数式编程

    Java中的函数式编程

    这篇文章介绍Java中的函数式编程,函数式编程是一种编程范式,其中程序是通过应用和组合函数来构造的。它是一种声明式编程范式,其中函数定义是表达式树,每个表达式树返回一个值,而不是一系列改变程序状态的命令语句,具体情况请看下文,希望对你有所帮助
    2021-10-10

最新评论