Android从图片获取二维码的方法

之前的博客我记得讲过关于扫描二维码的内容,昨天,组长让我不仅可以扫描获取二维码,还可以通过图片获取里面的二维码。比如别人拍了一张二维码的照片,发送给你,app应该可以获取图片的二维码。

自己在网上查了资料,发现其实也很简单,用ZXing jar包里的获取图片二维码的QRCodeReader就基本可以了。不过大部分的内容,我自己也不明白,大家如果有兴趣,可以自己去查找资料。

1.点击按钮后,跳转到相册,选择有二维码的图片,返回到解析二维码的界面。这时通过返回的URI获取图片的路径。

case CHOOSE_PIC: String[] proj = new String[]{MediaStore.Images.Media.DATA}; Cursor cursor = QRCodeActivity.this.getContentResolver().query(data.getData(), proj, null, null, null); if(cursor.moveToFirst()){ int columnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA); System.out.println(columnIndex); //获取到用户选择的二维码图片的绝对路径 imgPath = cursor.getString(columnIndex); } cursor.close(); //获取解析结果 Result ret = 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(); Intent intent = new Intent(); 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对象中 private com.google.zxing.Result parseQRcodeBitmap(String bitmapPath){ //解析转换类型UTF-8 Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>(); hints.put(DecodeHintType.CHARACTER_SET, "utf-8"); //获取到待解析的图片 BitmapFactory.Options options = new BitmapFactory.Options(); //如果我们把inJustDecodeBounds设为true,那么BitmapFactory.decodeFile(String path, Options opt) //并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你 options.inJustDecodeBounds = true; //此时的bitmap是null,这段代码之后,options.outWidth 和 options.outHeight就是我们想要的宽和高了 Bitmap bitmap = 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图片传给此对象 RGBLuminanceSource rgbLuminanceSource = new RGBLuminanceSource(bitmap); //将图片转换成二进制图片 BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(rgbLuminanceSource)); //初始化解析对象 QRCodeReader reader = new QRCodeReader(); //开始解析 Result result = null; try { result = reader.decode(binaryBitmap, hints); } catch (Exception e) { // TODO: handle exception } return result; }

这里首先获取图片的bitmap,需要把获取的bitmap专为一定的大小,通过options.inSampleSize来实现,然后通过

//新建一个RGBLuminanceSource对象,将bitmap图片传给此对象 RGBLuminanceSource rgbLuminanceSource = new RGBLuminanceSource(bitmap); //将图片转换成二进制图片 BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(rgbLuminanceSource)); //初始化解析对象 QRCodeReader reader = new QRCodeReader();

将bitmap的二维码转换成图片,然后又将图片转成二进制图片,调用QRCodeReader的result = reader.decode(binaryBitmap, hints);代码把二进制图片转成二维码,然后直接获取返回值的字符串就是二维码值。

其中用到了一个自定义的类RGBLuminanceSource,主要功能是将图片的二维码内容获取到,把除二维码的内容过滤,方便接下来的解析二维码。

