当前位置: 首页 > news >正文

轻量级二维码生成器

提起 Java 的二维码生成器,相信大家都会想起 ZXing(Zebra Crossing),可是当笔者搜索 ZXing 的替代时候,却发现难以替代——原本想着有没有几个类简简单单地就可以实现二维码生成的,却几乎没有,倒是其他语言例如 JavaScript 就有原生生成二维码的,而且 Java 更多的,是基于 ZXing 的封装方案。当然了,单凭笔者自身的水平,写是不可能自己去写一个出来的——顶多只能学习、观摩别人开源的,进一步再加以封装而已。在机缘巧合的情况下,笔者终于一个轻量级的二维码生成项目: 来自日本 Nayuki 大神的 QR Code generator library https://github.com/nayuki/QR-Code-generator,仅仅若干关键几个类就可以生成二维码,而且功能不弱,文档注释丰富,是学习二维码生成原理的好项目。

QR-Code-generator 特点如下:

  • 除了 JDK 免依赖
  • 支持编码所有40个版本(大小)和所有4个错误校正级别,符合 QR Code 模型2 标准
  • 输出格式:QR 码符号的原始模块/像素
  • 比其他实现更准确地检测定位符类似的惩罚模式
  • 编码数字和特殊字母数字文本时占用的空间比一般文本少
  • 用户可以指定允许的最小和最大版本号,然后库将自动选择范围内适合数据的最小版本
  • 用户可以手动指定掩码模式,否则库将自动评估所有8个掩码并选择最优的一个
  • 用户可以指定绝对错误校正级别,或允许库在不增加版本号的情况下提升它
  • 用户可以手动创建数据段列表并添加 ECI 段
  • 将日文 Unicode 文本编码为汉字模式,与 UTF-8 字节相比可节省大量空间
  • 为包含混合数字/字母数字/一般/汉字部分的文本计算最优的段模式切换
  • 支持 png/svg 格式导出

笔者在 QR-Code-generator 基于上重构,fork 出了一个开源版本:https://github.com/lightweight-component/aj-qrcode,改善如下:

  • 原本提供普通版本和加速版本(原作者有优化)的,现在重构后合并在一个工程,均可调用两者
  • 把不规范的注释重新整理,并补充了部分注释、翻译了部分注释
  • 进一步精简代码

Maven 坐标

<dependency><groupId>com.ajaxjs</groupId><artifactId>aj-qrcode</artifactId><version>1.0</version>
</dependency>

Java Documents: https://dev.ajaxjs.com/docs/javadoc/aj-qrcode/。

用法

String text = "Hello, world!";          // User-supplied Unicode text
Ecc errCorLvl = Ecc.LOW;  // Error correction level
QrCode qr = QrCode.encodeText(text, errCorLvl);  // Make the QR Code symbolBufferedImage img = Utils.toImage(qr, 10, 4);          // Convert to bitmap image
File imgFile = new File("hello-world-QR.png");   // File path for output
ImageIO.write(img, "png", imgFile);              // Write image to fileString svg = Utils.toSvgString(qr, 4, "#FFFFFF", "#000000");  // Convert to SVG XML code
File svgFile = new File("c:\\temp\\hello-world-QR.svg");          // File path for output
Files.write(svgFile.toPath(), svg.getBytes(StandardCharsets.UTF_8)); // Write image to file

相关文章:

  • 银河麒麟4.0.2安装带有opengl的Qt5.12.9
  • 解锁Flutter中的ProcessResult:让外部命令执行变得轻松
  • 机器人----控制方式
  • 深度学习 --- stanford cs231学习笔记五(训练神经网络的几个重要组成部分 二)
  • 开源AGV调度系统OpenTCS中的路由器(router)详解
  • 检查HIVE分区是否连续
  • Python第二语言(十三、PySpark实战)
  • 使用Python进行机器学习入门指南
  • 【机器学习】从理论到实践:决策树算法在机器学习中的应用与实现
  • Android SDK是什么?
  • hadoop/hive/DBeaver启动流程
  • 告别夏季粉尘螨虫困扰,这些空气净化器品牌你不能错过!
  • K8s持久化存储PV和PVC(通俗易懂)
  • mvn dependency -D outputFile=dependency_tree.txt
  • Shell 编程之正则表达式与文本处理器
  • 【译】JS基础算法脚本:字符串结尾
  • Android系统模拟器绘制实现概述
  • Android优雅地处理按钮重复点击
  • C++类中的特殊成员函数
  • CAP 一致性协议及应用解析
  • CSS实用技巧干货
  • ES6语法详解(一)
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • java 多线程基础, 我觉得还是有必要看看的
  • java8-模拟hadoop
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue自定义指令实现v-tap插件
  • 讲清楚之javascript作用域
  • 回归生活:清理微信公众号
  • # Apache SeaTunnel 究竟是什么?
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #laravel 通过手动安装依赖PHPExcel#
  • (1)(1.9) MSP (version 4.2)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Python第六天)文件处理
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (rabbitmq的高级特性)消息可靠性
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (五)Python 垃圾回收机制
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)可以带来幸福的一本书
  • (转)母版页和相对路径
  • .net web项目 调用webService
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET中winform传递参数至Url并获得返回值或文件
  • .sh 的运行
  • @AliasFor注解
  • @Autowired注解的实现原理
  • [20150904]exp slow.txt
  • [AIGC 大数据基础]hive浅谈
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现