ZXing生成二维码

pom.xml

<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
    <dependency>
      <groupId>com.google.zxing</groupId>
      <artifactId>core</artifactId>
      <version>3.3.2</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
    <dependency>
      <groupId>com.google.zxing</groupId>
      <artifactId>javase</artifactId>
      <version>3.3.2</version>
    </dependency>

具体事务代码

package cn.silica.Utils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import static com.google.zxing.client.j2se.MatrixToImageConfig.BLACK;
import static com.google.zxing.client.j2se.MatrixToImageConfig.WHITE;

/**
 * 二维码生成及解析工具
 */
public class QRCodeUtil {
    /**
     * 生成无中间log的二维码
     * @param contexts  二位中内容
     * @param qrWidth 二维码宽度
     * @param qrHeight 二维码长度
     * @param outputStream 输出流
     */
    public static void createNoLogQRCode(String contexts, int qrWidth, int qrHeight ,OutputStream outputStream){
        Map<EncodeHintType,Object> hints = new HashMap<EncodeHintType, Object>();
        //设置二维码校错级别 LMQH  7%,15%,25%,30%表示二维码被图形被污染时可自动复原的比例?
        //同时纠错级别越高,纠错信息占用的空间就越多,能存储的有用信息就越少
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        //设置编码格式
        hints.put(EncodeHintType.CHARACTER_SET,"utf-8");
        //设置二维码边界大小1,2,3,4 默认为4,最大
        hints.put(EncodeHintType.MARGIN,1);
        try {
            //MultiFormatWriter 二维码格式化输出
            //MultiFormatWriter
            BitMatrix bitMatrix = (new MultiFormatWriter()).encode(contexts, BarcodeFormat.QR_CODE,qrWidth,qrHeight,hints);
            //二维码转换为图像
            MatrixToImageWriter.writeToStream(bitMatrix,"png",outputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成带logo的二维码
     * @param contexts 二维码中的内容
     * @param qrWidth 二维码的宽度
     * @param qrHeight 二维码的高度
     * @param outputStream 二维码输出地
     * @param imgWidth 二维码中logo的宽度
     * @param imgHeight 二维码中logo的高度
     * @param imgPath 二维码中logo的原地址
     * @throws IOException
     */
    public static void createLogQRCode(String contexts, int qrWidth, int qrHeight ,OutputStream outputStream,int imgWidth,int imgHeight,String imgPath) throws IOException {
        Map<EncodeHintType,Object> hints = new HashMap<EncodeHintType, Object>();
        //设置二维码校错级别 LMQH  7%,15%,25%,30%表示二维码被图形被污染时可自动复原的比例?
        //同时纠错级别越高,纠错信息占用的空间就越多,能存储的有用信息就越少
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        //设置编码格式
        hints.put(EncodeHintType.CHARACTER_SET,"utf-8");
        //设置二维码边界大小1,2,3,4 默认为4,最大
        hints.put(EncodeHintType.MARGIN,1);
        try {
            //MultiFormatWriter 二维码格式化输出
            BitMatrix bitMatrix = (new MultiFormatWriter()).encode(contexts, BarcodeFormat.QR_CODE,qrWidth,qrHeight,hints);
            //获取二维码高度
            qrWidth = bitMatrix.getWidth();
            qrHeight = bitMatrix.getHeight();

            //创建缓冲流
            BufferedImage bufferedImage = new BufferedImage(qrWidth, qrHeight, BufferedImage.TYPE_INT_RGB);

            //将二维码放入缓冲流
            for (int i = 0; i < qrWidth; i++) {
                for (int j = 0; j < qrHeight; j++) {
                    // 循环将二维码内容写入图片
                    bufferedImage.setRGB(i, j, bitMatrix.get(i, j) ? BLACK : WHITE);
                }
            }

            //写入logo图像
            File logoFile = new File(imgPath);
            Graphics2D gs2 = bufferedImage.createGraphics();//该对象可以绘制BufferedImage对象
            BufferedImage logoImg = ImageIO.read(logoFile);//将图片写入到BufferedImage对象中
            //如果logo长宽超过二维码长宽的20%则设定其长宽为二维码的20%,如果小于20%则以logo实际长宽为准
            int logoWidth = logoImg.getWidth()>bufferedImage.getWidth()*2/10 ? bufferedImage.getWidth()*2/10 : logoImg.getWidth();
            int logoHeight = logoImg.getHeight()>bufferedImage.getHeight()*2/10 ? bufferedImage.getHeight()*2/10 : logoImg.getHeight();

            //x,y为logo相对于二维码图片的位置
            int x = (qrWidth - logoWidth) / 2;
            int y = (qrHeight - logoHeight) / 2;

            //开始绘制logo图片
            gs2.drawImage(logoImg,x,y,logoWidth,logoHeight,null);
            //生成一个可设置圆角的矩形
            gs2.drawRoundRect(x,y,logoWidth,logoHeight,0,0);
            //边框宽度
            gs2.setStroke(new BasicStroke(3));
            gs2.setColor(Color.green);//设置背景颜色
            //生成特定矩形的轮廓
            gs2.drawRect(x,y,logoWidth,logoHeight);
            gs2.dispose();//处理图像内容并释放资源,此后gs2将不能再被调用
            logoImg.flush();
            bufferedImage.flush();
            //将二维码返回到页面
            ImageIO.write(bufferedImage,"png",outputStream);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

参考:

https://blog.csdn.net/rongku/article/details/51872156


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

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

相关文章

Java NIO————NIO 简介

引言 Java NIO (New IO&#xff0c;或Non Blocking IO) 是从Java1.4 版本开始引入的一个新的 IO API&#xff0c;可以代替标准的Java IO API。 NIO与原来的IO有同样的作用和目的&#xff0c;但是使用的方式完全不同。 NIO支持面向缓冲区、基于通道的IO操作。NIO将以更加高效…

MySql主从同步最小配置

MySql主从同步最小配置 MySql配置文件配置window: my.ini centos: my.cnf主数据库配置 #配置数据库的唯一标识符,一般1位主库,从库为ip地址最后一位 server-id 1 #启用二进制日志,对应mysql-bin.xxxxx文件 log-bin mysql-bin #需要同步的数据库名 binlog-do-dbtest1 #不需要…

解决pom文件第一行报错(unknown)-亲测有效

原文链接&#xff1a;https://blog.csdn.net/u010947534/article/details/93743582 问题&#xff1a; Eclipse导入maven项目时&#xff0c;或者新建一个springboot项目时&#xff0c;pom.xml文件第一行报错&#xff0c;没有错误信息提示&#xff0c;就一个Unknown&#xff0c…

Oracle中start with xx connect by prior 语句解析

Oracle中start with xx connect by prior 语句解析 ​ Oracle这种的start with语句主要对B型树的数据进行递归查询.可以指定数据树上的任一节点,然后查找到它所有的子节点或者父节点. ​ 现在有如下图的数据: 我们先想数据库插入数据,这里用到oracle的批量插入写法# 1 建表 CRE…

Spring Boot————Profile配置

引言 Spring Boot 的Profile配置&#xff0c;可以极大简化配置难度&#xff0c;可以有多种配置形式&#xff0c;根据位置有不同的生效方式。 探讨问题 Spring Boot 的 Profile 配置是为了解决不同环境可能存在的多种配置问题。 举例来说明的话&#xff0c;就是当我们开发完…

Enum的简单使用

package cn.silica.vo;/*** author laibaocen*/ public enum Separator {/*** 枚举值 大写* 如果只有枚举值,那么最后一个枚举值后可以不加分号*/SEMICOLON(0,";","分号"),COLON(1,":","冒号"),CONNECTIVE (2,"-","破折…

Java NIO ———— Buffer 缓冲区详解

引言 缓冲区是一个用于特定基本类型的容器。由java.nio 包定义&#xff0c;所有缓冲区都是 Buffer 抽象类的子类。 Java NIO 中的 Buffer &#xff0c;主要用于与NIO 通道进行交互。数据从通道存入缓冲区&#xff0c;从缓冲区取出到通道中。 一、创建缓冲区 缓冲区的本质是 …

基本类型理解巩固及补码原理总结

引言 本篇文章属于计算机基础通识&#xff0c;主要讨论&#xff1a;有符号类型、无符号类型的区别&#xff0c;byte、int 等类型的取值范围&#xff0c;最大值最小值的计算公式的由来&#xff0c;原码、反码、补码转换公式。 有符号类型与无符号类型 在 Java 中的八大基本类…

2021年3月15日_读书|总结笔记目录

深入理解Java虚拟机*第三版 慢慢填坑第一部分*自动内存管理 第二部分*虚拟机执行子系统 类文件结构 无关性的基石

LeetCode(#118)————杨辉三角形

问题描述 给定一个非负整数 numRows&#xff0c;生成杨辉三角的前 numRows 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 示例: 输入: 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1] ] 实现方法 class Solution {public List<List<Intege…

数据结构与算法————九九乘法表

问题描述 通过Java语言实现九九乘法表的输出。使用一个for 循环和两个for循环。 一个for循环 public static void oneFor() {for (int i 1, j 1; i < 9; j) {System.out.print(j "*" i "" i * j "\t");if (j i) {i;j 0;System.ou…

JVM001_类文件结构

无关性的基石 实现语言无关性的基础是虚拟机和字节码存储格式。Java虚拟机不与任何语言绑定&#xff08;包括Java&#xff09;&#xff0c;它只与‘Class文件’这种特定的二进制文件格式所关联。Class文件中包含了Java虚拟机指令集、符号表以及其它辅助信息。出于安全考虑&…

Maven学习(六)————企业Maven项目最佳实践

引言 在《Maven学习&#xff08;三&#xff09;————Maven核心概念&#xff08;二&#xff09;》中&#xff0c;学到了Maven 继承和 Maven 聚合的概念&#xff0c;这两个概念&#xff0c;解决的问题分别是&#xff1a; 1、解决一些公共依赖统一版本的问题。 2、统一打包部署…

Oracle查询表|注释|字段|字段注释

当前用户所有用户DBA备注user_tablesall_tablesdba_tables表user_tab_commentsall_tab_commentsdba_tab_comments表注释user_tab_columnsall_tab_columnsdba_tab_columns表字段user_col_commentsall_col_commentsdba_col_comments字段注释user_objectsall_objectsdba_objects可…

JVM003_属性表

属性表 预备知识 javac -g Xxx.java 在生成class文件的时候生成所有调试信息javap -v Xxx.class 输出附加信息 属性表结构 类型名称数量备注u2attribute_name_index1属性名称索引&#xff0c;指向一个CONSTANT_Utf8_info型常量的索引u4attribute_length1该属性表的长度u1in…

Lombok ——自动化方法生成器

引言 此文为简单的Lombok 演示。 Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具&#xff0c;通过使用对应的注解&#xff0c;可以在编译源码的时候生成对应的方法。简而言之&#xff0c;一句话就是&#xff1a;通过简单的注解…

JVM004_字节码指令简介

字节码指令简介 Java虚拟机指令由操作码&#xff08;Opcode&#xff09;和跟随其后的零至多个操作数&#xff08;Operand&#xff09;组成。 操作码&#xff1a;一个字节长度的&#xff0c;代表某种特定操作含义的数字。 操作数&#xff1a;操作码需要的参数。 字节码与数据…

LeetCode(#26)————删除排序数组中的重复项

题目 给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums […

JVM005_synchronized、同步指令、管程、MESA

synchronized、同步指令、管程、MESA synchronized是Java的一个关键词&#xff0c;可以保证方法或者代码块在运行时&#xff0c;同一时刻只有一个方法可以进入到临界区&#xff0c;保证了原子性、可见性、有序性。 临界资源一次只能被一个线程访问的资源。 **临界区:**访问临…

MySQL————表维护相关低频操作总结

引言 一些对表结构的修改操作是日常数据库操作中非常低频的&#xff0c;这就好像盖完了一栋楼之后&#xff0c;很少会去动地基&#xff0c;不过这种情况在实际开发当中并非完全没有可能&#xff0c;因此&#xff0c;此篇博客主要总结表结构修改相关的语句。 一、备份表 如果…