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

Android从图片获取二维码的方法,第1张

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

之前的博客我记得讲过关于扫描二维码的内容,昨天,组长让我不仅可以扫描获取二维码,还可以通过图片获取里面的二维码。比如别人拍了一张二维码的照片,发送给你,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);          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,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,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 从图片获取二维码就讲完了。

就这么简单。

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

总结

以上是内存溢出为你收集整理的Android从图片获取二维码的方法全部内容,希望文章能够帮你解决Android从图片获取二维码的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146269.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存