Android从图片获取二维码的方法
之前的博客我记得讲过关于扫描二维码的内容,昨天,组长让我不仅可以扫描获取二维码,还可以通过图片获取里面的二维码。比如别人拍了一张二维码的照片,发送给你,app应该可以获取图片的二维码。
自己在网上查了资料,发现其实也很简单,用ZXingjar包里的获取图片二维码的QRCodeReader就基本可以了。不过大部分的内容,我自己也不明白,大家如果有兴趣,可以自己去查找资料。
1.点击按钮后,跳转到相册,选择有二维码的图片,返回到解析二维码的界面。这时通过返回的URI获取图片的路径。
caseCHOOSE_PIC:
String[]proj=newString[]{MediaStore.Images.Media.DATA};
Cursorcursor=QRCodeActivity.this.getContentResolver().query(data.getData(),proj,null,null,null);
if(cursor.moveToFirst()){
intcolumnIndex=cursor.getColumnIndex(MediaStore.Images.Media.DATA);
System.out.println(columnIndex);
//获取到用户选择的二维码图片的绝对路径
imgPath=cursor.getString(columnIndex);
}
cursor.close();
//获取解析结果
Resultret=parseQRcodeBitmap(imgPath);
if(ret==null){
Toast.makeText(QRCodeActivity.this,getString(R.string.load_two_dimensional_error),Toast.LENGTH_LONG).show();
}else{
//Toast.makeText(QRCodeActivity.this,"解析结果:"+ret.toString(),Toast.LENGTH_LONG).show();
Intentintent=newIntent();
intent.putExtra(Intents.Scan.RESULT,ret.toString());
this.setResult(Activity.RESULT_OK,intent);
this.overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
finish();
}
break;
这个就是通过ContentResolver查询URI获取图片的路径,然后调用parseQRcodeBitmap(imgPath)获取图片的二维码。
2.通过图片路径进行解析图片,获取图片的二维码值。
//解析二维码图片,返回结果封装在Result对象中
privatecom.google.zxing.ResultparseQRcodeBitmap(StringbitmapPath){
//解析转换类型UTF-8
Hashtablehints=newHashtable();
hints.put(DecodeHintType.CHARACTER_SET,"utf-8");
//获取到待解析的图片
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
//如果我们把inJustDecodeBounds设为true,那么BitmapFactory.decodeFile(Stringpath,Optionsopt)
//并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你
options.inJustDecodeBounds=true;
//此时的bitmap是null,这段代码之后,options.outWidth和options.outHeight就是我们想要的宽和高了
Bitmapbitmap=BitmapFactory.decodeFile(bitmapPath,options);
//我们现在想取出来的图片的边长(二维码图片是正方形的)设置为400像素
/**
options.outHeight=400;
options.outWidth=400;
options.inJustDecodeBounds=false;
bitmap=BitmapFactory.decodeFile(bitmapPath,options);
*/
//以上这种做法,虽然把bitmap限定到了我们要的大小,但是并没有节约内存,如果要节约内存,我们还需要使用inSimpleSize这个属性
options.inSampleSize=options.outHeight/400;
if(options.inSampleSize<=0){
options.inSampleSize=1;//防止其值小于或等于0
}
/**
*辅助节约内存设置
*
*options.inPreferredConfig=Bitmap.Config.ARGB_4444;//默认是Bitmap.Config.ARGB_8888
*options.inPurgeable=true;
*options.inInputShareable=true;
*/
options.inJustDecodeBounds=false;
bitmap=BitmapFactory.decodeFile(bitmapPath,options);
//新建一个RGBLuminanceSource对象,将bitmap图片传给此对象
RGBLuminanceSourcergbLuminanceSource=newRGBLuminanceSource(bitmap);
//将图片转换成二进制图片
BinaryBitmapbinaryBitmap=newBinaryBitmap(newHybridBinarizer(rgbLuminanceSource));
//初始化解析对象
QRCodeReaderreader=newQRCodeReader();
//开始解析
Resultresult=null;
try{
result=reader.decode(binaryBitmap,hints);
}catch(Exceptione){
//TODO:handleexception
}
returnresult;
}
这里首先获取图片的bitmap,需要把获取的bitmap专为一定的大小,通过options.inSampleSize来实现,然后通过
//新建一个RGBLuminanceSource对象,将bitmap图片传给此对象 RGBLuminanceSourcergbLuminanceSource=newRGBLuminanceSource(bitmap); //将图片转换成二进制图片 BinaryBitmapbinaryBitmap=newBinaryBitmap(newHybridBinarizer(rgbLuminanceSource)); //初始化解析对象 QRCodeReaderreader=newQRCodeReader();
将bitmap的二维码转换成图片,然后又将图片转成二进制图片,调用QRCodeReader的result=reader.decode(binaryBitmap,hints);代码把二进制图片转成二维码,然后直接获取返回值的字符串就是二维码值。
其中用到了一个自定义的类RGBLuminanceSource,主要功能是将图片的二维码内容获取到,把除二维码的内容过滤,方便接下来的解析二维码。
packagecom.zwcode.p6spro.util;
importjava.io.FileNotFoundException;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importcom.google.zxing.LuminanceSource;
publicclassRGBLuminanceSourceextendsLuminanceSource{
privatefinalbyte[]luminances;
publicRGBLuminanceSource(Bitmapbitmap){
super(bitmap.getWidth(),bitmap.getHeight());
//得到图片的宽高
intwidth=bitmap.getWidth();
intheight=bitmap.getHeight();
//得到图片的像素
int[]pixels=newint[width*height];
//
bitmap.getPixels(pixels,0,width,0,0,width,height);
//为了测量纯解码速度,我们将整个图像灰度阵列前面,这是一样的通道
//YUVLuminanceSource在现实应用。
//得到像素大小的字节数
luminances=newbyte[width*height];
//得到图片每点像素颜色
for(inty=0;y>16)&0xff;
intg=(pixel>>8)&0xff;
intb=pixel&0xff;
//当某一点三种颜色值相同时,相应字节对应空间赋值为其值
if(r==g&&g==b){
luminances[offset+x]=(byte)r;
}
//其它情况字节空间对应赋值为:
else{
luminances[offset+x]=(byte)((r+g+g+b)>>2);
}
}
}
}
publicRGBLuminanceSource(Stringpath)throwsFileNotFoundException{
this(loadBitmap(path));
}
@Override
publicbyte[]getMatrix(){
returnluminances;
}
@Override
publicbyte[]getRow(intarg0,byte[]arg1){
if(arg0<0||arg0>=getHeight()){
thrownewIllegalArgumentException(
"Requestedrowisoutsidetheimage:"+arg0);
}
intwidth=getWidth();
if(arg1==null||arg1.length
这样就可以识别图片的二维码了,用这个功能一定要先导入ZXingjar包,这个很简单,网上有很多介绍,大家自己可以查找一下。
Android从图片获取二维码就讲完了。
就这么简单。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。