Google zxing 生成带logo的二维码图片

news2024/11/26 12:14:55

环境准备

  • 开发环境

    • JDK 1.8
    • SpringBoot2.2.1
    • Maven 3.2+
  • 开发工具

    • IntelliJ IDEA
    • smartGit
    • Navicat15

添加maven配置

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.4.0</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.4.0</version>
</dependency>

创建比特矩阵

先创建比特矩阵,设置默认的宽度、高度、后缀名等等

 private static final String DEFAULT_CHAR_SET = "UTF-8";

private static final String DEFAULT_FORMAT_NAME = "JPG";


// 二维码宽度
private static final int DEFAULT_QR_CODE_WIDTH = 300;
// 二维码高度
private static final int DEFAULT_QR_CODE_HEIGHT = 300;

/**
 * 创建BitMatrix比特矩阵
 * @Date 2023/09/24 22:29
 * @Param contents 二维码里的内容
 * @Param width 二维码宽度
 * @param height 二维码高度
 * @return com.google.zxing.common.BitMatrix
 */
public static  BitMatrix createBitMatrix(String contents , int width , int height) throws WriterException, IOException {
    if (ObjectUtil.isNull(width)) {
        width = DEFAULT_QR_CODE_WIDTH;
    }
    if (ObjectUtil.isNull(height)) {
        height = DEFAULT_QR_CODE_HEIGHT;
    }

    Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 纠错等级L,M,Q,H
    hints.put(EncodeHintType.CHARACTER_SET, DEFAULT_CHAR_SET);// 编码utf-8
    hints.put(EncodeHintType.MARGIN, 1);  // 边距

    // 创建比特矩阵
    BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,
            BarcodeFormat.QR_CODE, width, height, hints);
    return bitMatrix;

}

转换为BufferedImage

创建好比特矩阵后,转换为BufferedImage

 /**
 * 转换为BufferedImage
 * @Date 2023/09/24 22:32
 * @Param [bitMatrix]
 * @return java.awt.image.BufferedImage
 */
public static BufferedImage toBufferedImage(BitMatrix bitMatrix) throws IOException, WriterException {
    MatrixToImageConfig matrixToImageConfig = new MatrixToImageConfig(0xFF000001, 0xFFFFFFFF);
    BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix, matrixToImageConfig);
    return bufferedImage;
}

加上二维码logo

给创建的二维码BufferedImage加上logo

 /**
 * 给二维码添加logo
  * @Date 2023/09/24 22:33
  * @Param [bufferedImage, logoFile]
  * @return java.awt.image.BufferedImage
  */
 public static BufferedImage addQrCodeLogo(BufferedImage bufferedImage, File logoFile) throws IOException {
     Graphics2D graphics = bufferedImage.createGraphics();
     int matrixWidth = bufferedImage.getWidth();
     int matrixHeigh = bufferedImage.getHeight();

     // 读取logo图片文件
     BufferedImage logo = ImageIO.read(logoFile);
     int logoWidth = logo.getWidth();
     int logoHeight = logo.getHeight();

     //  计算logo放置位置
     int x = bufferedImage.getWidth()  / 5*2;
     int y = bufferedImage.getHeight() / 5*2;
     int width = matrixWidth / 5;
     int height = matrixHeigh / 5;

     // 开始绘制图片
     graphics.drawImage(logo, x, y, width, height, null);
     graphics.drawRoundRect(x, y, logoWidth, logoHeight, 15, 15);
     graphics.setStroke(new BasicStroke(5.0F, 1, 1));
     graphics.setColor(Color.white);
     graphics.drawRect(x, y, logoWidth, logoHeight);

     graphics.dispose();
     bufferedImage.flush();
     return bufferedImage;
 }

测试

public static void main(String[] args) throws Exception {
     BufferedImage bufferedImage = toBufferedImage(createBitMatrix("https://blog.csdn.net", 300, 300));
     ImageIO.write(bufferedImage, "png", new File("D:/qrcode.jpg"));

     System.out.println(decodeQrCode(bufferedImage));

     BufferedImage logoQrCode = addQrCodeLogo(bufferedImage, new File("D://logo.png"));
     ImageIO.write(logoQrCode, "png", new File("D:/logoQrcode.jpg"));
 }

