Java简单的生成/解析二维码(zxing qrcode)

专栏收录该内容

Hi I'm Shendi


在之前使用 qrcode.js 方式生成二维码,但在不同设备上难免会有一些兼容问题,于是改为后端(Java)生成二维码图片


这里使用 Google 的 zxing包



Jar包引入


Github:https://github.com/zxing/zxing


通过 Maven 引入

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.5.1</version>
</dependency>

也可以直接在 maven 仓库中下载 jar(javase和core两个)

例如阿里云maven仓库

https://developer.aliyun.com/mvn/search


阿里云maven仓库


或者微信搜一搜 “砷碲的学识仓库”,发送 "100001" 直接下载jar包




生成二维码

简单的三步就可以生成二维码

  1. 创建QRCodeWriter
  2. 创建二维码
  3. 输出二维码

例如将二维码输出到 H:/1.png,代码如下

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

/** @author Shendi */
public class Test {

	public static void main(String[] args) throws Exception {
		QRCodeWriter qcWrite = new QRCodeWriter();
		// encode函数的四个参数分别是 内容,格式,宽,高
		BitMatrix bm = qcWrite.encode("https://sdpro.top", BarcodeFormat.QR_CODE, 500, 500);
		// 输出到 H:/1.png, writeToPath有三个参数,(BitMatrix,格式,输出地址)
		MatrixToImageWriter.writeToPath(bm, "PNG", Path.of("H:/1.png"));
	}
	
}

代码运行后效果如下

二维码生成效果



如果要将二维码变成字节数组,可以使用MatrixToImageWriter的writeToStream,输出到流




二维码接口

例如传递一个字符串将此字符串变为二维码的形式输出(http),这里使用SpringBoot的形式写的接口,供直接复制使用,代码如下

/**
 * 生成二维码.
 * @param content	二维码内容
 * @param req		请求
 * @param resp		响应
 */
@GetMapping("/code")
public void create(String content, HttpServletRequest req, HttpServletResponse resp) {

    QRCodeWriter qcWrite = new QRCodeWriter();

    try {
        BitMatrix bm = qcWrite.encode(content, BarcodeFormat.QR_CODE, 500, 500);

        // 设置响应为图片数据
        resp.setContentType("image/png");

        MatrixToImageWriter.writeToStream(bm, "PNG", resp.getOutputStream());
    } catch (Exception e) {
        e.printStackTrace();
    }

}



解析二维码

通过 QRCodeReader 解析二维码,例如解析刚刚生成的二维码,代码如下

import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;

/** @author Shendi */
public class Test {

	public static void main(String[] args) throws Exception {
		QRCodeReader qcReader = new QRCodeReader();
		// 这里的ImageIO也可以read输入流
		BufferedImage img = ImageIO.read(new File("H:/1.png"));
		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(img)));
		Result result = qcReader.decode(bitmap);
		System.out.println("二维码内容: " + result.getText());
	}
	
}

运行效果如下

解析二维码结果




END

本文链接:https://sdpro.top/blog/html/article/1015.html

♥ 赞助 ♥

尽管去做,或许最终的结果不尽人意,但你不付出,他不付出,那怎会进步呢?