文章目录
前言
在数字化时代,二维码已经成为了信息交流的一种常见方式。它们被广泛用于各种应用,从产品标签到活动传单,以及电子支付。本文将向您展示如何在Spring Boot应用程序中整合ZXing库,以创建和解析QR码。无论您是想为您的产品添加QR码功能,还是为您的移动应用程序添加扫描功能,本文将为您提供一个清晰的指南。
1、介绍QR码和ZXing
QR码,全名Quick Response码,是一种二维码(2D barcode)的类型,最早由日本公司Denso Wave于1994年开发。它是一种能够存储各种数据类型的矩阵二维条码,通常以黑色模块和白色背景的方式呈现。QR码可以存储文本、URL、联系信息、地理位置等多种信息,因此在移动设备、广告传播、商品标识等领域广泛使用。
ZXing,全名为"Zebra Crossing",是一个开源的Java库,用于二维码的生成和解析。它是一个强大的工具,可以用于生成QR码以及解析包括QR码在内的多种二维码格式。ZXing提供了多种编程语言的API,使开发者能够轻松集成二维码功能到他们的应用中。它支持多种平台,包括Android、iOS、Java等。除了QR码,ZXing还支持解析其他一维码和二维码,例如EAN、UPC、DataMatrix等。
使用ZXing库,你可以轻松地将QR码功能集成到你的软件开发项目中,无论是生成QR码以供分享,还是解析QR码以获取其中的信息。在实际使用中,你可以添加注释来解释代码中的关键部分,以帮助其他开发者理解你的实现。这对于团队协作和维护代码非常有帮助。
2、整合zxing
2.1 pom添加ZXing依赖
<!-- 二维码 ZXing -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.1</version> <!-- 请使用最新版本 -->
</dependency>
请注意,上述示例中的version部分可以根据你的项目需要使用ZXing的特定版本。建议使用最新版本以获取最新的功能和改进。
2.2 生成二维码
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.qrcode.decoder.ErrorCorrectionLevel;
import lombok.extern.slf4j.Slf4j;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* 生成二维码工具类
*/
@Slf4j
public class CodeGeneratorUtil {
/**
* 生成QR码
*
* @param data 要存储在QR码中的数据,可以是文本、URL等
* @param width QR码的宽度(像素)
* @param height QR码的高度(像素)
* @param filePath 生成的QR码文件的保存路径
*/
public static void generateQrCode(String data, int width, int height, String filePath) {
try {
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符编码
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 错误纠正级别
hints.put(EncodeHintType.MARGIN, 1); // 二维码边距
MultiFormatWriter writer = new MultiFormatWriter();
BitMatrix bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, width, height, hints);
// 创建BufferedImage对象来表示QR码
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
}
}
// 将QR码保存到文件
File qrCodeFile = new File(filePath);
ImageIO.write(image, "png", qrCodeFile);
log.info("QR码已生成并保存到: {}", filePath);
} catch (Exception e) {
log.error("QR码生成失败:{}", e.getMessage());
}
}
}
在上面的代码中,generateQRCode方法接收四个参数:
-
data:要存储在QR码中的数据,可以是文本、URL等。
-
width:QR码的宽度(像素)。
-
height:QR码的高度(像素)。
-
filePath:生成的QR码文件的保存路径。
方法使用ZXing库的MultiFormatWriter来生成QR码,并将QR码保存到指定路径的文件中。确保根据你的需求修改这些参数以生成你想要的QR码。
2.3 生成条形码
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.qrcode.decoder.ErrorCorrectionLevel;
import lombok.extern.slf4j.Slf4j;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* 生成二维码工具类
*/
@Slf4j
public class CodeGeneratorUtil {
/**
* 生成QR码
*
* @param data 要存储在QR码中的数据,可以是文本、URL等
* @param width QR码的宽度(像素)
* @param height QR码的高度(像素)
* @param filePath 生成的QR码文件的保存路径
*/
public static void generateQrCode(String data, int width, int height, String filePath) {
try {
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符编码
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 错误纠正级别
hints.put(EncodeHintType.MARGIN, 1); // 二维码边距
MultiFormatWriter writer = new MultiFormatWriter();
BitMatrix bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, width, height, hints);
// 创建BufferedImage对象来表示QR码
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
}
}
// 将QR码保存到文件
File qrCodeFile = new File(filePath);
ImageIO.write(image, "png", qrCodeFile);
log.info("QR码已生成并保存到: {}", filePath);
} catch (Exception e) {
log.error("QR码生成失败:{}", e.getMessage());
}
}
/**
* 生成条形码
*
* @param data 要存储在条形码中的数据,可以是商品条形码等
* @param width 条形码的宽度(像素)
* @param height 条形码的高度(像素)
* @param filePath 生成的条形码文件的保存路径
*/
public static void generateBarCode(String data, int width, int height, String filePath) {
try {
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符编码
MultiFormatWriter writer = new MultiFormatWriter();
BitMatrix bitMatrix = writer.encode(data, BarcodeFormat.CODE_128, width, height, hints);
// 创建BufferedImage对象来表示条形码
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? 0 : 0xFFFFFF); // 生成黑色条和白色背景的条形码
}
}
// 检查图片是否存在,若不存在则创建
File barcodeFile = new File(filePath);
// 将条形码写入
ImageIO.write(image, "png", barcodeFile);
log.info("条形码已生成并保存到: {}", filePath);
} catch (Exception e) {
log.error("条形码生成失败:{}", e.getMessage());
}
}
}
2.4 测试结果
写一个测试的main方法:
public static void main(String[] args) {
String data = "Hello World";// 内容
int width1 = 150;// QR码宽度
int height1 = 150;// QR码高度
String filePath1 = "C:\\Users\\admin\\Desktop\\QR码.png";// QR码存放路径
int width2 = 500;// 条形码宽度
int height2 = 100;// 条形码高度
String filePath2 = "C:\\Users\\admin\\Desktop\\条形码.png";// 条形码存放路径
generateQrCode(data, width1, height1, filePath1);
generateBarCode(data, width2, height2, filePath2);
}
生成成功,且都可以扫码识别哦!
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。