Java使用Zxing二维码生成

news2024/12/24 3:46:21

目录

1、二维码简介

二维码纠错级别

2、ZXing简介

3、示例

3.1 搭建一个maven项目,引入Zxing依赖包

3.2 创建QrCodeUtil.java 类


1、二维码简介

二维条形码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值内容信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。二维码具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。

二维码纠错级别

二维码纠错级别指的是在识别二维码时,对于损坏或模糊的二维码的容错能力。

一般来说,二维码有四个纠错级别:

L (低):可以纠正7%左右的错误。

M (中):可以纠正15%左右的错误。

Q (高):可以纠正25%左右的错误。

H (高):可以纠正30%左右的错误。

总结:一般来说,使用较高的纠错级别会导致生成的二维码更大,但是它的容错能力也会更强。

2、ZXing简介

ZXing(Zebra Crossing)是Google开发的一个二维码解析和生成的开源库。

官网地址:http://code.google.com/p/zxing/

3、示例

通过Java调用Zxing实现二维码的生成

3.1 搭建一个maven项目,引入Zxing依赖包

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

3.2 创建QrCodeUtil.java 类

具体实现代码如下:

package  QrCodeUtil;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.Hashtable;

import javax.imageio.ImageIO;


import com.alibaba.druid.util.StringUtils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * 生成二维码
 */
public class QrCodeUtil {

    private static final int BLACK = 0xFF000000;
    private static final int WHITE = 0xFFFFFFFF;
    private static final int margin = 0;
    private static final int LogoPart = 4;

