杰瑞科技汇

Java如何生成带logo的二维码?

Java生成带Logo的二维码

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

Java如何生成带logo的二维码?-图1
(图片来源网络,侵删)

添加依赖

在你的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();
        }
    }
}

代码说明

  1. 二维码生成

    • 使用QRCodeWriter生成二维码矩阵
    • 设置错误纠正级别为H(最高)
    • 设置字符编码为UTF-8
  2. Logo处理

    • 读取Logo图片
    • 将Logo压缩为二维码大小的1/5
    • 将Logo绘制在二维码中心位置
  3. 美化处理

    Java如何生成带logo的二维码?-图2
    (图片来源网络,侵删)

    为Logo添加白色圆角边框,提高识别率

  4. 保存结果

    将最终生成的二维码图片保存到指定路径

注意事项

  1. Logo图片不宜过大,建议不超过二维码面积的1/5
  2. Logo图片最好是正方形,否则会影响二维码识别
  3. 不宜过长,否则会降低识别率
  4. 确保Logo与二维码背景有足够的对比度

替代方案

如果你不想使用ZXing,也可以考虑其他库如:

Java如何生成带logo的二维码?-图3
(图片来源网络,侵删)
  • QRGen:基于ZXing的简化封装
  • Bouncy Castle:提供更多加密相关的二维码功能

希望这个实现对你有帮助!如果有任何问题或需要进一步定制,请随时提问。

分享:
扫描分享到社交APP
上一篇
下一篇