package com.zwcode.p6spro.util; import java.io.FileNotFoundException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import com.google.zxing.LuminanceSource; public class RGBLuminanceSource extends LuminanceSource { private final byte[] luminances; public RGBLuminanceSource(Bitmap bitmap) { super(bitmap.getWidth(), bitmap.getHeight()); //得到图片的宽高 int width = bitmap.getWidth(); int height = bitmap.getHeight(); //得到图片的像素 int[] pixels = new int[width * height]; // bitmap.getPixels(pixels, 0, width, 0, 0, width, height); //为了测量纯解码速度,我们将整个图像灰度阵列前面,这是一样的通道 // YUVLuminanceSource在现实应用。 //得到像素大小的字节数 luminances = new byte[width * height]; //得到图片每点像素颜色 for (int y = 0; y < height; y++) { int offset = y * width; for (int x = 0; x < width; x++) { int pixel = pixels[offset + x]; int r = (pixel >> 16) & 0xff; int g = (pixel >> 8) & 0xff; int b = pixel & 0xff; //当某一点三种颜色值相同时,相应字节对应空间赋值为其值 if (r == g && g == b) { luminances[offset + x] = (byte) r; } //其它情况字节空间对应赋值为: else { luminances[offset + x] = (byte) ((r + g + g + b) >> 2); } } } } public RGBLuminanceSource(String path) throws FileNotFoundException { this(loadBitmap(path)); } @Override public byte[] getMatrix() { return luminances; } @Override public byte[] getRow(int arg0, byte[] arg1) { if (arg0 < 0 || arg0 >= getHeight()) { throw new IllegalArgumentException( "Requested row is outside the image: " + arg0); } int width = getWidth(); if (arg1 == null || arg1.length < width) { arg1 = new byte[width]; } System.arraycopy(luminances, arg0 * width, arg1, 0, width); return arg1; } private static Bitmap loadBitmap(String path) throws FileNotFoundException { Bitmap bitmap = BitmapFactory.decodeFile(path); if (bitmap == null) { throw new FileNotFoundException("Couldn't open " + path); } return bitmap; } }

这样就可以识别图片的二维码了,用这个功能一定要先导入ZXing jar包,这个很简单,网上有很多介绍,大家自己可以查找一下。

Android 从图片获取二维码就讲完了。

就这么简单。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-20 10:59:14

Android从图片获取二维码的方法的相关文章

Android如何扫描获取二维码中的数据?

问题描述 Android如何扫描获取二维码中的数据? 我首先做了一个二维码名片,把信息输入进去以后生成了一个二维码,现在需要通过扫描这个二维码获取里面的信息中的电话号码信息,然后是一个发短信的过程.现在的问题就是如何扫描获得这个电话号码? 解决方案 参考:http://www.cnblogs.com/weixing/archive/2013/08/28/3287120.html 解决方案二: 建议你使用ZXing框架 解决方案三: android 二维码 扫描cocos2dx android 二

Android利用ZXing扫描二维码的实例代码解析_Android

相关阅读: Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题 此项目源码地址:请点击这里 看一下zxing的项目结构,我这里直接拿过来用的   看一下扫码的activity: package com.fanyafeng.barcode.activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bund

Android 点击生成二维码功能实现代码

先看效果: 输入内容,点击生成二维码: 点击logo图案: 代码: QRCodeUtil: package com.example.administrator.zxing; import android.graphics.Bitmap; import android.graphics.Canvas; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zx

android 通过客户扫描二维码获得用户手机号

问题描述 android 通过客户扫描二维码获得用户手机号 android中怎样实现二维码扫描后获取客户的手机号?用的是4.0以上的版本,需要获得哪些用户扫描了二维码,并把它传入数据库,有没有办法获得用户在线扫描的手机号码 解决方案 首先你要根据你自己的生成规则生成一个含手机号的二维码,识别出来再根据你的规则解析出来 解决方案二: 想错了,我可以直接在应用中想办法使用户给我手机号就行了

Android使用zxing生成二维码,边框自定义宽度

1.基本方法 //二维码容错率,分四个等级:H.L .M. Q         ErrorCorrectionLevel level = ErrorCorrectionLevel.H;             String qrName = "test.png"; //生成二维码图片名称         String targetPath = ServletActionContext.getServletContext().getRealPath("/");  //

zxing 识别本地图片部分二维码无法解析

问题描述 zxing 识别本地图片部分二维码无法解析 android 用zxing直接识别本地图片中的二维码的时候,部分二维码需要图片非常大才能识别,正常大小完全识别不出来,请问有人碰到过吗,有解决方案吗. 解决方案 二维码之zxing二维码解析图片资源二维码之zxing二维码解析图片资源使用zxing生成二维码图片,并解析

Android利用ZXing扫描二维码的实例代码解析

相关阅读: Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题 此项目源码地址:请点击这里 看一下zxing的项目结构,我这里直接拿过来用的 看一下扫码的activity: package com.fanyafeng.barcode.activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle

fragment 二维码-android fragment 集成扫描二维码功能

问题描述 android fragment 集成扫描二维码功能 我在一个activity里放了一个viewpager,viewpager里填充两个fragment, 其中一个fragment是扫描二维码的功能,扫描完以后会跳到另外一个页面,请做过的人提供一点思路,感谢! 解决方案 你用ZXing这个第三方的扫描sdk就可以了 解决方案二: ZXing识别出url,传值给另一个页面,页面中用webview显示. 解决方案三: http://download.csdn.net/detail/zhuo

解析二维码-解密二维码,获取二维码的情景值ID

问题描述 解密二维码,获取二维码的情景值ID 怎么没有看到有二维码的文章啊,然后我在获取二维码"情景id" String eventKey_scan = requestMap.get("EventKey"); 时获取到的是"0"