    public static void main(String[] args) throws WriterException {
        //二维码内容
        String content = "IT技术分享社区,一个有态度的互联网社区交流平台";
        String logoPath = "D:\\logo.png"; // 二维码中间的logo信息 非必须
        String format = "jpg";
        int width = 120; // 二维码宽度
        int height = 120;// 二维码高度
        // 设置二维码矩阵的信息
        BitMatrix bitMatrix = setBitMatrix(content, width, height);
        // 设置输出流
        OutputStream outStream = null;
        String path = "d:/Code" + new Date().getTime() + ".png";//设置二维码的文件名
        try {
            outStream = new FileOutputStream(new File(path));
            // 目前 针对容错等级为H reduceWhiteArea  二维码空白区域的大小 根据实际情况设置,如果二维码内容长度不固定的话 需要自己根据实际情况计算reduceWhiteArea的大小
            writeToFile(bitMatrix, format, outStream, logoPath, 5);
            outStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 设置生成二维码矩阵信息
     * @param content 二维码图片内容
     * @param width   二维码图片宽度
     * @param height  二维码图片高度
     * @throws WriterException
     */
    private static BitMatrix setBitMatrix(String content, int width, int height) throws WriterException {
        BitMatrix bitMatrix = null;
        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 指定编码方式,避免中文乱码
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 指定纠错等级 如果二维码里面的内容比较多的话推荐使用H 容错率30%, 这样可以避免一些扫描不出来的问题
        hints.put(EncodeHintType.MARGIN, margin); // 指定二维码四周白色区域大小 官方的这个方法目前没有没有作用默认设置为0
        bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
        return bitMatrix;
    }
    /**
     * @param matrix
     * @param format
     * @param outStream
     * @param logoPath        logo图片
     * @param reduceWhiteArea 二维码空白区域设置
     * @throws IOException
     */
    private static void writeToFile(BitMatrix matrix, String format, OutputStream outStream, String logoPath, int reduceWhiteArea) throws IOException {
        BufferedImage image = toBufferedImage(matrix, reduceWhiteArea);
        // 如果设置了二维码里面的logo 加入LOGO水印
        if (!StringUtils.isEmpty(logoPath)) {
            image = addLogo(image, logoPath);
        }
        ImageIO.write(image, format, outStream);
    }

    /**
     *
     * @param matrix
     * @param reduceWhiteArea
     * @return
     */
    private static BufferedImage toBufferedImage(BitMatrix matrix, int reduceWhiteArea) {
        int width = matrix.getWidth();
        int height = matrix.getHeight();
        BufferedImage image = new BufferedImage(width - 2 * reduceWhiteArea, height - 2 * reduceWhiteArea, BufferedImage.TYPE_3BYTE_BGR);
        for (int x = reduceWhiteArea; x < width - reduceWhiteArea; x++) {
            for (int y = reduceWhiteArea; y < height - reduceWhiteArea; y++) {
                image.setRGB(x - reduceWhiteArea, y - reduceWhiteArea, matrix.get(x, y) ? BLACK : WHITE);
            }
        }
        return image;
    }

    /**
     * 给二维码图片中绘制logo信息 非必须
     * @param image    二维码图片
     * @param logoPath logo图片路径
     */
    private static BufferedImage addLogo(BufferedImage image, String logoPath) throws IOException {
        Graphics2D g = image.createGraphics();
        BufferedImage logoImage = ImageIO.read(new File(logoPath));
        // 计算logo图片大小,可适应长方形图片,根据较短边生成正方形
        int width = image.getWidth() < image.getHeight() ? image.getWidth() / LogoPart : image.getHeight() / LogoPart;
        int height = width;
        // 计算logo图片放置位置
        int x = (image.getWidth() - width) / 2;
        int y = (image.getHeight() - height) / 2;
        // 在二维码图片上绘制中间的logo
        g.drawImage(logoImage, x, y, width, height, null);
        // 绘制logo边框,可选
        g.setStroke(new BasicStroke(2)); // 画笔粗细
        g.setColor(Color.WHITE); // 边框颜色
        g.drawRect(x, y, width, height); // 矩形边框
        logoImage.flush();
        g.dispose();
        return image;
    }

}

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

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

相关文章

C++ 001:C++ 基础语法

1. 开始之前 1.1 学习路线 这次我是下定决心要学 C 了&#xff0c;而且是系统地&#xff0c;不半途而废地学习 C 了~ 有这个新专栏为证~ 由于某次偶然的机会&#xff0c;我看见了一张 C 竞赛的学习路线表&#xff08;这里由于表格内容太多就不贴出来&#xff09;&#xff0c…

Xinlinx zynq7020国产替代 FMQL20S400 全国产化 ARM 核心板+扩展板

TES720D 是一款基于FMQL20S400 的全国产化核心 模 块 。 该核心 模 块 将FMQL20S400 &#xff08;兼容FMQL10S400&#xff09;的最小系统集成在了一个 50*70mm 的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;特别是用在控制领域&#xff0…

【Java】的面向对象笔记(中)

继承性基础 哲学三问 什么是继承性 银行卡有很多种&#xff0c;有借记卡、信用卡、亲情卡、工资卡等等&#xff0c;他们各有不同&#xff0c;但都具有相同的银行卡特征&#xff0c;即余额、卡号等共有的属性&#xff0c;如果每定义一个类都需要写一次&#xff0c;那就太麻烦…

word、excel文档内容更新技术方案

需求背景 惯例先说下背景。 生产、研发业务上往往使用大量word和excel文档来作为资料载体&#xff0c;如操作规程、控制手册、卡片……&#xff0c;这些文档会反复使用到一些设备、工艺等参数数据。参数属性主要是名称、编码、正常范围、报警上下限、单位等&#xff0c;这些参…

SQL---DDL

目录 一、数据库的相关概念 二、MySQL数据库 1. 关系型数据库&#xff08;RDBMS&#xff09; 2. 数据数据库 3. MySQL客户端连接的两种方式 方式一&#xff1a;使用MySQL提供的客户端命令行工具 方式二&#xff1a;使用系统自带的命令行工具执行指令 三、SQL SQL的…

Callable接口_JUC的常见类_多线程环境使用ArrayList

目录 1.Callable接口 相关面试题 2.ReentrantLock 相关面试题 3.信号量Semaphore 4.CountDownLatch 5.多线程环境使用ArrayList 热加载 1.Callable接口 Callable是一个接口,把线程封装了一个"返回值",方便程序员借助多线程的方式计算结果. 类似于Runnable,…

五个了解自己天赋优势的分析工具(三)DISC性格测评

DISC性格测评 DISC系统源于1928年&#xff0c;马斯顿在他的著作《正常人的情绪》(The Emotion of Normal People)中公布了他所发现及发展的性格理论。 该书首次尝试将心理学从纯粹的临床应用向外延伸应用到一般人身上。人有四种基本的性向因子&#xff0c;即Dominance -支配&…

Duet 安装教程

Duet 安装教程1. Duet 概述2. Duet 安装教程2.1 PC 端下载安装Duet2.2 iPad 下载安装 Duet3. 将iPad作为Windows电脑副屏的几种方法结束语1. Duet 概述 Duet 是一款能将iPad或iPhone 变成 Mac 或者 PC 的显示屏的软件&#xff1b; 通过线材连接两台不同的设备&#xff0c;Duet…

抖音聊天”上线,字节最后的社交梦?

转眼间时间来到2023年&#xff0c;距离中国接入国际互联网&#xff08;即中国互联网起点&#xff09;已过40年。回顾中国的互联网江湖&#xff0c;先有BAT三足鼎立&#xff0c;后有TMD后浪居上。所谓BAT&#xff0c;即互联网时代领头羊百度、阿里巴巴和腾讯&#xff0c;而TMD则…

【Java入门】常量和变量

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java入门 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又一…

HTTP/HTTPS协议介绍

数据来源 HTTP 01 什么是HTTP 超文本传输协议(HyperTextTransferProtocol缩写&#xff1a;HTTP&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。 HTP( Hyper Text Transfer Protocol超京本传输协议) 是一个基于请求与响应 无状态的&#xff0c;应用层…

mysql快速生成100W条测试数据(7)虚拟网站、IP地址并存入mysql数据库

这是之前的文章里面包含一些以前的一些操作流程可以进行参考学习 更加详细操作步骤在第一篇文章里面 mysql快速生成100W条测试数据&#xff08;1&#xff09;&#xff1a;游戏人物数据 mysql快速生成100W条测试数据&#xff08;2&#xff09;公司员工信息 mysql快速生成100W条测…

《Unity Shader 入门精要》第2章 渲染流水线

第2章 渲染流水线 2.1 什么是渲染流水线 渲染流水线的工作在于由一个三维场景出发&#xff0c;生成一张二维图像。换句话说&#xff0c;计算机需要从一系列的顶点数据、纹理等信息出发&#xff0c;把这些信息最终转换成一张肉眼可见的图像&#xff0c;而这个过程通常由CPU与G…

静态链接过程分析

前期准备这边使用《程序员的自我修养》中的例子//a.cpp extern int shared;void swap(int* a, int *b);int main(){int a 100;swap(&a, &shared); }//b.cpp int shared 1;void swap(int* a, int* b){*a ^ *b ^ *a ^ *b; }通过gcc -c 命令编译出相对应的.o文件&#x…

五,Spring Bean生命周期

1 Spring Bean的生命周期&#xff08;概念重点&#xff09; 对象的生命周期&#xff1a;对象从生到死的过程。 Spring工厂中Bean的生命周期并不像想象的那么简单&#xff0c;Spring对工厂中的Bean的生命周期进行了细致的划分&#xff0c;并允许开发者通过编码或配置的方式定制…

Ubuntu18 sqlyog配置mysql5.7远程连接

mysql 配置远程连接 1. mysql安装和配置 sudo apt-get install mysql-server-5.7 systemctl status mysql service mysql status修改mysql的配置文件&#xff1a; sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf以下为mysqld.cnf文件主要内容&#xff0c;这里的skip-grant-ta…

基于51单片机的pm2.5空气质量监测仪仿真设计

51单片机pm2.5监测仪仿真设计( proteus仿真程序报告讲解视频&#xff09; 仿真图proteus 7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0032 51单片机pm2.5监测仪仿真设计主要功能&#xff1a;讲解演示视频仿真程序设计…

代码整洁提升方案

验-言 公共方法都要做参数的校验&#xff0c;参数校验不通过明确抛出异常或对应响应码&#xff1a; Java Bean验证已经是一个很古老的技术了&#xff0c; 会避免我们很多问题&#xff1b; 在接口中也明确使用验证注解修饰参数和返回值&#xff0c; 作为一种协议要求调用方按…

win11 arm 系统安装安卓子系统

一般的x86电脑如果安装android子系统&#xff0c;运行安卓子系统&#xff0c;由于要将android arm代码转译为x86代码&#xff0c;所以效率不一定高&#xff0c;但是如果电脑是arm架构的&#xff0c;通过安卓子系统运行android的程序执行效率就会 高不少&#xff0c;本文参考,都…

JVM面试题

Java内存区域 说一下 JVM 的主要组成部分及其作用&#xff1f; JVM包含两个子系统和两个组件&#xff0c;两个子系统为Class loader(类装载)、Execution engine(执行引擎)&#xff1b;两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader…