Java二维码学习

使用Java语言生成二维码有以下方式,一是谷歌的zxing,二是基于zxing实现的qrcode开源项目,三是基于zxing实现的qrgen开源项目

一 zxing

谷歌的zxing技术生成二维码,是MultiFormatWriter多写格式书写器生成BitMatrix位矩阵,然后将位矩阵的信息在BufferedImage中设置二维码图片,最后由ImageIO将二维码图片写出到文件。

1.1 生成普通二维码

<dependencies><!-- 二维码操作相关依赖 --><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><!-- word文档操作相关依赖 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency>
</dependencies>
public static void main(String[] args) throws WriterException, IOException, InvalidFormatException {String str = "Yesterday Once More";final String CHARSET = "UTF-8";final int QRCODE_SIZE = 100;// EncodeHintType编码提示类型, 用来设置二维码图片的相关参数// Map集合使用Hashtable和HashMap都可以// Hashtable是线程安全的,但同步会带来性能损耗// HashMap是非线程安全,但在单线程环境下效率更高Map<EncodeHintType, Object> hints = new Hashtable<>();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 0);// MultiFormatWriter多格式书写器, 是二维码生成类// BitMatrix位矩阵, 是布尔型二维数组, 表示二维码矩阵的数据结构BitMatrix bitMatrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();// BufferedImage图像类, 提供了对图像像素级别的访问和修改BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {bufferedImage.setRGB(i, j, bitMatrix.get(i, j) ? 0x000000 : 0xFFFFFF);}}ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// ImageIO标准图像输入输出工具类, 用于读取、写入和处理各种格式的图像文件ImageIO.write(bufferedImage, "jpg", byteArrayOutputStream);ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());// XWPFDocument类位于Apache POI库中的poi-ooxml模块中, 用于操作Microsoft Word(.docx)文档XWPFDocument document = new XWPFDocument();XWPFRun run = document.createParagraph().createRun();run.addPicture(byteArrayInputStream, XWPFDocument.PICTURE_TYPE_JPEG, "mango", Units.toEMU(128), Units.toEMU(128));FileOutputStream fileOutputStream = new FileOutputStream("D:\\mango.docx");document.write(fileOutputStream);fileOutputStream.close();
}

生成的二维码如下:

EncodeHintType编码提示类型是一个枚举类,用来设置二维码图片的相关属性,使用EncodeHintType作为key,Object作为value的Hashtable,常用设置如下:
    EncodeHintType.ERROR_CORRECTION设置二维码的容错率,value值ErrorCorrectionLevel也是枚举类,由L(7%)、M(15%)、Q(25%)和H(30%)四个可选项;
    EncodeHintType.CHARACTER_SET设置字符集,value值可以设置UTF-8;
    EncodeHintType.MARGIN设置二维码周边留白大小,value值是一个整型数值;

MultiFormatWriter多格式书写器, 是二维码生成类,MultiFormatWriter的encode方法可以将指定文本生成BitMatrix位矩阵对象,encode方法定义如下
public BitMatrix encode(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType, ?> hints),参数解释:
    String contents:要生成二维码的文本内容;
    BarcodeFormat format:指定码的格式,BarcodeFormat是枚举值,常用枚举值有QR_CODE(通用二维码,支持文本和链接URL),CODE_128(条形码,支持物流和商品管理)和EAN_13(国际商品编码,广泛用于零售商品‌);
    int width:二维码的宽度(像素);
    int height:二维码的高度(像素);
    Map<EncodeHintType, ?> hints:二维码图片的相关属性,Map集合使用Hashtable和HashMap都可以,Hashtable是线程安全的,但同步会带来性能损耗,HashMap是非线程安全,但在单线程环境下效率更高;

BitMatrix表示二维码矩阵的数据结构,由0和1构成的布尔型二维数组,常用于将编码后的信息转化为矩阵形式,用于存储和处理生成二维码图像所需的二进制信息,通过对BitMatrix对象的构建和操作,最终生成一个可被扫描解码的二维码图像,BitMatrix常用API:
    public int getHeight():获取二维码矩阵高度;
    public int getWidth():获取二维码矩阵宽度;
    public boolean get(int x, int y):根据x,y的坐标获取矩阵中该坐标的值,结果是true(有值)或者false(无值);

BufferedImage缓冲区图像类,将一幅图片加载到内存中(BufferedImage生成的图片在内存里有一个图像缓冲区),在缓冲区操作图片资源,而且提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常用来做图片大小变换、图片变灰、设置透明不透明等;
ImageIO是Java的标准图像输入输出工具类,用于读取、写入和处理各种格式的图像文件;

