二维码之zxing二维码解析图片资源.docx_第1页
二维码之zxing二维码解析图片资源.docx_第2页
二维码之zxing二维码解析图片资源.docx_第3页
二维码之zxing二维码解析图片资源.docx_第4页
二维码之zxing二维码解析图片资源.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

二维码之zxing二维码解析图片资源前面讲了如何利用zxing生成二维码图像以及仿照新浪微博方式生成二维码。接下来,就要开始谈到如何利用zxing解析二维码图像。zxing针对不同开发平台,都给出了解析二维码的例子,我这里只聊聊关于android系统的解析。对于android手机来说,二维码图像获取方式有拍照扫描,以及读取本地图片资源。无论是哪种方式,解析过程的核心内容基本是一样的。关于手机拍照扫描这块,由于要涉及到很多问题要讲,所以我打算把这块放在下篇文章再细致讲解,这次只讲如何对图片进行解析。首先,和生成二维码一样,我们要告诉系统解析二维码的设置参数。这里我选择了支持主流的三类方式,其中一种为一维码(条形码)。设置解析的字符位UTF8。如果不设置字符解析方式,它会自己去识别内容,然后自己判断该用哪种方式。看一下设置参数的代码:MultiFormatReader multiFormatReader = new MultiFormatReader();/ 解码的参数Hashtable hints = new Hashtable(2);/ 可以解析的编码类型Vector decodeFormats = new Vector();if (decodeFormats = null | decodeFormats.isEmpty() decodeFormats = new Vector();/ 这里设置可扫描的类型,我这里选择了都支持decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS);decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);/ 设置继续的字符编码格式为UTF8/ hints.put(DecodeHintType.CHARACTER_SET, UTF8);/ 设置解析配置参数multiFormatReader.setHints(hints);补一句:zxing源码中对UTF8的定义字符串内容不是UTF-8,而是UTF8。private static final String UTF8 = UTF8; 再来就是解析部分:/ 开始对图像资源解码Result rawResult = null;try rawResult = multiFormatReader.decodeWithState(new BinaryBitmap(new HybridBinarizer(new BitmapLuminanceSource(BitmapFactory.decodeResource(getResources(),R.drawable.weibo); catch (NotFoundException e) e.printStackTrace();按照zxing的解码规则,需要传入一个LuminanceSource类的对象,最后就会得到解析结果result对象,也就是解码后的信息类。这里唯一需要自己实现的就是BitmapLuminanceSource类。BitmapLuminanceSource继承自LuminanceSource这个抽象类,需要实现它的构造方法,并重载getMatrix()和getRow(int y, byte row)方法。其构造方法中需要传入宽高,这两个值指的就是图片的宽和高。getMatrix()方法会返回一个byte数组,这个数组就是图片的像素数组。getRow(int y, byte row)如字面的意义,就是得到图片像素数组的一行。其中的y就是需要的哪一个行的像素数组。先看构造方法:protected BitmapLuminanceSource(Bitmap bitmap) super(bitmap.getWidth(), bitmap.getHeight();/ 首先,要取得该图片的像素数组内容int data = new intbitmap.getWidth() * bitmap.getHeight();this.bitmapPixels = new bytebitmap.getWidth() * bitmap.getHeight();bitmap.getPixels(data, 0, getWidth(), 0, 0, getWidth(), getHeight();/ 将int数组转换为byte数组for (int i = 0; i data.length; i+) this.bitmapPixelsi = (byte) datai;注意:这里的byte数组是指图片的像素数组,而不是所谓Bitmap转换成byte数组,有人出现解析的错误,大多是对这个参数用途没理解造成的。Bitmap对象的getPixels方法可以取得的像素数组,但它得到是int型数组。根据其api文档解释,取得的是coler,也就是像素颜色值。每个像素值包含透明度,红色,绿色,蓝色。所以白色就是0xffffffff,黑色就是0xff000000。直接由int型转成byte型,实现上相当于我们这里只取其蓝色值部分。 再来就是getRow方法:Overridepublic byte getRow(int y, byte row) / 这里要得到指定行的像素数据System.arraycopy(bitmapPixels, y * getWidth(), row, 0, getWidth();return row;补充:getPixels得到的像素数组是一维的,也就是按照图片宽度逐行取像素颜色值录入。如果想得到单行的像素数组内容,通过y*width就可以找该行的第一个像素值,拷贝后面width个就可以得到该行的像素内容。最后一个就是getMatrix()方法,它用来返回我们的图像转换成的像素数组。Overridepublic byte getMatrix() / 返回我们生成好的像素数据return bitmapPixels;以下是完整的BitmapLuminanceSource类: public class BitmapLuminanceSource extends LuminanceSource private byte bitmapPixels;protected BitmapLuminanceSource(Bitmap bitmap) super(bitmap.getWidth(), bitmap.getHeight();/ 首先,要取得该图片的像素数组内容int data = new intbitmap.getWidth() * bitmap.getHeight();this.bitmapPixels = new bytebitmap.getWidth() * bitmap.getHeight();bitmap.getPixels(data, 0, getWidth(), 0, 0, getWidth(), getHeight();/ 将int数组转换为byte数组,也就是取像素值中蓝色值部分作为辨析内容for (int i = 0; i data.length; i+) this.bitmapPixelsi = (byte) datai;Overridepublic byte getMatrix() / 返回我们生成好的像素数据return bitmapPixels;Overridepublic byte getRow(int y, byte row) / 这里要得到指定行的像素数据System.arraycopy(bitmapPixels, y * getWidth(), row, 0, getWidth();return row;好了,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论