Rust API
qrcode-rust 和 qrcode-fast 是原生 Rust QRCode 生成库,提供极致的性能和完整的类型安全。
包对比
安装
qrcode-fast(推荐)
qrcode-rust
快速开始
qrcode-fast
qrcode-rust
QRCode 结构
qrcode-fast
qrcode-rust
方法
构造函数
new() - 创建默认实例
with_options() - 使用自定义选项
qrcode-fast:
qrcode-rust:
生成方法
make_code(text: &str) - 生成 QRCode
add_data(data: &str) - 添加数据(仅 qrcode-rust)
输出方法
get_svg() - 生成 SVG 字符串
is_dark(row: i32, col: i32) -> bool - 检查模块颜色
- qrcode-fast: 越界返回
false - qrcode-rust: 越界会 panic
get_module_count() -> i32 - 获取模块数量
终端输出方法(Terminal Output)
to_terminal(&self, invert: bool, quiet_zone: i32) -> String
将 QRCode 渲染为终端可显示的字符画。每个模块使用 2 个字符宽度,以补偿终端字符的高宽比。
to_terminal_braille(&self) -> String
使用 Braille 字符渲染更紧凑的终端二维码。每个 Braille 字符表示 2x4 像素,输出高度约为标准的 1/4。
to_terminal_color(&self, fg_color: &str, bg_color: &str) -> String
带颜色的终端输出(使用 ANSI 转义序列)。
支持的颜色:black, red, green, yellow, blue, magenta, cyan, white
QRCodeOptions
qrcode-fast
qrcode-rust
QRErrorCorrectLevel
纠错级别枚举:
QRCodeNative(仅 qrcode-rust)
QRCodeNative 提供了一个更简洁的 API,与 JavaScript 包保持一致:
QRCodeNative 方法
重新导出的模块
两个包都从 qrcode-rust-shared 重新导出了底层模块:
完整示例
基础使用
保存到文件
自定义颜色
批量生成
Web 服务器集成(Actix-web 示例)
性能对比
本节所有数字均取自权威数据文件
benchmark_speedup_verified.json。 历史上这里曾出现 37-75 倍等大幅倍率,那些数字来自一个「生成伪数据」的构建,产物并非真实二维码,已全部撤回。
测量口径
-
指标:端到端 SVG 生成(
make_code+get_svg()/ kennytm 的render().build()),三方实现同一进程内依次测量 -
采样:每个用例预热 20 次后重复 100 次,取算术平均值
-
正确性:使用 resvg 渲染 + rqrr 独立解码,必须还原为原始文本
-
环境:Windows x64,rustc 1.89.0,release (opt-level 3)
-
复现命令:
端到端 SVG 生成(平均值,越低越好)
汇总倍率区间(benchmark_speedup_verified.json 的 headline 字段):
同一份数据折算成吞吐量(由上表 µs 经 1e6 / µs 换算得出,仅作参考):
⚠️ 上述倍率为单机单次测量结果,不同 CPU 与编译器版本会有差异,应视为量级参考而非精确承诺, 也不表示
qrcode-fast在任何基准排行榜上都是第一名。
能力范围
benchmark_speedup_verified.json 的 capability 字段记录了当前的真实能力上限:
- qrcode-fast 与 qrcode-rust 均覆盖 Version 1-40,在纠错级别 H 下最大可解码长度 1273 字节(QR 标准上限)
- 两者已与 JS 实现对齐,长度上限不再有差异;实例复用(同一
QRCode反复编码不同长度文本)同样正常工作 - 验证方式为独立解码:产物经 resvg 渲染 + rqrr 解码,必须还原为原始文本
历史上曾存在一系列长度与正确性缺陷(get_min_version 的 take(10) 把版本锁在 Version 10、RS_BLOCK_TABLE 的 v15-H 占位符、qrcode-fast 对齐图案坐标表误用 v11 坐标、qrcode-rust 的 setup_type_number 空实现与实例复用未重置版本号),它们均已修复,明细见权威数据文件的 fixed_defects 数组。
复现全长度扫描:
选择指南
使用 qrcode-fast 当:
- 追求极致性能
- 需要处理大量 QRCode 生成
- 对内存使用敏感
- 不需要复杂的数据追加功能
使用 qrcode-rust 当:
- 需要
QRCodeNative的简洁 API - 需要自定义宽高选项
- 需要
data_cache进行调试 - 需要二维模块访问
测试
注意事项
- 线程安全:
QRCode不是Send或Sync,不要在多线程间共享实例 - 内存管理: Rust 会自动管理内存,无需手动释放
- 错误处理: 无效输入会产生有效的 QRCode,但可能无法被扫描
- SVG 尺寸:
get_svg()默认生成 256x256 的 SVG