创建不带logo的二维码图片
在这里插入图片描述
创建带logo的二维码图片
在这里插入图片描述

附录

package com.example.common.util.qrcode;


import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;

public class QrCodeGenerator {


    private static final String DEFAULT_CHAR_SET = "UTF-8";

    private static final String DEFAULT_FORMAT_NAME = "JPG";


    // 二维码宽度
    private static final int DEFAULT_QR_CODE_WIDTH = 300;
    // 二维码高度
    private static final int DEFAULT_QR_CODE_HEIGHT = 300;

    /**
     * 创建BitMatrix比特矩阵
     * @Date 2023/09/24 22:29
     * @Param contents 二维码里的内容
     * @Param width 二维码宽度
     * @param height 二维码高度
     * @return com.google.zxing.common.BitMatrix
     */
    public static  BitMatrix createBitMatrix(String contents , int width , int height) throws WriterException, IOException {
        if (ObjectUtil.isNull(width)) {
            width = DEFAULT_QR_CODE_WIDTH;
        }
        if (ObjectUtil.isNull(height)) {
            height = DEFAULT_QR_CODE_HEIGHT;
        }

        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 纠错等级L,M,Q,H
        hints.put(EncodeHintType.CHARACTER_SET, DEFAULT_CHAR_SET);// 编码utf-8
        hints.put(EncodeHintType.MARGIN, 1);  // 边距

        // 创建比特矩阵
        BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,
                BarcodeFormat.QR_CODE, width, height, hints);
        return bitMatrix;

    }

    /**
     * 创建二维码,返回字节数组
     * @Date 2023/09/24 22:30
     * @Param contents 二维码里的内容
     * @Param imageFormat 图片后缀名
     * @Param width 二维码宽度
     * @param height 二维码高度
     * @return byte[]
     */
    public static byte[] createQrCode(String contents , String imageFormat , int width , int height) throws WriterException, IOException {
        if (StrUtil.isBlank(imageFormat)){
            imageFormat = DEFAULT_FORMAT_NAME;
        }
        BitMatrix bitMatrix = createBitMatrix(contents , width, height);
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, imageFormat, os);
        return os.toByteArray();
    }

    /**
     * 创建二维码,返回base64字符串
     * @Date 2023/09/24 22:30
     * @Param contents 二维码里的内容
     * @Param imageFormat 图片后缀名
     * @Param width 二维码宽度
     * @param height 二维码高度
     * @return byte[]
     */
    public static String createQrCodeBase64(String contents , String imageFormat , int width , int height) throws WriterException, IOException {
        byte[] bytes =createQrCode(contents , imageFormat , width, height);
        return Base64.encode(bytes);
    }

    /**
     * 解码二维码
     * @Date 2023/09/24 22:32
     * @Param [image]
     * @return java.lang.String
     */
    public static String decodeQrCode(BufferedImage image) throws Exception {
        if (image == null) return StrUtil.EMPTY;
        BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
        hints.put(DecodeHintType.CHARACTER_SET, DEFAULT_CHAR_SET);
        Result result = new MultiFormatReader().decode(bitmap, hints);
        return result.getText();
    }

    /**
     * 转换为BufferedImage
     * @Date 2023/09/24 22:32
     * @Param [bitMatrix]
     * @return java.awt.image.BufferedImage
     */
    public static BufferedImage toBufferedImage(BitMatrix bitMatrix) throws IOException, WriterException {
        MatrixToImageConfig matrixToImageConfig = new MatrixToImageConfig(0xFF000001, 0xFFFFFFFF);
        BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix, matrixToImageConfig);
        return bufferedImage;
    }

    /**
     * 给二维码添加logo
     * @Date 2023/09/24 22:33
     * @Param [bufferedImage, logoFile]
     * @return java.awt.image.BufferedImage
     */
    public static BufferedImage addQrCodeLogo(BufferedImage bufferedImage, File logoFile) throws IOException {
        Graphics2D graphics = bufferedImage.createGraphics();
        int matrixWidth = bufferedImage.getWidth();
        int matrixHeigh = bufferedImage.getHeight();

        // 读取logo图片文件
        BufferedImage logo = ImageIO.read(logoFile);
        int logoWidth = logo.getWidth();
        int logoHeight = logo.getHeight();

        //  计算logo放置位置
        int x = bufferedImage.getWidth()  / 5*2;
        int y = bufferedImage.getHeight() / 5*2;
        int width = matrixWidth / 5;
        int height = matrixHeigh / 5;

        // 开始绘制图片
        graphics.drawImage(logo, x, y, width, height, null);
        graphics.drawRoundRect(x, y, logoWidth, logoHeight, 15, 15);
        graphics.setStroke(new BasicStroke(5.0F, 1, 1));
        graphics.setColor(Color.white);
        graphics.drawRect(x, y, logoWidth, logoHeight);

        graphics.dispose();
        bufferedImage.flush();
        return bufferedImage;
    }

    public static void main(String[] args) throws Exception {
        BufferedImage bufferedImage = toBufferedImage(createBitMatrix("https://blog.csdn.net", 300, 300));
        ImageIO.write(bufferedImage, "png", new File("D:/qrcode.jpg"));

        System.out.println(decodeQrCode(bufferedImage));

        BufferedImage logoQrCode = addQrCodeLogo(bufferedImage, new File("D://logo.png"));
        ImageIO.write(logoQrCode, "png", new File("D:/logoQrcode.jpg"));
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1092814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stm32_标准库_12_串口_发送数据

波特率&#xff1a;约定的传输速率&#xff0c;1000bps,1s发1000位 引脚 结构 数据帧的传输特点 代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"GPIO_InitTypeDef GPIO_InitStruct; USART…

计算机毕业设计选什么题目好?springboot 学习笔记系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【互联网】实习一个月感受

说明&#xff1a;岗位&#xff1a;golang开发实习生&#xff0c;实习已经一个月多点了&#xff0c;这篇文章谈谈实习应该注意些什么点&#xff0c;以及该做些什么事情 说实话这不是我第一次实习了&#xff0c;但是感受很深 注意点&#xff1a; 1、没事找话说 比如中午和同事吃…

12.JVM

一.JVM类加载机制:把类从硬盘文件加载到内存中 1.java文件,编写时是一个.java文件,编译后现成一个.class的字节码文件,运行的时候,JVM就会读取.class文件,放到内存中,并且构造类对象. 2.类加载流程: a.加载:找到.class文件,打开文件,读取内容,尝试解析文件内容. b.验证:检查…

【Python学习笔记】字符串

1. 字符串定义 可以用双引号 、 单三引号、双三引号&#xff0c;下面的定义都是正确的 "你好" 你好 """你好"""其中三引号可以 直接写内容有多行 的字符串。如下 letter 刘总&#xff1a;您好&#xff01;您发的货我们已经收到&am…

百度开放平台第三方代小程序开发,授权事件、消息与事件通知总结

大家好&#xff0c;我是小悟 关于百度开放平台第三方代小程序开发的两个事件接收推送通知&#xff0c;是开放平台代小程序实现业务的重要功能。 授权事件推送和消息与事件推送类型都以event的值判断。 授权事件推送通知 授权事件推送包括&#xff1a;推送票据、授权成功、取…

【C++进阶】:特殊类的设计

特殊类的设计 一.设计一个类不能被拷贝二.设计一个类只能在堆上创建对象三.设计一个类只能在栈上创建4.设计一个类不能被继承五.设计一个类只能有一个对象(单例模式) 一.设计一个类不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c…

蓝桥杯(跳跃 C++)

思路&#xff1a; 1、根据题目很容易知道可以用深度搜索、广度搜索、动态规划的思想解题。 2、这里利用深度搜素&#xff0c;由题目可知&#xff0c;可以往九个方向走。 3、这里的判断边界就是走到终点。 #include<iostream> using namespace std; int max1 0; int …

Vue3中ref创建的引用为什么一定要用.value来获取值

Vue3中ref创建的引用为什么一定要用.value来获取值 回顾jsjs中修改复制变量,改变原始变量vue3中使用ref 回顾js js中一个变量赋值给另一个变量,改变另一个变量,原始变量不变 let a 0; let b a; b 2 console.log("a: "a);js中修改复制变量,改变原始变量 let obj…

【Java 进阶篇】JavaScript 中的全局对象和变量

JavaScript 是一门非常强大的编程语言&#xff0c;它提供了许多全局对象和变量&#xff0c;以便于在整个应用程序中共享数据和功能。本文将详细介绍 JavaScript 中的全局对象和变量&#xff0c;包括全局对象、全局变量、全局函数以及它们的用途和示例。 全局对象 JavaScript …

15.项目讲解之前端页面的实现

项目讲解之前端页面的实现 本项目前端使用HBuilerX软件编写HBuilderX下载安装配置一键直达&#xff0c; uniapp框架uniapp官网&#xff0c; 使用Element-ui组件Element-ui组件网址进行前端页面的完成。 前端项目下载地址 前端项目 前端项目展示 首页 首页展示 echarts实现…

9.Linear Maps

线性映射 线性映射是将向量作为输入并产生一些新向量作为输出的转换。 从坐标定义开始(数组)&#xff0c;再到2&#xff0c;3&#xff0c;并展示它们是如何关联的 线性映射的坐标表示最终是矩阵&#xff0c; 1.坐标定义&#xff08;数组&#xff09; 列向量是向量的坐标表示…

iOS- flutter flavor 多环境Configurations配置

一、点击PROJECT的Runner&#xff0c;选择Info选项&#xff0c;在Configurations下方的号添加不同环境的配置&#xff0c;如下图&#xff1a; 二、选择TAGETS的Runner项目&#xff0c;选择Build Settings选项&#xff0c;在输入框输入package&#xff0c;为不同环境配置相应的…

结构体对齐规则

1.第一个成员在结构体变量偏移量为0的地址处。 2.其他成员变量对齐到某个数字(对齐数)的整数倍的地址处。(对齐数编译器默认的一个对齐数与该成员大小的较小值&#xff09;注意&#xff1a;目前有且只有VS编译器有默认为8. 3.结构体总大小为最大对齐数的整数倍。 4.如果嵌套…

快速修复“找不到xinput1_3.dll无法继续执行此代码的”问题的5个方法

在计算机系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;是一个重要的组件&#xff0c;它负责在程序和操作系统之间进行有效的通信。然而&#xff0c;有时候我们可能会遇到“xinput1_3.dll”文件出现问题的情况&#xff0c;这可能会导致系统不稳定甚至无法正常运行。…

回归预测 | MATLAB实现IBES-ELM基于改进的秃鹰搜索优化算法优化极限学习机的数据回归预测(多指标,多图)

回归预测 | MATLAB实现IBES-ELM 基于改进的秃鹰搜索优化算法优化极限学习机的数据回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IBES-ELM 基于改进的秃鹰搜索优化算法优化极限学习机的数据回归预测&#xff08;多指标&#xff0c;多图&a…

DL Homework 3

给定训练集,将每个样本输入给前馈神经网络&#xff0c;得到网络输出为,其在数据集上的结构化风险为 首先简单解释一下这堆话&#xff0c;结构化风险经验风险正则化项,经验风险为&#xff0c;对于函数我们大多数采取的为交叉熵函数&#xff0c;,正则化项为&#xff0c;首先神经网…

【软考-中级】系统集成项目管理工程师-配置管理历年案例

持续更新。。。。。。。。。。。。。。。 目录 2023 上 试题三(20分) 2023 上 试题三(20分) 某公司有自己的质量管理体系&#xff0c;其中配置管理程序已运行多年&#xff0c;由项目经理牵头组建变更控制委员会(CCB)&#xff0c;在创建配置管理环境后&#xff0c;并经过变更申请…

微信小程序入门级

目录 一.什么是小程序&#xff1f; 二.小程序可以干什么&#xff1f; 三.入门使用 3.1. 注册 3.2. 安装 3.3.创建项目 3.4.项目结构 3.5.应用 好啦今天就到这里了&#xff0c;希望能帮到你哦&#xff01;&#xff01;&#xff01; 一.什么是小程序&#xff1f; 微信小程…

【全网最细】谷歌小恐龙无敌代码它来了!

谷歌小恐龙是什么&#xff1f; 每次断网的时候&#xff0c;大家是不是都会玩一会&#xff0c;小恐龙快跑的游戏&#xff0c;或者在信息课上玩一玩&#xff0c;对不对&#xff1f; 还没玩过的小伙伴也不用担心&#xff0c;打开谷歌&#xff0c;输入这段网址&#xff1a;chrome…