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;
}
相关推荐
东风破_7 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
微尘寒风7 小时前
【Git】的安装和使用
java·git
东风破_7 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
y = xⁿ7 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
东风破_8 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
侧耳倾听1118 小时前
jwt使用简介
java·jwt
顶点多余8 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI人工智能+电脑小能手9 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
jay神9 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
2601_962066499 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库