Android条码扫描及图片生成

来源:互联网 发布:linux命令行下载samba 编辑:程序博客网 时间:2024/04/19 09:45

Android条码扫描及图片生成

上周和老婆去超市,结账的时候老婆拿出手机拍的会员卡照片,但是怎么都扫不出来。于是就产生的做一个扫码应用的想法,并且可以把扫到的内容生成图片,方便使用。

  • Android条码扫描及图片生成
    • 简介
    • 效果图
    • QA
      • 1导入工程各种zxing的类找不到各种ClassNotFoundException
      • 2从相册选择图片及剪切功能实现
      • 3对imageview的bitmap手动回收后下次进入Activity会停止运行log显示trying to use a recycled bitmap
      • 4如何对相册选择的图片解码
      • 5如何编码

简介

  网络搜索发现主要有ZXing和Zbar这两个库,并且发现了牛人的帖子:
《打造极致二维码扫描系列》 – ZXing开发详解
http://www.eoeandroid.com/thread-549171-1-1.html
(出处: eoe 移动开发者论坛)

  楼主还无私的给出了源码,果断下载来,在此基础上增加生成图片的功能。
  经过几天的加班,总算把想要的功能实现了,虽然界面比较简单,功能好用就行。这里记录下过程中的一下问题,方便查阅。
  下载试用地址:http://shouji.baidu.com/software/item?docid=7773544
  使用方法:
1. 通过camera扫描条形码或二维码,或者从相册选择,或者点击”条码生成”按钮
2. 在”扫描结果”界面输入需要生成的”内容”(扫描的结果也在这里),然后输入”卡名”,卡名是作为图片的保存名及显示在图片上面方便查看
3. 点绿色圆点按钮既可以生成图片,生成图片地址”/sdcard/shicard/”
4. 点击扫描界面右上角打开闪光灯,左上角打开查看图片界面
5. 生成的图片就可以到超市之类的地方了,省去了带着卡的麻烦

效果图

(1)扫描界面

(2)扫描结果及生成图片界面

(3)从相册选择图片界面

QA

(1)导入工程各种zxing的类找不到,各种ClassNotFoundException

ANS:找了各种方法都不行,实在没办法重新下了一个ADT bundle竟然没问题了,不知道是不是和其他软件有冲突.

(2)从相册选择图片及剪切功能实现

Ans:
1>从相册选择图片

Intent innerIntent = new Intent(Intent.ACTION_PICK);innerIntent.setType("image/*"); startActivityForResult(innerIntent, REQUEST_CODE);

选择后在原Activity的onActivityResult(onResume在其之后)方法,用data.getData()获得选择图片的Uri.
2>考虑到选择图片全部解码速度会比较慢,对选择的图片进行剪切,刚开始直接时候返回的图片数据,但是经常识别不了。经过多次测试发现是返回数据用bundle传送数据,bundle传送数据大小有限,所以拿到的可能是缩略图的数据。后来改为保存剪切后的图片,在读这个图片,这样就正常了.

Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");imageuri = Uri.parse(IMAGE_LOCAL);intent.putExtra("crop",true);intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 300);intent.putExtra("outputY", 300);intent.putExtra("noFaceDetection", true);//save file to sdcard/tmp.pngintent.putExtra("return-data", false);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());startActivityForResult(intent, 0);

(3)对imageview的bitmap手动回收后,下次进入Activity会停止运行,log显示trying to use a recycled bitmap

ANS:在调用recycle函数的时候已经注意是在bitmap不会再使用的时候,多次实验发现只有在imageview不设置新的bitmap直接返回,下次再进入才会出错。
  查看xml文件,发现写成android:src=”@drawable/shadow”,这样返回的时候就回收了drawable/shadow,下次再进入Activity自然就使用了已回收的bitmap,改为android:background=”@drawable/shadow”后问题解决.

(4)如何对相册选择的图片解码

ANS:仿照camera的方法用multiFormatReader解码,不过相册图片是RGB格式就要多一步RGB到YUV的转换,再仿照camera二值化后就可以解码

int[] lpixels = new int[lwidth*lheight];photo.getPixels(lpixels, 0, lwidth, 0, 0, lwidth, lheight);//covert RGB to YUVRGBLuminanceSource source = new RGBLuminanceSource(lwidth, lheight, lpixels);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));rawResult = multiFormatReader.decodeWithState(bitmap);

(5)如何编码

ANS;取得编码内容和格式后使用multiformatwriter.encode()即可,然后生成数据转成RGB格式保存.

0 0
原创粉丝点击