1.2 生成彩色二维码

在设置BufferedImage对象的setRGB方法中,设置RGB颜色时,指定需要的颜色即可,譬如生成前景色为纯蓝色的二维码,使用0x0000FF进行RGB设置

// BufferedImage图像类, 提供了对图像像素级别的访问和修改
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {bufferedImage.setRGB(i, j, bitMatrix.get(i, j) ? 0x0000FF : 0xFFFFFF);}
}

1.3 生成带logo的二维码

public static void main(String[] args) throws WriterException, IOException, InvalidFormatException {String str = "Yesterday Once More";final String CHARSET = "UTF-8";final int QRCODE_SIZE = 100;// EncodeHintType编码提示类型, 用来设置二维码图片的相关参数// Map集合使用Hashtable和HashMa

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

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

相关文章

工业质检/缺陷检测领域最新顶会期刊论文收集整理 | AAAI 2025【持续更新中】

会议官方论文列表&#xff1a;https://ojs.aaai.org/index.php/AAAI/issue/view/624 其中&#xff0c;2025年是第三十九届AAAI人工智能大会&#xff0c;主要对第三十九届相关论文进行梳理&#xff0c;当前已初版28期(volume 39 no. 28) 【Attention】 虽然本文主要面向的领域…

数据结构实验8.1:图的基本操作

文章目录 一&#xff0c;实验目的二&#xff0c;实验内容三&#xff0c;实验要求四&#xff0c;算法分析五&#xff0c;示例代码8-1.cpp源码graph.h源码 六&#xff0c;操作步骤七&#xff0c;运行结果 一&#xff0c;实验目的 1&#xff0e;掌握图的邻接矩阵、邻接表的表示方…

Spring Boot3 实现定时任务 每10分钟执行一次,同时要解决分布式的问题 区分不同场景

在Spring Boot 3中实现分布式定时任务&#xff0c;确保多实例环境下任务仅执行一次&#xff0c;可以采用以下方案&#xff1a; 方案一&#xff1a;Redis分布式锁&#xff08;推荐&#xff09; import org.springframework.data.redis.core.StringRedisTemplate; import org.sp…

WPF MVVM入门系列教程(五、命令和用户输入)

&#x1f9ed; WPF MVVM入门系列教程 一、MVVM模式介绍二、依赖属性三、数据绑定四、ViewModel五、命令和用户输入六、ViewModel案例演示 WPF中的命令模型 在WPF中&#xff0c;我们可以使用事件来响应鼠标和键盘动作。 但使用事件会具备一定的局限性&#xff0c;例如&#x…

2025年01月09日德美医疗前端面试

目录 vue2 的双向绑定的原理vue3 的双向绑定原理vue 的生命周期vue 子组件为何不能修改父组件的值js delete 删除数组的某一个值会怎么样vue 和 react 的 diff 算法什么是闭包原型链this指向 vue2 的双向绑定的原理 以下是 Vue 2 双向绑定的原理&#xff1a; 1. 核心概念 …

知识图谱 + 大语言模型:打造更聪明、更可靠的AI大脑 —— 探索 GraphRAG 中文优化与可视化实践

大语言模型&#xff08;LLMs&#xff09;无疑是近年来人工智能领域最耀眼的明星。它们强大的自然语言理解和生成能力&#xff0c;在文本创作、代码生成、对话交互等众多领域展现了惊人的潜力。然而&#xff0c;当前的 LLMs 并非完美无缺&#xff0c;它们常常面临着“幻觉”&…

【uniapp】在UniApp中检测手机是否安装了某个应用

1. 使用plus.runtime.isApplicationExist&#xff08;仅限App端&#xff09; // 判断应用是否安装 function checkAppInstalled(packageName) {if (uni.getSystemInfoSync().platform android || uni.getSystemInfoSync().platform ios) {// 仅App端可用if (typeof plus ! u…

使用 Vue + Axios 构建与后端交互的高效接口调用方案

使用 Vue Axios 构建与后端交互的高效接口调用方案 在 Vue 前端开发中&#xff0c;与后端接口的数据交互是非常核心的部分。而 Axios 是 Vue 项目中最常用的 HTTP 客户端&#xff0c;具备基于 Promise、拦截器、自定义实例等诸多优势。 本篇将深入介绍如何基于 Vue 搭配 Axi…

RN学习笔记 ✅

太无聊了最近&#xff0c;找点事做&#xff0c;学一下RN丰富一下技术栈&#x1fae1;。但是开发APP除了RN&#xff0c;还有一种选择就是WebView&#xff0c;但是基于WebView的APP的性能被普遍认为不如RN&#xff0c;因为WebView本质上是一个容器&#xff0c;用于在应用中嵌入网…

聊天助手提示词调优案例

一、背景 今天有粉丝说自己的聊天助手提示词输出的效果不好&#xff0c;输出的内容不是太呆板就是太浮夸&#xff0c;希望更像真人一样。 本文介绍几个调优方法&#xff0c;希望对大家有启发。 二、调优 《系统掌握大语言模型提示词 - 从理论到实践》提示词小册中介绍了很多…

5.6 react组件化开发基础

react 组件开发基础 组件分类与组件使用 组件传参 父传子 【函数数据传值 实参 形参对应关系】 子传父 插槽 透传 useContext 上下文&#xff08;作用域&#xff09; 跨层级调用方法 通过子组件的实例对象useRef 直接调用子组件的方法 和数据 状态管理&#xff08;非常多…

【SF顺丰】顺丰开放平台API对接(Java对接篇)

对接前置篇&#xff1a; 【SF顺丰】顺丰开放平台API对接&#xff08;注册、API测试篇&#xff09;_顺丰api接口对接指南-CSDN博客 1.实现效果展示 2.SF顺丰开放平台&#xff0c;JDK资源下载。 下载地址&#xff1a;顺丰开放平台 3.将下载的JDK放入项目中。 4.将JDK资源引入p…

我用cursor 搭建了临时邮箱服务-Temp Mail 365

用业余时间搭建了一个临时邮箱&#xff0c;对于后端程序员出身的我&#xff0c;对前端了解的不太多&#xff0c;有了cursor的帮助&#xff0c;补齐了自己的短板&#xff0c;搭建了这个服务&#xff0c;下面对临时邮箱架构设计与安全性做一个分析。 https://temp-mail-365.com 临…

破解工业3D可视化困局,HOOPS Visualize助力高效跨平台协作与交互!

一、当前3D可视化面临的痛点 &#xff08;1&#xff09;性能瓶颈 现有的许多3D可视化工具在处理大型复杂模型时往往力不从心。例如在航空航天、汽车制造等高端制造业&#xff0c;动辄涉及数以亿计的三角面片和海量的纹理细节。这些超大规模的模型在渲染时常常出现卡顿、延迟&…

1、Kafka与消息队列核心原理详解

消息队列&#xff08;Message Queue, MQ&#xff09;作为现代分布式系统的基础组件&#xff0c;极大提升了系统的解耦、异步处理和削峰能力。本文以Kafka为例&#xff0c;系统梳理消息队列的核心原理、架构细节及实际应用。 Kafka 基础架构及术语关系图 术语简要说明 Produce…

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛初赛-wp

- -考试当场没做出来 后面做的 misc ❯ cd misc ❯ ls num.docx num.zip ❯ unzip num.docx Archive: num.docxinflating: [Content_Types].xmlinflating: _rels/.relsinflating: word/document.xmlinflating: word/_rels/document.xml.relsextracting: word/media/image1.jp…

JavaScript 到命令和控制 (C2) 服务器恶意软件分析及防御

攻击始于一个经过混淆的JavaScript文件,该文件从开源服务中获取编码字符串以执行PowerShell脚本。然后,该脚本从一个IP地址和一个URL缩短器下载一个JPG图像和一个文本文件,这两个文件都包含使用隐写术嵌入的恶意MZ DOS可执行文件。这些有效载荷一旦执行,就会部署Stealer恶意…

【计网】ipconfig、ping、arp、tracert

目录 ipconfig ping arp tracert cmd ipconfig ipcofig -all IPv4 物理地址 ping 检测网络连通情况&#xff0c;分析网络速度 根据域名得到服务器IP 根据TTL判断对方所使用的操作系统以及数据包经过路由器数量 byte数据包大小 time响应时间 TTLDNS记录在DNS服务器上存在…

WiFi那些事儿(八)——802.11n

目录 802.11n 技术简介与测试项 一、802.11n 技术简介 &#xff08;一&#xff09;标准概述 &#xff08;二&#xff09;关键技术特性 1. MIMO&#xff08;多输入多输出&#xff09;技术 2. 信道绑定&#xff08;Channel Bonding&#xff09; 3. 帧聚合&#xff08;Fram…

码蹄集——直角坐标到极坐标的转换、射线、线段

目录 MT1052 直角坐标到极坐标的转换 MT1066 射线 MT1067 线段 MT1052 直角坐标到极坐标的转换 思路&#xff1a; arctan()在c中是atan()&#xff0c;结果是弧度要转换为度&#xff0c;即乘与180/PI 拓展&#xff1a;cos()、sin()在c代码中表示方式不变 #include<bits/…