
什么是ZBar
ZBar是一个开源库,用于扫描、读取二维码和条形码。支持的二维码包括:EAN/UPC,QR等
如果你是一个iPhone应用开发人员,做到二维码模块的时候,是不是会考虑ZBar开源项目来助你一臂之力呢?可是我这里说的是Android平台的开发,我为什么提到ZBar项目呢,难道我要用ZBar在Android平台扫描二维码吗?对的,没有错!这将会是一个极其不错的选择。为什么这么说呢,不是很多Android开发都是用ZXing来解析二维码的么?好吧,ZXing是我下一篇文章要写的,这里先抛砖引玉说一点点。我将ZXing和ZBar做一个比较,说说它们的优缺点,便于大家的取舍。
- ZXing项目的示例程序对于摄像头的控制写的非常全面,ZBar的没有
- ZBar基于C语言编写,解码效率高于ZXing项目
- ZBar是日本人写的,对于中文解析会乱码这个肯定有人遇到过的,ZXing不会乱码
- 扫描框的绘制,ZXing的扫描框绘制是自定义View的,截取区域不好控制(至少我没控制好),ZBar的可以自定义,只要你会计算截取区域
这里需要着重说一下第四点,我也是沿着解决这个第四点和第二点的问题才思考了这么多东西的。好烦躁自己的这种强迫症啊
下载ZBar项目
- ZBar官网: http://zbar.sourceforge.net/
- ZBar GitHub地址: https://github.com/ZBar/ZBar
编写ZBar示例程序
ZBar示例程序主要通过ZBar解码截取区域计算,源码编译和Android示例项目三方面来展开
着重介绍一下扫描截取界面的计算
- pt:预览图中二维码图片的左上顶点坐标,也就是手机中相机预览中看到的待扫描二维码的位置
- qrheight:预览图中二维码图片的高度
- qrwidth:预览图中二维码图片的宽度
- pheight:预览图的高度,也即camera的分辨率高度
- pwidth:预览图的宽度,也即camera的分辨率宽度
- st:布局文件中扫描框的左上顶点坐标
- sheight:布局文件中扫描框的高度
- swidth:布局文件中扫描框的宽度
- cheight:布局文件中相机预览控件的高度
- cwidth:布局文件中相机预览控件的宽度
其中存在这样一个等比例公式
|
|
即:
|
|
以上ptx,pty,qrwidth,qrheight四个参数也就是ZBar中解码是需要crop时传入的四个参数,如此便知道了截取区域应该如何计算了。这样扫描的灵活性都大大增强了
ZBar中文乱码的解决
ZBar扫描含有中文的二维码图片时,结果是乱码的,所以需要修改c文件重新编译打包so文件才行。
需要修改的文件是zbar/qrcode/qrdextxt.c文件
将
|
|
修改为:
|
|
重新编译zbar生成so文件
这个真的需要一定的NDK开发经验了,我个人只是了解一点点NDK的知识,所以在网上找到了一个大神的博客一步一步做下来才算是编译完成了。
其中NDK开发环境搭建可以参考: http://www.eoeandroid.com/forum.php?mod=viewthread&tid=272919
ZBar项目编译可以参考: http://magiclen.org/zbar/
ZBar编译项目结构
ZBar编译后生成的so文件
编写Android示例程序
安卓示例程序主要是通过提取ZXing项目中的扫描界面处理代码和ZBar解码模块相结合的方式来实现的
安卓工程结构
布局界面代码
|
|
扫描Activity关键代码
|
|
运行效果图
项目地址: 猛戳跳转