提起 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