之前的博客我记得讲过关于扫描二维码的内容,昨天,组长让我不仅可以扫描获取二维码,还可以通过图片获取里面的二维码。比如别人拍了一张二维码的照片,发送给你,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扫描二维码时出现用户禁止权限报错问题解决办法
# 给你
# 转换成
# 转成
# 新建一个
# 这是
# 也不
# 让我
# 还可以
# 有很多
# 设为
# 这段
# 也很
# 很简单
# 有兴趣
# 自定义
# 为其
# 还需要
# 我们现在
# 会把
# 拍了
相关文章:
学校为何禁止电信移动建设网站?
如何正确选择百度移动适配建站域名?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
建站之星代理平台如何选择最佳方案?
Swift中swift中的switch 语句
建站主机默认首页配置指南:核心功能与访问路径优化
如何破解联通资金短缺导致的基站建设难题?
如何配置IIS站点权限与局域网访问?
定制建站流程步骤详解:一站式方案设计与开发指南
打鱼网站制作软件,波克捕鱼官方号怎么注册?
如何在Windows环境下新建FTP站点并设置权限?
建站ABC备案流程中有哪些关键注意事项?
高端建站如何打造兼具美学与转化的品牌官网?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
青岛网站建设如何选择本地服务器?
如何快速建站并高效导出源代码?
建站之星代理如何获取技术支持?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
宁波自助建站系统如何快速打造专业企业网站?
建站之星安装路径如何正确选择及配置?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
宝塔Windows建站如何避免显示默认IIS页面?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
已有域名和空间如何快速搭建网站?
成都网站制作报价公司,成都工业用气开户费用?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
大型企业网站制作流程,做网站需要注册公司吗?
如何零基础开发自助建站系统?完整教程解析
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
,巨量百应是干嘛的?
如何打造高效商业网站?建站目的决定转化率
宝塔建站无法访问?如何排查配置与端口问题?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
深圳网站制作案例,网页的相关名词有哪些?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
如何在IIS中新建站点并配置端口与物理路径?
制作网站公司那家好,网络公司是做什么的?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
微信推文制作网站有哪些,怎么做微信推文,急?
建站之星2.7模板快速切换与批量管理功能操作指南
如何在云主机快速搭建网站站点?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
建站之星如何快速生成多端适配网站?
如何高效完成自助建站业务培训?
如何彻底卸载建站之星软件?
*请认真填写需求信息,我们会在24小时内与您取得联系。