ZXing:一个扫描条码的基础库
文章目录
- ZXing:一个扫描条码的基础库
- 这个库能干什么
- 为什么要用它
- 移植到其他语言
- 怎么用
- 现在的状态
- 适合什么场景
ZXing:一个扫描条码的基础库
zxing 在 GitHub 上拿了 33,996 Star。
Google 开源的这个库,专门做一件事,识别和解码各种格式的条形码和二维码。Java 写的,但已经被移植到几乎所有主流语言平台。
这个库能干什么
一句话:把图片里的条码信息读出来。
支持的格式覆盖面很广。一维码包括 UPC-A、UPC-E、EAN-8、EAN-13、Code 39、Code 93、Code 128、Codabar、ITF 这些常见的商品码和工业码。二维码包括 QR Code、Data Matrix、Aztec、PDF 417、MaxiCode,还有 RSS-14 和 RSS-Expanded。
基本上你在超市货架、快递包裹、登机牌、证件上看到的码,它都能识别。
为什么要用它
做过条码识别功能的开发者都知道,自己写一套解码逻辑有多麻烦。光照不均匀、角度倾斜、印刷模糊、多种码制混用,每一种情况都要单独处理。ZXing 把这些底层问题都解决了,你只需要传一张图片进去,它返回解码结果。
库本身是 Java 写的,模块拆得很清晰。core 是核心解码逻辑,javase 处理 JavaSE 平台的图像加载,android 是 Android 客户端,android-integration 通过 Intent 让其他 App 调用扫码功能。每个模块各司其职,按需引入。
移植到其他语言
ZXing 原生是 Java,但社区把它搬到了几乎所有你能想到的语言平台。
C++ 移植有两个主要版本,一个是 glassechidna/zxing-cpp,另一个是更活跃的 zxing-cpp/zxing-cpp,后者还提供了 Android、C、iOS、.NET、Rust、Python、WASM 和 WinRT 的绑定。.NET 平台有 ZXing.Net,TypeScript 有 zxing-js/library,Python 有 pyzxing,Rust 有 rxing,Dart 有 zxing-dart,PHP 有两个版本的移植,Ruby 有 zxing_cpp.rb,Delphi 有 ZXing.Delphi,Objective-C 有 ZXingObjC。
基本上不管你用什么技术栈,都能找到对应的版本。
怎么用
以 Java 为例,Maven 引入 core 和 javase 两个模块就行。调用方式也简单,读取图片文件,创建 MultiFormatReader,调用 decode 方法,拿到 Result 对象,里面就是解码后的文本内容。
Android 上可以通过 Intent 集成,不用自己写扫码界面。用户点一个按钮,跳到 ZXing 的扫码 Activity,结果通过 onActivityResult 回传。
现在的状态
这个项目目前处于维护模式。只接受 bug 修复和小改进,没有新功能开发计划。Android 端的 Barcode Scanner 应用已经不适配 Android 14,也不会再更新了。
但维护模式不代表没价值。它的核心解码算法被大量第三方项目依赖,很多扫码功能的底层都是 ZXing。那些语言移植版本也在持续更新,zxing-cpp/zxing-cpp 这个 C++ 版本的活跃度就很高。
适合什么场景
- 需要在应用里加条码识别功能,不想自己写解码算法的开发者
- 做物联网、物流、零售系统,需要批量处理条码数据的场景
- 用的技术栈不是 Java,但需要条码识别能力的团队,可以找对应语言的移植版本
- 需要同时支持多种码制,不想为每种码单独集成库的项目
33,996 Star 不是白给的。十几年的打磨,覆盖了市面上绝大多数码制,社区移植版本遍布各语言平台。就算原项目不再活跃开发,它依然是条码识别这个领域里最稳的选择之一。
多数码制,社区移植版本遍布各语言平台。就算原项目不再活跃开发,它依然是条码识别这个领域里最稳的选择之一。
