Android 二维码 生成和识别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二维码:
是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;
在代码编制上巧妙的利用构成计算机内部逻辑基础的0和1比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图像输入设备或光电扫描设备自动识读以实现信息自动处理;
二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息;
二维码相对于条形码的优势就是省空间;
zxing简介:
zxing是一个开放源码的,用java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的接口。
zxing可以实现使用手机的内置的摄像头完成条形码和二维码的扫描与解码。
zxing可以实现条形码和二维码的编码与解码。
zxing目前支持的的格式如下:
UPC-A,UPC-E
EAN-8,EAN-13
39码
93码
代码128
QR码
Android上zxing的使用:
这里使用的时候可以有两种形式:
1.将zxing的jar包放到工程的lib库中,然后还要拷贝相应的类源码到工程中去,整个文件夹拷贝过去也是很快的;
2.将已经弄好zxing的工程作为当前工程的依赖库,然后直接使用就可以了;
如图:
下面来通过一个实例来完成以下三个功能:
1.生成二维码;
2.解析二维码图片;
3.扫描二维码并解析;
最终效果是这样的:
在我们新建工程之前,我们必须将依赖库导入到Eclipse中,依赖库的原工程文件夹我已经打包,文章最后面有链接可以下载。
识别二维码(识别图片)这个功能需要用到一个名叫RGBLuminanceSource的类,这个类的内容如下:
[java]view plaincopy
1.import java.io.FileNotFoundException;
2.
3.import android.graphics.Bitmap;
4.import android.graphics.BitmapFactory;
5.
6.import com.google.zxing.LuminanceSource;
7.
8.public class RGBLuminanceSource extends LuminanceSource {
9.private final byte[] luminances;
10.
11.public RGBLuminanceSource(Bitmap bitmap) {
12.super(bitmap.getWidth(), bitmap.getHeight());
13.//得到图片的宽高
14.int width = bitmap.getWidth();
15.int height = bitmap.getHeight();
16.//得到图片的像素
17.int[] pixels = new int[width * height];
18.//
19. bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
20.//为了测量纯解码速度,我们将整个图像灰度阵列前面,这是一样的通道
21.// YUVLuminanceSource在现实应用。
22.//得到像素大小的字节数
23. luminances = new byte[width * height];
24.//得到图片每点像素颜色
25.for (int y = 0; y < height; y++) {
26.int offset = y * width;
27.for (int x = 0; x < width; x++) {
28.int pixel = pixels[offset + x];
29.int r = (pixel >> 16) & 0xff;
30.int g = (pixel >> 8) & 0xff;
31.int b = pixel & 0xff;
32.//当某一点三种颜色值相同时,相应字节对应空间赋值为其值
33.if (r == g && g == b) {
34. luminances[offset + x] = (byte) r;
35. }
36.//其它情况字节空间对应赋值为:
37.else {
38. luminances[offset + x] = (byte) ((r + g + g + b) >> 2);
39. }
40. }
41. }
42. }
43.
44.public RGBLuminanceSource(String path) throws FileNotFoundException {
45.this(loadBitmap(path));
46. }
47.
48.
49.@Override
50.public byte[] getMatrix() {
51.return luminances;
52. }
53.
54.@Override
55.public byte[] getRow(int arg0, byte[] arg1) {
56.if (arg0 < 0 || arg0 >= getHeight()) {
57.throw new IllegalArgumentException(
58."Requested row is outside the image: " + arg0);
59. }
60.int width = getWidth();
61.if (arg1 == null || arg1.length < width) {
62. arg1 = new byte[width];
63. }
64. System.arraycopy(luminances, arg0 * width, arg1, 0, width);
65.return arg1;
66. }
67.
68.private static Bitmap loadBitmap(String path) throws FileNotFoundExcepti
on {
69. Bitmap bitmap = BitmapFactory.decodeFile(path);
70.if (bitmap == null) {
71.throw new FileNotFoundException("Couldn't open " + path);
72. }
73.return bitmap;
74. }
75.}
接下来,还有一个特别要注意的地方就是manifest的配置部分,需要加入权限,和依赖库中的一个Activity的声明:
[html]view plaincopy
1.
2.
3.
4.