目录
- 前言
- 1. 基本知识
- 2. ZXing
- 3. QRCode
前言
对于Java的基本知识推荐阅读:
- java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
- 【Java项目】实战CRUD的功能整理(持续更新)
1. 基本知识
生成二维码在Java中有多种方法,常用的是通过第三方库来实现,比较流行的库包括 ZXing (Zebra Crossing) 和 QRCode
ZXing库中的核心API
MultiFormatWriter.encode()
:生成二维码矩阵MatrixToImageWriter.writeToPath()
:将二维码矩阵保存为图片文件
QRCode库中的核心API
QRCode.from(content)
:从内容生成二维码withSize(width, height)
:设置二维码的尺寸file()
:生成二维码并保存为图片文件
ZXing库功能强大,适合生成复杂的二维码且提供了细粒度的控制
QRCode库使用简单,快速生成二维码,适合基础需求
二维码是一种将信息编码为二维图形的技术,常用于存储URL、文本、数字等信息。它由黑白模块组成,通常可以通过扫描来解码
生成二维码的过程主要分为两个步骤:
- 编码:将需要存储的信息(如URL、文本等)编码为二维码的黑白模块
- 绘制:根据编码信息绘制出二维码图像,通常可以保存为PNG、JPG等格式
使用ZXing生成二维码 ZXing是最常用的Java二维码生成库,支持多种格式(例如二维码、条形码)
其核心类包括:
MultiFormatWriter
:用于生成二维码的核心类BitMatrix
:二维码的矩阵表示,用于保存黑白模块的分布MatrixToImageWriter
:将二维码矩阵转化为图片
二维码的参数设置
- 宽度和高度:二维码图片的尺寸,通常是正方形
- 编码字符集:通常使用UTF-8编码,确保支持中文等特殊字符
- 错误纠正级别:二维码的容错能力,可以通过调整纠错级别提高二维码的鲁棒性
2. ZXing
依赖库配置(Maven项目)
在Maven项目中,需要在pom.xml中添加ZXing的依赖:
<dependencies><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version></dependency>
</dependencies>
Demo如下:
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Writer;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class QRCodeGenerator {public static void main(String[] args) {// 要编码的文本String data = "Hello, QR Code!";// 生成的二维码图片文件路径String filePath = "qrcode.png";try {// 调用生成二维码的方法generateQRCodeImage(data, 300, 300, filePath);System.out.println("二维码生成成功!");} catch (WriterException | IOException e) {e.printStackTrace();}}/*** 生成二维码图像并保存到文件** @param text 要编码的文本* @param width 图像宽度* @param height 图像高度* @param filePath 保存文件路径* @throws WriterException 生成二维码异常* @throws IOException IO异常*/private static void generateQRCodeImage(String text, int width, int height, String filePath)throws WriterException, IOException {// 创建 QRCodeWriter 实例QRCodeWriter qrCodeWriter = new QRCodeWriter();// 生成 BitMatrix,表示二维码的黑白矩阵BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);// 创建一个 BufferedImage,用于绘制图像BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);image.createGraphics();// 获取图形上下文Graphics2D graphics = (Graphics2D) image.getGraphics();// 设置背景色为白色graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, width, height);// 设置前景色为黑色graphics.setColor(Color.BLACK);// 在图像上绘制二维码的黑色矩阵for (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {if (bitMatrix.get(i, j)) {// 如果当前位置为黑色,填充一个像素graphics.fillRect(i, j, 1, 1);}}}// 将图像保存为 PNG 文件ImageIO.write(image, "png", new File(filePath));}
}
截图如下:
另外一个Demo:
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.client.j2se.MatrixToImageWriter;import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;public class QRCodeGenerator {/*** 生成二维码* @param content 二维码中包含的内容,如URL或文本* @param width 二维码的宽度* @param height 二维码的高度* @param filePath 保存二维码图片的路径* @throws Exception 可能抛出的异常*/public static void generateQRCode(String content, int width, int height, String filePath) throws Exception {// 定义二维码的参数Map<EncodeHintType, Object> hints = new HashMap<>();// 设置编码字符集hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 设置二维码的容错级别,较高容错级别适合损坏或部分覆盖的二维码hints.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H);// 生成二维码的BitMatrix(二维码的矩阵表示)BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);// 将二维码矩阵保存为图片文件Path path = Paths.get(filePath);MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);System.out.println("二维码已成功生成,保存路径: " + filePath);}public static void main(String[] args) {try {// 生成二维码的内容String content = "https://www.example.com";// 设置二维码的宽度和高度int width = 300;int height = 300;// 保存二维码图片的路径String filePath = "qr_code.png";// 调用生成二维码方法generateQRCode(content, width, height, filePath);} catch (Exception e) {e.printStackTrace();}}
}
3. QRCode
QRGen的xml依赖包
QRGen JavaSE » 3.0.1的xml依赖包
在Maven项目中,需要在pom.xml中添加QRCode的依赖:
<dependencies><dependency><groupId>net.glxn</groupId><artifactId>qrcode</artifactId><version>2.1</version></dependency>
</dependencies>
- 完整的代码示例
import net.glxn.qrgen.javase.QRCode;
import java.io.File;
import java.io.IOException;public class QRCodeDemo {/*** 生成二维码并保存为图片文件* @param content 二维码中包含的内容,如URL或文本* @param filePath 保存二维码图片的路径* @throws IOException 可能抛出的异常*/public static void generateQRCode(String content, String filePath) throws IOException {// 生成二维码并保存为PNG格式的图片File file = QRCode.from(content).withSize(250, 250).file();// 将生成的图片文件保存到指定路径file.renameTo(new File(filePath));System.out.println("二维码已成功生成,保存路径: " + filePath);}public static void main(String[] args) {try {// 生成二维码的内容String content = "https://www.example.com";// 保存二维码图片的路径String filePath = "qr_code_qrgen.png";// 调用生成二维码方法generateQRCode(content, filePath);} catch (IOException e) {e.printStackTrace();}}
}
QRCode 库实际上已经从 net.glxn.qrgen
包名更改为 com.github.kenglxn.qrgen
,并且托管在 GitHub 上
因此,需要在 Maven 的 pom.xml 中使用正确的依赖配置:
- 在Maven项目中配置依赖
<dependency><groupId>com.github.kenglxn.qrgen</groupId><artifactId>qrgen</artifactId><version>2.6.0</version>
</dependency>
- 更新后的QRCode生成Demo代码
以下是修正后的QRCode生成示例代码:
import com.github.kenglxn.qrgen.javase.QRCode;
import java.io.File;
import java.io.IOException;public class QRCodeDemo {/*** 生成二维码并保存为图片文件* @param content 二维码中包含的内容,如URL或文本* @param filePath 保存二维码图片的路径* @throws IOException 可能抛出的异常*/public static void generateQRCode(String content, String filePath) throws IOException {// 生成二维码并保存为PNG格式的图片File file = QRCode.from(content).withSize(250, 250).file();// 将生成的图片文件保存到指定路径file.renameTo(new File(filePath));System.out.println("二维码已成功生成,保存路径: " + filePath);}public static void main(String[] args) {try {// 生成二维码的内容String content = "https://www.example.com";// 保存二维码图片的路径String filePath = "qr_code_qrgen.png";// 调用生成二维码方法generateQRCode(content, filePath);} catch (IOException e) {e.printStackTrace();}}
}