1、导入ZXing包
1.1什么是ZXing
ZXing是一个开源的类库,是用Java编写的多格式的1D / 2D条码图像处理库,使用ZXing可以生成、识别QR Code(二维码)。常用的二维码处理库还有zbar,近几年已经不再更新代码,下边介绍ZXing生成二维码的方法。
1.2打开对应的对应pom文件把下面的坐标地址复制进去
引入依赖
<!-- 添加ZXing依赖 -->
<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>
2、创建生成二维码、海报二维码的工具类
创建二维码功能使用较多,我们一般把它生成为工具类放在公共模块中,方便其他模块进行调用。
2.1说明
2.1.1二维码在海报中的位置调整、如果只生成二维码请略过
//二维码在海报中的X坐标
int qrCodeX = 183; 该参数是调整二维码在海报中的左右位置
// 二维码在海报中的Y坐标
int qrCodeY = 533; 该参数是调整二维码在海报中的上下位置
2.1.2返回值说明
生成海报二维码的方法的返回值为Base64,如想返回二进制或其他请自己修改代码即可
生成普通二维码的方法的返回值为二进制图片,如想返回Base64,拿到二进制数据,在调用转Base64数据的方法即可
2.1.3二维码的白边宽度调整
调整二维码四周白边的宽度的方法:
在下面代码中的getDecodeHintTyp()方法中如下:
// 设置边距为1
hints.put(EncodeHintType.MARGIN, 0);
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
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.IOException;
import java.net.URL;
import java.util.Base64;
public class QRCodeUtil {
/*
* 获取海报二维码图片调用getPostQrCode(),默认返回Base64格式
* 只根据跳转链接生成二维码调用getQrCodeImag(),如果需要转换为base64拿到返回值后调用convertImageToBase64()
*/
public static void main(String[] args) throws WriterException {
// 海报图片链接
String posterImageLink = "海报二维码图片链接";
// 二维码链接
String qrCodeLink = "扫码生成的二维码之后的跳转地址";
// 二维码宽度
int qrCodeWidth = 190;
// 二维码高度
int qrCodeHeight = 190;
// 二维码在海报中的X坐标
int qrCodeX = 183;
// 二维码在海报中的Y坐标
int qrCodeY = 533;
BufferedImage qrCodeImage = getQrCodeImage(qrCodeLink, qrCodeWidth, qrCodeHeight);
String base64QrCode = convertImageToBase64(qrCodeImage);
System.out.println(base64QrCode);
}
/**
* 获取海报二维码图片
* @param posterImageLink 海报图片链接
* @param qrCodeLink 二维码跳转链接
* @param qrCodeWidth 二维码宽度
* @param qrCodeHeight 二维码高度
* @param qrCodeX 二维码在海报中的X坐标
* @param qrCodeY 二维码在海报中的Y坐标
* @return 海报二维码图片Base64字符串
*/
public static String getPostQrCode(String posterImageLink, String qrCodeLink, int qrCodeWidth, int qrCodeHeight, int qrCodeX, int qrCodeY) {
try {
// 下载海报图片
URL posterURL = new URL(posterImageLink);
BufferedImage posterImage = ImageIO.read(posterURL);
// 将海报图片转换为RGB色彩模式
posterImage = convertToRGB(posterImage);
BufferedImage qrCodeImage = getQrCodeImage(qrCodeLink, qrCodeWidth, qrCodeHeight);
// 将二维码嵌入到海报中
Graphics2D graphics = posterImage.createGraphics();
graphics.drawImage(qrCodeImage, qrCodeX, qrCodeY, null);
graphics.dispose();
// 将海报转换为Base64格式
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(posterImage, "jpg", outputStream);
byte[] posterData = outputStream.toByteArray();
String base64Poster = Base64.getEncoder().encodeToString(posterData);
// 添加Base64前缀
base64Poster = "data:image/jpeg;base64," + base64Poster;
// 输出Base64格式的海报图片
return base64Poster;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 根据跳转链接获取二维码图片
* @param qrCodeLink 二维码跳转链接
* @param qrCodeWidth 二维码宽度
* @param qrCodeHeight 二维码高度
* @return 二维码图片
*/
public static BufferedImage getQrCodeImage(String qrCodeLink, int qrCodeWidth, int qrCodeHeight) throws WriterException {
// 生成二维码
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
// 设置二维码参数
BitMatrix bitMatrix = multiFormatWriter.encode(qrCodeLink, BarcodeFormat.QR_CODE, qrCodeWidth, qrCodeHeight,
getDecodeHintType());
BufferedImage qrCodeImage = toBufferedImage(bitMatrix);
// 将二维码图片转换为RGB色彩模式
qrCodeImage = convertToRGB(qrCodeImage);
return qrCodeImage;
}
// 获取二维码的编码参数
private static java.util.Map<EncodeHintType, Object> getDecodeHintType() {
java.util.Map<EncodeHintType, Object> hints = new java.util.HashMap<>();
// 设置字符集
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
// 设置容错级别为高
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 设置边距为1
hints.put(EncodeHintType.MARGIN, 0);
return hints;
}
// 将BitMatrix转换为BufferedImage
private static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
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, matrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
}
}
return image;
}
// 将图片转换为RGB色彩模式
private static BufferedImage convertToRGB(BufferedImage image) {
BufferedImage rgbImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = rgbImage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
return rgbImage;
}
/**
* 将图片转换为Base64字符串
* @param image BufferedImage
* @return Base64字符串
*/
public static String convertImageToBase64(BufferedImage image){
try {
// 1. 将BufferedImage写入ByteArrayOutputStream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos); // 可以选择其他格式,如"jpg"
byte[] imageBytes = baos.toByteArray();
// 2. 将字节数组编码为Base64字符串
return "data:image/png;base64," + Base64.getEncoder().encodeToString(imageBytes);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}