Java中使用ZXing和QRCode生成二维码(附Demo)

目录

  • 前言
  • 1. 基本知识
  • 2. ZXing
  • 3. QRCode

前言

对于Java的基本知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

1. 基本知识

生成二维码在Java中有多种方法,常用的是通过第三方库来实现,比较流行的库包括 ZXing (Zebra Crossing) 和 QRCode

ZXing库中的核心API

  • MultiFormatWriter.encode():生成二维码矩阵
  • MatrixToImageWriter.writeToPath():将二维码矩阵保存为图片文件

QRCode库中的核心API

  • QRCode.from(content):从内容生成二维码
  • withSize(width, height):设置二维码的尺寸
  • file():生成二维码并保存为图片文件

ZXing库功能强大,适合生成复杂的二维码且提供了细粒度的控制
QRCode库使用简单,快速生成二维码,适合基础需求

二维码是一种将信息编码为二维图形的技术,常用于存储URL、文本、数字等信息。它由黑白模块组成,通常可以通过扫描来解码

生成二维码的过程主要分为两个步骤:

  • 编码:将需要存储的信息(如URL、文本等)编码为二维码的黑白模块
  • 绘制:根据编码信息绘制出二维码图像,通常可以保存为PNG、JPG等格式

使用ZXing生成二维码 ZXing是最常用的Java二维码生成库,支持多种格式(例如二维码、条形码)
其核心类包括:

  • MultiFormatWriter:用于生成二维码的核心类
  • BitMatrix:二维码的矩阵表示,用于保存黑白模块的分布
  • MatrixToImageWriter:将二维码矩阵转化为图片

二维码的参数设置

  • 宽度和高度:二维码图片的尺寸,通常是正方形
  • 编码字符集:通常使用UTF-8编码,确保支持中文等特殊字符
  • 错误纠正级别:二维码的容错能力,可以通过调整纠错级别提高二维码的鲁棒性

2. ZXing

依赖库配置(Maven项目)
在Maven项目中,需要在pom.xml中添加ZXing的依赖:

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

