Java 生成二维码解决方案

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;
}
相关推荐
苍何1 小时前
懂事的 Agent 已经开始自己看屏幕干活了,效率起飞!
后端
掘金码甲哥2 小时前
1分钟买不了吃亏系列: nginx动态域名解析
后端
神奇小汤圆2 小时前
2026大厂Java岗面试记录:八股+场景+项目+AI,一文讲透快速上岸路径(含答案)
后端
神奇小汤圆2 小时前
我说MySQL每张表最好不超过2000万条数据,面试官让我回去等通知?
后端
HuanYu2 小时前
JDK实现动态代理
后端
袋鱼不重2 小时前
解决 Web 端图片预览与下载颜色不一致的一种工程方案
前端·后端
lizhongxuan2 小时前
Agent 的 Code-driven Assembly
后端