全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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 从图片获取二维码就讲完了。

就这么简单。

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


# Android图片获取二维码  # Android获取二维码  # Android从图片获取二维码  # Android中google Zxing实现二维码与条形码扫描  # Android二维码创建实例  # Android基于zxing的二维码(网格)扫描 仿支付宝网格扫描  # Android中使用ZXing生成二维码(支持添加Logo图案)  # Android利用ZXing扫描二维码的实例代码解析  # Android项目实战(二十八):使用Zxing实现二维码及优化实例  # Android实现二维码扫描和生成的简单方法  # Android扫描二维码时出现用户禁止权限报错问题解决办法  # 给你  # 转换成  # 转成  # 新建一个  # 这是  # 也不  # 让我  # 还可以  # 有很多  # 设为  # 这段  # 也很  # 很简单  # 有兴趣  # 自定义  # 为其  # 还需要  # 我们现在  # 会把  # 拍了 


相关文章: 深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  独立制作一个网站多少钱,建立网站需要花多少钱?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何通过免费商城建站系统源码自定义网站主题与功能?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  长沙做网站要多少钱,长沙国安网络怎么样?  小型网站制作HTML,*游戏网站怎么搭建?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  建站之星如何防范黑客攻击与数据泄露?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  太平洋网站制作公司,网络用语太平洋是什么意思?  建站之星如何实现网站加密操作?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  5种Android数据存储方式汇总  制作表格网站有哪些,线上表格怎么弄?  如何通过.red域名打造高辨识度品牌网站?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  如何选择CMS系统实现快速建站与SEO优化?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  小程序网站制作需要准备什么资料,如何制作小程序?  如何高效利用亚马逊云主机搭建企业网站?  如何快速选择适合个人网站的云服务器配置?  如何在Windows虚拟主机上快速搭建网站?  公司网站制作价格怎么算,公司办个官网需要多少钱?  历史网站制作软件,华为如何找回被删除的网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  建站之星后台密码如何安全设置与找回?  太原网站制作公司有哪些,网约车营运证查询官网?  如何通过cPanel快速搭建网站?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  建站主机服务器选型指南与性能优化方案解析  网页设计网站制作软件,microsoft office哪个可以创建网页?  如何通过智能用户系统一键生成高效建站方案?  相册网站制作软件,图片上的网址怎么复制?  网站制作价目表怎么做,珍爱网婚介费用多少?  济南专业网站制作公司,济南信息工程学校怎么样?  制作宣传网站的软件,小红书可以宣传网站吗?  内部网站制作流程,如何建立公司内部网站?  C++时间戳转换成日期时间的步骤和示例代码  如何用PHP快速搭建CMS系统?  七夕网站制作视频,七夕大促活动怎么报名?  音乐网站服务器如何优化API响应速度?  完全自定义免费建站平台:主题模板在线生成一站式服务  建站之星3.0如何解决常见操作问题?  如何注册花生壳免费域名并搭建个人网站?  建站为何优先选择香港服务器?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。