xml
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.3</version>
</dependency>
生成一个带颜色的图片
- 参数一:可以是网址或者文本信息
- 参数二:图片尺寸
java
public static BufferedImage generate(String content, int size) {
// 创建参数容器
Map<EncodeHintType, Object> hints = new HashMap<>();
// 设置容错等级(允许 logo 覆盖),就是高,扫一半也可以扫出来
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 设置白边(0 = 无白边)
hints.put(EncodeHintType.MARGIN, 0);
// ZXing 的编码器工厂
// 参数一:内容,参数二:生成的类型是二维码
// 参数三和四:宽高,参数五:规则配置。
BitMatrix matrix;
try {
matrix = new MultiFormatWriter().encode(
content, BarcodeFormat.QR_CODE, size, size, hints
);
} catch (WriterException e) {
throw new RuntimeException(e);
}
int width = matrix.getWidth();
int height = matrix.getHeight();
// 创建图片画布,参数三是:带颜色的画布RGB
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) ? 0x000000 : 0xFFFFFF);
}
}
return image;
}
增加logo
java
public static BufferedImage addLogo(BufferedImage qr, String logoPath) throws Exception {
// 读取 logo 图片
BufferedImage logo = ImageIO.read(new File(logoPath));
// 根据二维码大小,动态计算 logo 要占多少空间
int qrSize = qr.getWidth();
// 除以 5,logo 占二维码的 1/5
int logoSize = qrSize / 5;
// 1px像素边框
int border = 1;
int boxSize = logoSize + border * 2;
// 把原始 logo 压缩/缩放成 logoSize × logoSize 的图片
// 图片缩小 / 放大
// SCALE_SMOOTH = 平滑缩放、清晰、速度稍慢
Image scaledLogo = logo.getScaledInstance(
logoSize, logoSize,
Image.SCALE_SMOOTH);
// 开启高质量模式
// 绘画器
Graphics2D g = qr.createGraphics();
// KEY_ANTIALIASING = 抗锯齿
// VALUE_ANTIALIAS_ON = 开启
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// KEY_RENDERING = 渲染策略
// VALUE_RENDER_QUALITY = 高质量模式
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
// 把 logo 放到二维码正中间
int x = (qrSize - logoSize) / 2;
int y = (qrSize - logoSize) / 2;
// 1. 先画像素边框(矩形框)
g.setColor(Color.BLACK); // 你也可以换成品牌色
g.fillRect(x, y, boxSize, boxSize);
// 2. 再在中间画 logo(留1px边框)
g.drawImage(scaledLogo, x + border, y + border, null);
g.dispose();
return qr;
}