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;
}
相关推荐
2301_7807896610 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
学长毕设11 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
滴滴答答哒11 小时前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
步行cgn11 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川11 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵11 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David12 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas10012 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin13 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质13 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring