Java生成带Logo的二维码
在Java中生成带Logo的二维码可以使用ZXing库,这是一个常用的开源二维码生成库,以下是完整的实现步骤:

添加依赖
在你的Maven项目中添加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>
实现代码
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
public class QRCodeWithLogo {
/**
* 生成二维码
* @param content 二维码内容
* @param logoPath logo图片路径
* @param destPath 生成的二维码路径
* @param width 二维码宽度
* @param height 二维码高度
* @param format 图片格式
*/
public static void createQRCodeWithLogo(String content, String logoPath,
String destPath, int width, int height, String format) throws Exception {
// 生成二维码
Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
// 生成二维码图片
BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
// 添加Logo
BufferedImage logoImage = ImageIO.read(new File(logoPath));
// 计算Logo大小(二维码的1/5)
int logoWidth = qrImage.getWidth() / 5;
int logoHeight = qrImage.getHeight() / 5;
// 压缩Logo
Image logo = logoImage.getScaledInstance(logoWidth, logoHeight, Image.SCALE_SMOOTH);
// 计算Logo位置(居中)
int x = (qrImage.getWidth() - logoWidth) / 2;
int y = (qrImage.getHeight() - logoHeight) / 2;
// 绘制Logo
Graphics2D graphics = qrImage.createGraphics();
graphics.drawImage(logo, x, y, logoWidth, logoHeight, null);
// 添加白色边框
graphics.setColor(Color.WHITE);
graphics.setStroke(new BasicStroke(2));
graphics.draw(new RoundRectangle2D.Float(x, y, logoWidth, logoHeight, 10, 10));
graphics.dispose();
// 保存图片
ImageIO.write(qrImage, format, new File(destPath));
}
public static void main(String[] args) {
try {
String content = "https://www.example.com"; // 二维码内容
String logoPath = "logo.png"; // Logo图片路径
String destPath = "qrcode_with_logo.png"; // 生成的二维码路径
int width = 300; // 二维码宽度
int height = 300; // 二维码高度
String format = "png"; // 图片格式
createQRCodeWithLogo(content, logoPath, destPath, width, height, format);
System.out.println("二维码生成成功: " + destPath);
} catch (Exception e) {
e.printStackTrace();
}
}
}
代码说明
-
二维码生成:
- 使用
QRCodeWriter生成二维码矩阵 - 设置错误纠正级别为H(最高)
- 设置字符编码为UTF-8
- 使用
-
Logo处理:
- 读取Logo图片
- 将Logo压缩为二维码大小的1/5
- 将Logo绘制在二维码中心位置
-
美化处理:
(图片来源网络,侵删)为Logo添加白色圆角边框,提高识别率
-
保存结果:
将最终生成的二维码图片保存到指定路径
注意事项
- Logo图片不宜过大,建议不超过二维码面积的1/5
- Logo图片最好是正方形,否则会影响二维码识别
- 不宜过长,否则会降低识别率
- 确保Logo与二维码背景有足够的对比度
替代方案
如果你不想使用ZXing,也可以考虑其他库如:

- QRGen:基于ZXing的简化封装
- Bouncy Castle:提供更多加密相关的二维码功能
希望这个实现对你有帮助!如果有任何问题或需要进一步定制,请随时提问。
