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;
}
相关推荐
yaoxin52112313 分钟前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员29 分钟前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus
FF2501_940228581 小时前
Grid 构建月历网格:7 列模板 + 日期占位算法
后端·华为·harmonyos·鸿蒙系统
神奇小汤圆1 小时前
线程池的 DiscardPolicy 为什么是「静默杀手」?一个生产事故的完整复盘
后端
大鸡腿同学1 小时前
个人博主 AI 剪辑实操:口播视频 3 步出片,省 80% 剪辑时间
后端
小钻风33661 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
其美杰布-富贵-李1 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端
xianjixiance_2 小时前
HarmonyOS应用开发实战:萌宠日记 - 整体架构设计与技术选型解析
后端
掘金者阿豪2 小时前
数据库优化器到底在想什么:一个SQL今天能跑明天崩的背后
后端
b130538100492 小时前
HarmonyOS应用开发实战:萌宠日记 - 回调函数模式
后端