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

目录

一、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。

参数

参数说明
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>

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
该工具为个人整理修改的常用工具类,maven结构,Java语言编写详细依赖间pom文件,如有冲突自行修改, 包括条形码操作工具、二维码操作、图片验证码工具、动态密码工具、雪花算法id工具、签名工具、poi导出、json转换、文件操作、分页、日期处理、jdbc、大数运算及格式化、gzip压缩、http 结构说明如下: datasourceconfig:多数据源使用配置包 对数据源配置.txt:配置说明文件 function:功能代码及工具类 delayqueue:java自带延迟对了使用包 DelayMsg:延迟消息实体 DelayMsgHandler:延迟消息处理工具 paramvalid:空参检查包 CommonUtil:空参检查工具类 ParamNotNull:参数注解 RegistParam:参数实体 RequestMsg:公共参数实体 pdf:pdf导出工具包,包含4个导出工具类,具体使用根据导出结果确定 websocket:服务端websockt配置包,比较简单,具体使用需自行扩充 ActiveMqUtil:ActiveMq操作工具类 BarCodeUtil:条形码操作工具类,包括生成和读取 CorsConfig:服务端防止跨域请求公共设置 DateUtil:时间处理工具类 DBConnection:jdbc工具类 FileOperater:文件处理工具类 包括 读取文本文件,写出文本文件, 大文件切分,文件下载,文件或文件夹比较,文件或文件夹遍历筛选 ...... HttpClientCard:http工具类 HttpUtil:http工具类 Identification:id生成工具类,包括 UUID luhn算法id(适用于有序的流水号码) ImgUtil:图片相似度计算工具 ItvJsonUtil:基于fastjson的json工具类 JsonUtility:基于jackjson的接送工具类 MailUtil:邮件工具类,包括发送纯文本邮件,带(1个/多个)附件的邮件, 群发邮件 NumberUtil:数字操作工具 包括精准数字运算,数据格式化 PageUtil:分页工具类, POIUtil:poi工具类,excel导出 QrCodeUtil:二维码操作工具, 包括生成和读取 ShellUtil:shell命令操作工具,包括linux登陆,命令执行...... 较为简单,具体需要自行扩充 SignUtil:签名工具,包括MD5 位运算 AES BASE64 SnowflakeIdWorker:ID生成工具 雪花算法 SocketUtil:socket测试工具 TotpAuthUtil:动态密码工具 包括生成和校验 VerifyCodeUtil:图片验证码生成工具 ZipUtils:gzip压缩工具
Java实现二维码识别需要使用第三方库,如zxing(Zebra Crossing),这是一个开源的条形码二维码处理库。 以下是使用zxing实现二维码识别的步骤: 1. 引入zxing库 在项目中引入zxing库,可以通过Maven或手动下载jar包的方式引入。 2. 读取二维码图片 使用Java的ImageIO类读取二维码图片,将其转换为BufferedImage对象。 ``` File file = new File("path/to/qrcode.png"); BufferedImage image = ImageIO.read(file); ``` 3. 解码二维码 使用zxing库的MultiFormatReader类解码二维码。 ``` MultiFormatReader reader = new MultiFormatReader(); Result result = reader.decode(new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)))); String qrCodeText = result.getText(); ``` 4. 获取二维码内容 解码成功后,可以通过getResult().getText()方法获取二维码内容。 完整代码示例: ``` import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.google.zxing.BinaryBitmap; import com.google.zxing.MultiFormatReader; import com.google.zxing.Result; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.common.HybridBinarizer; public class QRCodeReader { public static void main(String[] args) { try { File file = new File("path/to/qrcode.png"); BufferedImage image = ImageIO.read(file); MultiFormatReader reader = new MultiFormatReader(); Result result = reader.decode(new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)))); String qrCodeText = result.getText(); System.out.println("QR Code Text: " + qrCodeText); } catch (Exception e) { System.out.println("Error: " + e.getMessage()); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何苏三月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值