Demo如下:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.Writer;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class QRCodeGenerator {public static void main(String[] args) {// 要编码的文本String data = "Hello, QR Code!";// 生成的二维码图片文件路径String filePath = "qrcode.png";try {// 调用生成二维码的方法generateQRCodeImage(data, 300, 300, filePath);System.out.println("二维码生成成功!");} catch (WriterException | IOException e) {e.printStackTrace();}}/*** 生成二维码图像并保存到文件** @param text   要编码的文本* @param width  图像宽度* @param height 图像高度* @param filePath 保存文件路径* @throws WriterException 生成二维码异常* @throws IOException     IO异常*/private static void generateQRCodeImage(String text, int width, int height, String filePath)throws WriterException, IOException {// 创建 QRCodeWriter 实例QRCodeWriter qrCodeWriter = new QRCodeWriter();// 生成 BitMatrix,表示二维码的黑白矩阵BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);// 创建一个 BufferedImage,用于绘制图像BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);image.createGraphics();// 获取图形上下文Graphics2D graphics = (Graphics2D) image.getGraphics();// 设置背景色为白色graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, width, height);// 设置前景色为黑色graphics.setColor(Color.BLACK);// 在图像上绘制二维码的黑色矩阵for (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {if (bitMatrix.get(i, j)) {// 如果当前位置为黑色,填充一个像素graphics.fillRect(i, j, 1, 1);}}}// 将图像保存为 PNG 文件ImageIO.write(image, "png", new File(filePath));}
}

截图如下:

在这里插入图片描述

另外一个Demo:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.client.j2se.MatrixToImageWriter;import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;public class QRCodeGenerator {/*** 生成二维码* @param content 二维码中包含的内容,如URL或文本* @param width   二维码的宽度* @param height  二维码的高度* @param filePath 保存二维码图片的路径* @throws Exception 可能抛出的异常*/public static void generateQRCode(String content, int width, int height, String filePath) throws Exception {// 定义二维码的参数Map<EncodeHintType, Object> hints = new HashMap<>();// 设置编码字符集hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 设置二维码的容错级别,较高容错级别适合损坏或部分覆盖的二维码hints.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H);// 生成二维码的BitMatrix(二维码的矩阵表示)BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);// 将二维码矩阵保存为图片文件Path path = Paths.get(filePath);MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);System.out.println("二维码已成功生成,保存路径: " + filePath);}public static void main(String[] args) {try {// 生成二维码的内容String content = "https://www.example.com";// 设置二维码的宽度和高度int width = 300;int height = 300;// 保存二维码图片的路径String filePath = "qr_code.png";// 调用生成二维码方法generateQRCode(content, width, height, filePath);} catch (Exception e) {e.printStackTrace();}}
}

3. QRCode

QRGen的xml依赖包
QRGen JavaSE » 3.0.1的xml依赖包

在Maven项目中,需要在pom.xml中添加QRCode的依赖:

<dependencies><dependency><groupId>net.glxn</groupId><artifactId>qrcode</artifactId><version>2.1</version></dependency>
</dependencies>
  1. 完整的代码示例
import net.glxn.qrgen.javase.QRCode;
import java.io.File;
import java.io.IOException;public class QRCodeDemo {/*** 生成二维码并保存为图片文件* @param content 二维码中包含的内容,如URL或文本* @param filePath 保存二维码图片的路径* @throws IOException 可能抛出的异常*/public static void generateQRCode(String content, String filePath) throws IOException {// 生成二维码并保存为PNG格式的图片File file = QRCode.from(content).withSize(250, 250).file();// 将生成的图片文件保存到指定路径file.renameTo(new File(filePath));System.out.println("二维码已成功生成,保存路径: " + filePath);}public static void main(String[] args) {try {// 生成二维码的内容String content = "https://www.example.com";// 保存二维码图片的路径String filePath = "qr_code_qrgen.png";// 调用生成二维码方法generateQRCode(content, filePath);} catch (IOException e) {e.printStackTrace();}}
}

QRCode 库实际上已经从 net.glxn.qrgen 包名更改为 com.github.kenglxn.qrgen,并且托管在 GitHub 上

因此,需要在 Maven 的 pom.xml 中使用正确的依赖配置:

  1. 在Maven项目中配置依赖
<dependency><groupId>com.github.kenglxn.qrgen</groupId><artifactId>qrgen</artifactId><version>2.6.0</version>
</dependency>
  1. 更新后的QRCode生成Demo代码
    以下是修正后的QRCode生成示例代码:
import com.github.kenglxn.qrgen.javase.QRCode;
import java.io.File;
import java.io.IOException;public class QRCodeDemo {/*** 生成二维码并保存为图片文件* @param content 二维码中包含的内容,如URL或文本* @param filePath 保存二维码图片的路径* @throws IOException 可能抛出的异常*/public static void generateQRCode(String content, String filePath) throws IOException {// 生成二维码并保存为PNG格式的图片File file = QRCode.from(content).withSize(250, 250).file();// 将生成的图片文件保存到指定路径file.renameTo(new File(filePath));System.out.println("二维码已成功生成,保存路径: " + filePath);}public static void main(String[] args) {try {// 生成二维码的内容String content = "https://www.example.com";// 保存二维码图片的路径String filePath = "qr_code_qrgen.png";// 调用生成二维码方法generateQRCode(content, filePath);} catch (IOException e) {e.printStackTrace();}}
}

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

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

相关文章

SpringBoot实现自定义Redis的连接

SpringBoot实现自定义Redis的连接 1.docker安装Redis docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf2.maven 的pom文件导包 <dependency>&…

PDF 秒变 JPG,2024 这些工具来助力

有些扫描仪默认将扫描文档保存为PDF格式&#xff0c;若事先未加留意&#xff0c;便可能累积大量PDF文件。然而&#xff0c;在需要将这些文件插入到其他文档或进行图形设计时&#xff0c;PDF格式可能会显得不够灵活或便捷。这时&#xff0c;将PDF转换为JPG图片格式就成为了一个实…

选对工具很重要!师姐花了1天写代码,我3分钟就做出一样的倾向性得分匹配结果!...

风暴统计 √浙中大学统计老师郑卫军主持 √ 基于R语言软件开发 √ 免费使用&#xff0c;无需注册 √一键生成发表级图表 www.medsta.cn/software &#xff08;电脑端浏览器打开&#xff09; 倾向性得分方法&#xff08;PSM&#xff09;可有效降低混杂偏倚&#xff0c;得到类似随…

2024外研社综合能力大赛第一场真题

网上找滴~自用 审核不过&#xff0c;备考指南发知乎了&#xff1a;https://zhuanlan.zhihu.com/p/730698685

Spring Boot在甘肃非遗文化网站开发中的应用

2 相关技术 2.1 SSM框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SSM&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c;SSM框架也可以&#xff0c;SpringMVC也可以。SSH框架…

[网络]数据链路层-MAC帧与ARP协议

目录 一、数据链路层 二、以太网 2.1 认识以太网 2.2 数据碰撞 2.3 交换机 2.4 MAC帧格式 2.5 局域网通信过程 2.6 认识 MAC 地址 2.7 对比理解 MAC 地址和 IP 地址 2.8 认识 MTU 2.9 认识MSS 三、ARP 协议 3.1 了解ARP协议 3.2 ARP协议的工作流程 3.3 ARP 数据…

火车票有电子发票吗?没纸质火车票怎么报销?

火车票有电子发票吗&#xff1f; 火车票、高铁票目前没有电子发票&#xff0c;但是现在已经实行电子客票&#xff0c;车票即购票证件&#xff0c;乘车时&#xff0c;只需购票证件原件&#xff08;如身份证、护照、临时身份证等&#xff09;即可乘车。 没纸质火车票怎么报销&am…

“AI+Security”系列第3期(五):AI技术在网络安全领域的本地化应用与挑战

近日&#xff0c;由安全极客、Wisemodel 社区、InForSec 网络安全研究国际学术论坛和海升集团联合主办的“AI Security”系列第 3 期技术沙龙&#xff1a;“AI 安全智能体&#xff0c;重塑安全团队工作范式”活动顺利举行。此次活动吸引了线上线下超过千名观众参与。 在活动中…

3D 模型GLTF、GLB格式文件介绍使用;FBX格式

一、GLTF、GLB介绍 GLTF&#xff08;GL Transmission Format&#xff09;和 GLB&#xff08;GL Binary&#xff09;是用于在 Web 和各种应用程序中传输和加载 3D 场景和模型的开放标准格式。它们由 Khronos Group 开发&#xff0c;旨在提供一种高效、可扩展且易于使用的 3D 内…

9.26号算法题

数组的遍历 414.第三大的数 题解&#xff1a; class Solution {public int thirdMax(int[] nums) {TreeSet<Integer>treeSet new TreeSet<Integer>(); //生成一个TreeSet对象&#xff0c;存储有序唯一整数for (int num : nums){//遍历数组treeSet.add(num);//将…

图书系统|图书个性化推荐系统|基于springboot的图书个性化推荐系统设计与实现(源码+数据库+文档)

图书个性化推荐系统目录 目录 基于springboot的图书个性化推荐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

高级算法设计与分析 学习笔记9 跳表

单链表的样子我们很熟悉了&#xff1a; 怎么加快查找&#xff1f;&#xff1a; 查找的具体方法&#xff1a; 超过了就回头下去。 这条“快速路”最好是几个节点呢&#xff1f;&#xff1a; 假如我们弄好多层跳表呢&#xff1f;&#xff1a; 给弄成2叉树了&#xff01; 如何插入…

RabbitMQ 队列之战:Classic 和 Quorum 的性能洞察

RabbitMQ 是一个功能强大且广泛使用的消息代理&#xff0c;它通过处理消息的传输、存储和交付来促进分布式应用程序之间的通信。作为消息代理&#xff0c;RabbitMQ 充当生产者&#xff08;发送消息的应用程序&#xff09;和使用者&#xff08;接收消息的应用程序&#xff09;之…

“类型名称”在Go语言规范中的演变

Go语言规范&#xff08;The Go Programming Language Specification&#xff09;[1]是Go语言的核心文档&#xff0c;定义了该语言的语法、类型系统和运行时行为。Go语言规范的存在使得开发者在实现Go编译器时可以依赖一致的标准&#xff0c;它确保了语言的稳定性和一致性&#…

Acwing 154. 滑动窗口

滑动窗口 输入: 8 3 1 3 -1 -3 5 3 6 7 输出&#xff1a; -1 -3 -3 -3 3 3 3 3 5 5 6 7 思路&#xff1a; 使用双端队列&#xff08;deque&#xff09;来维护一个区间的最值 具体做法&#xff1a; 双端队列里面存储元素的下标&#xff0c;我们先考虑如何维护区间里的数&#xf…

Elasticsearch讲解

1.Elasticsearch基本知识 1.基本认识和安装 Elasticsearch是由elastic公司开发的一套搜索引擎技术&#xff0c;它是elastic技术栈中的一部分。完整的技术栈包括&#xff1a; Elasticsearch&#xff1a;用于数据存储、计算和搜索 Logstash/Beats&#xff1a;用于数据收集 Kib…

Harbor的安装与使用

任务分析 一、规划节点 IP地址 主机名 节点 192.168.20.20 master 容器master节点 192.168.20.21 node 容器worker节点 二、基础准备 镜像使用CentOS7.9&#xff08;主机配置自定义&#xff0c;推荐配置4vCPU/12G内存/100G硬盘&#xff09;&#xff0c;使用这两台云…

【软设】计算机网络

【软设】计算机网络 一.OSI/RM七层模型 (七层模型还是要知道的&#xff0c;后面再去记一些协议&#xff0c;知道每一层应用在哪些方面&#xff0c;给你个东西或者协议你要能看得出来) OSI/RM&#xff08;Open Systems Interconnection Reference Model&#xff09;是国际标准…

63.HDMI显示器驱动设计与验证-彩条实验

&#xff08;1&#xff09;常见的视频传输接口有三种&#xff1a; VGA 接口、 DVI 接口和 HDMI 接口&#xff0c;目前的显示设备都配有这三种视频传输接口。三类视频接口的发展历程为 VGA→DVI→HDMI。其中 VGA 接口出现最早&#xff0c;只能传输模拟图像信号&#xff1b; 随后…

【libp2p——NAT】

1. 什么是NAT NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是指一种网络技术&#xff0c;它允许多个设备通过一个公共IP地址连接到互联网。NAT通常被用在家庭或小型办公室的路由器上&#xff0c;以允许多台计算机共享一个互联网连接。这种…