java 生成二维码
文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、二维码生成示例
这里是一个完整的示例代码,用于生成带有自定义背景图片的二维码并将其转换为Base64编码的字符串
二、使用步骤
1.引入Maven库
代码如下(示例):
<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>
2.二维码不带背景图片示例
代码如下(示例):
import com.google.zxing.BarcodeFormat; // 导入条码格式类
import com.google.zxing.EncodeHintType; // 导入编码提示类型类
import com.google.zxing.WriterException; // 导入写入异常类
import com.google.zxing.qrcode.QRCodeWriter; // 导入二维码写入器类
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; // 导入错误纠正级别类
import com.google.zxing.common.BitMatrix; // 导入位矩阵类
import javax.imageio.ImageIO; // 导入图像 I/O 类
import java.awt.Graphics2D; // 导入 2D 图形类
import java.awt.image.BufferedImage; // 导入缓冲图像类
import java.io.ByteArrayOutputStream; // 导入字节数组输出流类
import java.io.IOException; // 导入 IO 异常类
import java.util.Base64; // 导入 Base64 编码类
import java.util.EnumMap; // 导入枚举映射类
import java.util.Map; // 导入映射接口
public class QRCodeGenerator {
// 生成二维码并转换为 Base64 字符串的方法
public static String generateQRCodeToBase64(String text, int width, int height) throws WriterException, IOException {
// 创建一个枚举映射,用于存储二维码的配置信息
Map<EncodeHintType, Object> hintMap = new EnumMap<>(EncodeHintType.class);
// 设置错误纠正级别为低
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
// 创建一个二维码写入器实例
QRCodeWriter qrCodeWriter = new QRCodeWriter();
// 使用写入器将文本编码为位矩阵,指定宽度、高度和提示信息
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hintMap);
// 将位矩阵转换为缓冲图像
BufferedImage bufferedImage = matrixToBufferedImage(bitMatrix);
// 创建一个字节数组输出流,用于存储图像数据
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 将缓冲图像写入字节数组输出流,格式为 PNG
ImageIO.write(bufferedImage, "png", outputStream);
// 将字节数组输出流转换为字节数组
byte[] qrCodeBytes = outputStream.toByteArray();
// 将字节数组编码为 Base64 字符串
return Base64.getEncoder().encodeToString(qrCodeBytes);
}
// 将位矩阵转换为缓冲图像的方法
private static BufferedImage matrixToBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth(); // 获取位矩阵的宽度
int height = matrix.getHeight(); // 获取位矩阵的高度
// 创建一个缓冲图像,类型为 RGB
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图像的 2D 图形上下文
Graphics2D graphics = image.createGraphics();
// 设置背景颜色为白色并填充整个图像
graphics.setColor(java.awt.Color.WHITE);
graphics.fillRect(0, 0, width, height);
// 设置前景颜色为黑色
graphics.setColor(java.awt.Color.BLACK);
// 遍历位矩阵的每个像素
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
// 如果位矩阵在当前位置为真,则填充一个黑色像素点
if (matrix.get(x, y)) {
graphics.fillRect(x, y, 1, 1);
}
}
}
graphics.dispose(); // 释放图形上下文
return image; // 返回生成的缓冲图像
}
public static void main(String[] args) {
String text = "https://www.example.com"; // 设置要编码的文本
int width = 300; // 设置二维码的宽度
int height = 300; // 设置二维码的高度
try {
// 调用生成二维码的方法,并获取 Base64 编码的字符串
String base64QRCode = generateQRCodeToBase64(text, width, height);
System.out.println(base64QRCode); // 输出 Base64 编码的字符串
} catch (Exception e) {
e.printStackTrace(); // 打印异常堆栈跟踪
}
}
}
3.二维码带背景图片示例
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.WriterException;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Base64;
import java.util.EnumMap;
import java.util.Map;
public class QRCodeGenerator {
public static void main(String[] args) {
try {
String text = "https://example.com";
int width = 300;
int height = 300;
// 生成带有自定义背景的二维码并转换为Base64
String qrCodeBase64 = generateQRCodeToBase64(text, width, height);
System.out.println("QR Code Base64: " + qrCodeBase64);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String generateQRCodeToBase64(String text, int width, int height) throws WriterException, IOException {
Map<EncodeHintType, Object> hintMap = new EnumMap<>(EncodeHintType.class);
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hintMap);
// 加载自定义背景图片
BufferedImage backgroundImage = ImageIO.read(new File("path/to/your/background/image.png"));
// 将背景图片缩放到与二维码相同的大小
BufferedImage scaledBackgroundImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = scaledBackgroundImage.createGraphics();
g.drawImage(backgroundImage, 0, 0, width, height, null);
g.dispose();
BufferedImage bufferedImage = matrixToBufferedImage(bitMatrix, scaledBackgroundImage);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", outputStream);
byte[] qrCodeBytes = outputStream.toByteArray();
return Base64.getEncoder().encodeToString(qrCodeBytes);
}
private static BufferedImage matrixToBufferedImage(BitMatrix matrix, BufferedImage backgroundImage) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
// 绘制背景图片
graphics.drawImage(backgroundImage, 0, 0, width, height, null);
// 绘制二维码
graphics.setColor(Color.BLACK);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
if (matrix.get(x, y)) {
graphics.fillRect(x, y, 1, 1);
}
}
}
graphics.dispose();
return image;
}
}
说明
依赖项:
确保在你的项目中包含了ZXing库的依赖,它提供了生成二维码的功能。
路径替换:
请将 “path/to/your/background/image.png” 替换为你自己的背景图片路径。
主要方法:
generateQRCodeToBase64 方法负责生成二维码并将其转换为Base64编码的字符串。
matrixToBufferedImage 方法负责将二维码数据绘制到自定义背景图片上。
作者:人要靠自己