Java程序员必看!如何用ZXing生成高颜值带Logo的智能二维码?

作者:佚名 时间:2025-11-16 07:24

字号

临时有效,常变化,内容是一个 token 或 URL

活动海报二维码

嵌入图片中,需高颜值,对清晰度有要求

带 logo 的二维码

中间加 logo 图标,用户更容易识别品牌

参数推广二维码

携带用户 ID、推广码等参数,可用于追踪来源

临时访客二维码

时间敏感,可能加密,甚至设定失效时间

简而言之,二维码不仅是一个图,还要“有脑子”

二、技术选型:选对工具,事半功倍

Java 世界,要生成二维码,主流有两个选择:

我选的是 ZXing + 自定义封装。

理由如下:

三、实战演示:Java 手把手教你生成各种二维码

1. 引入 Maven 依赖

<dependency>
  <groupId>com.google.zxinggroupId>
  <artifactId>coreartifactId>
  <version>3.5.2version>
dependency>
<dependency>
  <groupId>com.google.zxinggroupId>
  <artifactId>javaseartifactId>
  <version>3.5.2version>
dependency>

2. 封装一个二维码工具类 QrCodeUtils.java

package com.moyu.qr;
import com.google.zxing.*;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
/**
 * 天天摸鱼的 Java 工程师出品
 * 通用二维码生成工具类
 */
public class QrCodeUtils {
    /**
     * 生成普通二维码并保存为图片文件
     *
     * @param content  二维码内容
     * @param filePath 保存路径(绝对路径)
     * @param width    宽度
     * @param height   高度
     * @throws Exception
     */
    public static void generateSimpleQrCode(String content, String filePath, int width, int height) throws Exception {
        // 编码参数设置
        Map hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 编码类型
        hints.put(EncodeHintType.MARGIN, 1);              // 边距
        BitMatrix bitMatrix = new MultiFormatWriter().encode(
                content,
                BarcodeFormat.QR_CODE,
                width,
                height,
                hints
        );
        Path path = new File(filePath).toPath();
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
    }
    /**
     * 生成带 Logo 的二维码
     *
     * @param content   二维码内容
     * @param logoPath  logo 图片路径
     * @param outputPath 输出二维码路径
     */
    public static void generateQrCodeWithLogo(String content, String logoPath, String outputPath) throws Exception {
        int width = 300;
        int height = 300;
        Map hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        hints.put(EncodeHintType.MARGIN, 1);
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 容错率高,避免 logo 遮挡
        BitMatrix bitMatrix = new MultiFormatWriter().encode(
                content, BarcodeFormat.QR_CODE, width, height, hints
        );
        // 生成二维码图像
        BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix, new MatrixToImageConfig());
        // 加载 logo 图片
        BufferedImage logo = ImageIO.read(new File(logoPath));
        int logoWidth = qrImage.getWidth() / 5;
        int logoHeight = qrImage.getHeight() / 5;
        // 计算 logo 放置位置(居中)
        int x = (qrImage.getWidth() - logoWidth) / 2;
        int y = (qrImage.getHeight() - logoHeight) / 2;
        // 合并图片
        Graphics2D g = qrImage.createGraphics();
        g.drawImage(logo, x, y, logoWidth, logoHeight, null);
        g.dispose();
        ImageIO.write(qrImage, "PNG", new File(outputPath));
    }
}

3. 实战调用:生成一个带参数的推广码

public class Main {
    public static void main(String[] args) throws Exception {
        String content = "https://yourdomain.com/register?ref=userid_123456";
        String savePath = "D:/qrcode/promo.png";
        QrCodeUtils.generateSimpleQrCode(content, savePath, 300, 300);
        System.out.println("推广二维码生成成功,快去扫码看看!");
    }
}

4. 再来一个更骚的:带 Logo 的品牌码

public class LogoDemo {
    public static void main(String[] args) throws Exception {
        String content = "https://yourapp.com/share?id=abc123";
        String logo = "D:/logo/logo.png";
        String output = "D:/qrcode/share_with_logo.png";
        QrCodeUtils.generateQrCodeWithLogo(content, logo, output);
        System.out.println("带 Logo 的二维码已生成!");
    }
}

四、最佳实践 & 踩坑总结(摸鱼人血泪经验)

推荐做法:

踩过的坑:

五、后记:二维码虽小,五脏俱全

别看二维码只有黑白小格子,其背后能承载的业务逻辑、营销策略、用户行为追踪,可比你写的 if else 高级多了。

记住一句老话:

二维码是连接线下与线上最朴素、最强大的桥梁。

希望本文对你有帮助,不管你是刚入门的 Java 菜鸟,还是像我一样的 八年资深摸鱼工程师

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接