博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android ZXing识别图片中的一维码和二维码的简单总结
阅读量:6094 次
发布时间:2019-06-20

本文共 2478 字,大约阅读时间需要 8 分钟。

一、前言

     我在网上找了很多关于识别一维码和二维码的资料,总结一下,手机端目前能找到ZXing,ZBar都只能支持单个一维码,单个和多个二维码的识别,当图片有二维码和一维码同时存在,也只能识别二维码,而且ZXing还在持续更新中,所以最好的选择是ZXing。

二、代码和使用

/**

* 扫描的工具类-------一维码二维码(识别图片)
* **/
public class BarcodeUtil {
/***
* 获取图片的一维码----目前只支持一个条形码 filename --图片的绝对路径
* */
public static String getOneBarcode(String filename, Context context) {
String onebarcode = "";
Bitmap img = BitmapUtils.getCompressedBitmap(filename);
BitmapDecoder decoder = new BitmapDecoder(context);
Result result = decoder.getRawResult(img);
String resP = "";
if (result != null
&& codeType(DecodeFormatManager.ONE_D_FORMATS,
result.getBarcodeFormat())) {
resP = "|" + result.getResultPoints()[1].getX() + "|"
+ result.getResultPoints()[1].getY() + "|";
onebarcode = result.getText() + resP;
}
return onebarcode;
}
/***
* 获取图片的二维码----目前可支持多个二维码 filename --图片的绝对路径
* */
public static String getTwoBarcode(String filename) {
String twobarcode = "";
Bitmap img = BitmapUtils.getCompressedBitmap(filename);
int[] intArray = new int[img.getWidth() * img.getHeight()];
img.getPixels(intArray, 0, img.getWidth(), 0, 0, img.getWidth(),
img.getHeight());
LuminanceSource source = new RGBLuminanceSource(img.getWidth(),
img.getHeight(), intArray);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
QRCodeMultiReader odecoder = new QRCodeMultiReader();
Result[] results;
String resP = "";
try {
results = odecoder.decodeMultiple(bitmap);
if (results != null) {
for (Result result2 : results) {
if (result2 != null
&& codeType(DecodeFormatManager.QR_CODE_FORMATS,
result2.getBarcodeFormat())) {
resP = "|" + result2.getResultPoints()[1].getX() + "|"
+ result2.getResultPoints()[1].getY() + "|";
twobarcode += result2.getText() + resP;
}
}
}
} catch (NotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return twobarcode;
}
/***
* 确认扫描的
*
* */
private static boolean codeType(final Collection<BarcodeFormat> type,
BarcodeFormat barcodeFormat) {
for (BarcodeFormat barcode : type) {
if (barcodeFormat.equals(barcode)) {
return true;
}
}
return false;
}
}

说明 :我这个同时返回了一维码或二维码包含的信息还有它所在位置的左上角的那个坐标点。

(result.getResultPoints()[1].getX() +result.getResultPoints()[1].getY() 这是左上角那个点的坐标) 一维码只返回两个坐标,二维码返回了4个,根据你的需要去取。

重点说明:对多个二维码的识别,需要使用QRCodeMultiReader去识别,很多地方找不到这个类的具体使用方法,你需要下载一个比较新版本的ZXing包,里面才有这方法。

其他相关的一些工具类,你也可以在对应的里面找到。因为关于ZXing的使用很容易在GitHub等地方找到demo,但是对多个扫描的二维码的识别就基本没有使用的例子,使用的方法都提供了,但没有直接的使用总结,所以我这里贴的就是我的一个简单的使用和说明,希望可以帮到你。

转载于:https://juejin.im/post/5a5709096fb9a01caa2071d4

你可能感兴趣的文章
生成自己的Alphanumeric/Printable shellcode
查看>>
云计算服务和应用产品价格是多少才合适呢?
查看>>
怎样让山寨安卓机享有google map服务
查看>>
深入学习Java虚拟机——类加载机制
查看>>
为Windows下的Apache服务器添加防DDoS模块
查看>>
JavaScript函数内部属性arguments
查看>>
PHP如何对在线用户状态进行检测
查看>>
硬盘克隆之HDclone
查看>>
公司技术特点
查看>>
MongoDB【最新版V2.6】- 系列 1:Mongdb 启动的基本配置
查看>>
自动化运维工具——ansible
查看>>
LVM
查看>>
mysql数据的binlog处理方法
查看>>
求最大公约数
查看>>
glut输出文字
查看>>
位运算
查看>>
Servlet之ServletContext总结
查看>>
【Python】《Python编程之美 最佳实践指南》读书笔记
查看>>
vim backspace设置选项详解
查看>>
我的友情链接
查看>>