前一篇给大家介绍了YUV图像格式,这一篇将会对zxing库,以及YUV图像和RGB图像的亮度信息提取做一下介绍。
zxing是google提供的一个开源的条码处理的库,可支持maxicode、qrcode、pdf17等多种条码,github地址如下: https://github.com/zxing/zxing
可以看出,内容还是非常多的,我们用到的也是只其中的核心部分,都在core包里面,这里提供一个打包好的zxing.jar给大家来用,或者你可以自己下载了源码自己打包。 zxing.jar下载:
http://www.codernote.top/static/blog/file/2016/03/zxing_20160325165738.zip
下面我们来看看zxing库的用法 [二维码生成] 二维码生成主要是使用QRCodeWriter这个类,encode()方法传入需要编码的字符串,会返回一个BitMatrix,然后我们把它转化转化为Bitmap可用的byte[]类型数据,就可以生成Bitmap了。
BitMatrix的get()方法返回的是boolean类型的数据,true代表二维码深色像素,false代表二维码浅色像素。注意,深色和浅色如果颜色差别不够明显,二维码有可能将无法识别,差别越大,识别成功率越高。所以一般推荐使用黑色和白色来显示二维码。 [二维码识别] 二维码识别可使用QRCodeReader或者MultiFormatReader这两个类,区别是,后者可以识别除了二维码之外的一些条码。本例中使用的是MultiFormatReader。
首先我们需要把图像源数据转换为可识别的亮度信息,zxing提供了LuminanceSource这个抽象类,根据不同的图像类型,其中的getMatrix()方法和getRow()方法需要自己来实现。zxing也提供好了planar类型的YUV图像和RGB图像的LuminanceSource,只需要传入源数据即可。
本例中改写了这两个类,增加了灰度图像Bitmap生成的方法。不管是用zxing提供的,还是自己来改写,了解了原理,写代码就很简单了。YUV图像和RGB图像如何提取亮度信息后面会讲到,这里先把zxing讲完。 LuminanceSource需要封装为HybridBinarizer,再封装为BinaryBitmap,然后通过MultiFormatReader.decodeWithState()方法进行二维码解析,解析失败会抛出异常,解析成功返回一个Result类型的结果,使用Result.getText()方法就可以得到解析后的字符串了。
注意,二维码的解析是耗时操作,为避免ANR,我们要把它放到子线程里,本例中使用的是AsyncTask。 [亮度信息处理] 对于YUV图像,前一篇已经介绍过。相对于RGB图像来说,YUV图像提取亮度信息很简单,只保留Y数据,忽略UV数据即可。相机返回的数据,大都是YUV类型数据。
如果是识别本地图像,我们需要对RGB图像做亮度信息的计算。前一篇也有介绍如何通过RGB数据来计算亮度信息,还记得这个公式么: Y = 0.299 R + 0.587 G + 0.114 B
不过在实际写代码的过程中,浮点运算太过麻烦和耗时,我们可以改变下公式,得到一个近似值就可以了: Y = (R + 2*G + B)/4 或者 Y = (R + G + G + B) >> 2
通过上面的公式就可以得到亮度信息的近似值。 关于Android二维码的应用就介绍到这里,欢迎大家多多关注。
源码地址:https://github.com/xushanmeng/QRCodeScannerDemo