最近项目中需要集成扫一扫功能,在网上翻阅资料以后,集成了zxing最新的代码,并参考实现了选取图片识别二维码功能,整体效果堪比微信扫一扫功能。网上资料浩如烟海,可用者无几,故于此文记录个人代码集成过程,及有用资料,以供查阅。

一、了解二维码

生成二维码的网站可用于测试:草料二维码

参考资料:二维码(QR code)基本结构及生成原理

二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。

在许多种类的二维条码中,常用的码制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。

二维条码/二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码。其中矩阵式二维码因QR CODE而广泛流行,我们现在所说的二维码一般即指QR CODE。

QR(Quick-Response) code是被广泛使用的一种二维码,解码速度快。具有以下特点:1.存储大容量信息;2.在小空间内打印;3.有效表现各种字母(1994年由日本DW公司发明);4.对变脏和破损的适应能力强;5.可以从任意方向读取(三处定位图案);6.支持数据合并功能。

QR code包括:QR码(模型1模型2),Micro QR码,iQR码。

QR code的基本结构如下:

二维码基本结构

位置探测图形、位置探测图形分隔符、定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;

校正图形:规格确定,校正图形的数量和位置也就确定了;

格式信息:表示改二维码的纠错级别,分为L、M、Q、H;

版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。

数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。

QR码的编码过程:1.数据分析;2.数据编码;;3.纠错编码;4.构造最终数据信息;5.构造矩阵;6.掩摸;7.格式和版本信息。

QR码的解码过程:有兴趣可查阅:如何笔算解码二维码?

以上文本摘抄自参考资料,具体概念请查阅原文。

二、项目集成ZXing

参考资料:Google ZXing系列讲解(一)——导入AS

集成ZXing的方法可以分为三种:

1、jar包导入;

2、下载源码以依赖库的方式导入;

3、直接将源码整合到项目当中。

许多人在网上推荐自己的开源项目,对ZXing加工瘦身后可直接通过maven导入。在网上尝试部分项目后,发现效果都不太理想,主要是瘦身后导致扫描速度慢,源码过于老旧,部分新功能没有等问题。个人推荐直接下载源码,整合到项目中,一来便于对扫描界面及CaptureActivity.java进行定制,二来可以自行删除不需要的功能的代码(生成二维码,设置,扫描历史等功能),减少无用代码的占用。具体整合方法见参考资料,这里就不再赘述。

三、实现选取图片识别二维码功能

参考资料:使用ZXing扫码实现扫手机本地图片的二维码内容

实现选取图片识别二维码功能主要包括以下步骤:1、跳转本地相册选取图片;2、选择图片并返回图片地址;3、根据图片地址获取图片并转换为bitmap;4、解析bitmap二维码并返回结果。

之前用其他方法实现后,会出现如果图片中除了二维码还有其他文本,那么就会导致扫描失败的情况。解决方法在于转化为bitmap后,调用以下方法:

result =new MultiFormatReader().decode(new BinaryBitmap(new HybridBinarizer(source)), HINTS);

其中decode()调用decodeInternal()方法,decodeInternal()方法源码如下:

通过对bitmap重复解析以获得解析结果或抛出解析失败异常。这样即使二维码只占图中的一部分,也能解析得到结果。

调用该方法为耗时操作,需要在线程中进行。具体代码请查阅参考资料。

四、功能调用及结果处理

实现完以上两步,在ZXing源码的CaptureActivity中有两处可获得识别结果。

第一处:处理扫描结果:

public void handleDecode(Result rawResult, Bitmap barcode,float scaleFactor){

//根据扫描结果,通过Intent返回最终结果

String content = rawResult.getText();

String resultStr = recode(content);

Intent intentRet =new Intent();

intentRet.putExtra("strRet",resultStr);

setResult(RESULT_OK,intentRet);

finish();

}

第二处:处理图片识别结果:

private void prasePhoto(final String path) {

@Override

protected void onPostExecute(String content) {

// 识别出图片二维码/条码,内容为content,同样通过Intent返回最终结果

Intent intentRet =new Intent();

intentRet.putExtra("strRet",content);

setResult(RESULT_OK,intentRet);

finish();

}

}

最后,需要获得调用扫描功能的类中,通过startActivityForResult()方法调用CaptureActivity类,并在onActivityResult()类中对结果进行处理。

if(resultCode == Activity.RESULT_OK){

String retDiag = data.getStringExtra("strRet");

//根据需求对最终结果retDiag进行处理

}

到此,就完成了对扫描功能的整合。二维码扫描功能开发完成。有些人可能需要对扫描框进行定制,只需要在ViewfinderView类中对getView()进行修改即可。

ZXing实现扫描或选取图片识别二维码及条码功能相关推荐

  1. 使用Zxing实现拍照,选取图片识别二维码

    转载请注明出处 作者:AboutJoke ( http://blog.csdn.net/u013200308 ) 原文链接:http://blog.csdn.net/u013200308/articl ...

  2. 二维码扫描+长按识别二维码demo

    二维码扫描+长按识别二维码demo,已封装好 源码下载

  3. Android 扫描、生成、识别二维码、条码 一库搞定

    他来了,他来了,他带着YXing走来了. YXing 集成了CameraX + zxing, 简洁调用,功能完善,自定义扫码界面,再也不用像以前一样cv一堆冗余的Camera代码进项目了. 怎么集成: ...

  4. vue 实现PDA设备扫描二维码及条码功能

    页面效果图: 实现具体功能: 按下PDA设备的扫描键,扫描成功后将扫描到的编码值自动填充到输入框内,点击确定按钮将编码通过接口传递到后端 代码如下: <template><div&g ...

  5. Android利用zxing用相机扫描识别二维码(添加闪光灯和本地二维码)超详细教程

    之前写了怎么用zxing的jar包进行简单的识别和生成二维码,以及生成带图片的二维码. 接下来单独说说怎么用相机扫描二维码,用相机扫描二维码相对于前面的生成二维码,识别二维码来说要麻烦一点,网上的教程 ...

  6. 【Android App】人脸识别中扫描识别二维码实战解析(附源码和演示 超详细)

    需要源码请点赞关注收藏后评论区留言私信~~~ 一.扫描识别二维码 不仅可以利用zxing库生成二维码,同样利用zxing库可以扫描二维码并解析得到原始文本,此时除了给build.gradle添加如下一 ...

  7. Android利用zxing生成二维码,识别二维码,中间填充图片超详细、超简易教程

    gayhub上的zxing可用于生成二维码,识别二维码 gayhub地址:https://github.com/zxing/zxing 此文只是简易教程,文末附有完整代码和demo下载地址,进入正题: ...

  8. python二维码生成识别代码_Python3+qrcode+zxing生成和识别二维码教程

    一.安装依赖库 pip install qrcode pillow image zxing pillow是python3中PIL的代替库,image是生成图版需要用到的库 安装image时报错&quo ...

  9. java识别二维码-zxing

    1.pom文件中引入 <dependency><groupId>com.google.zxing</groupId><artifactId>javase ...

  10. HTML5实现扫描识别二维码/生成二维码

    扫描识别二维码 思路: 1. 操作摄像头,获取图片.HTML5 WEBRTC的navigator.getUserMedia方法去实时获取摄像头资源.  2. 利用canvas使用相关算法分析图片识别图 ...

最新文章

  1. 3个月带你通关Go语言
  2. java协变 生产者理解_Java进阶知识点:协变与逆变
  3. 【Python进阶】Python进阶专栏栏主自述:不忘初心,砥砺前行
  4. 计算机网络复习-应用层
  5. TCP/IP详解学习笔记-基本概念
  6. Linux 环境变量PATH设置和查看etc/profile和bashrc的区别
  7. 一个简单的时间轴demo
  8. UICollectionViewDelegateFlowLayout 使用
  9. 重新认识一遍JavaScript - 2
  10. 如何使用数据库引擎优化顾问优化数据库
  11. DB9接口定义 串口接口定义 MAX232电路
  12. 湖北工业大学机械c语言考试试题,关于部分同学重新参加《C语言程序设计》、《计算机及网络应用基础》课程补考的通知...
  13. Java成员变量初始化顺序
  14. word自带参考文献标注功能
  15. 原生JS制作缤纷色彩板
  16. 可变参C API va_list,va_start,va_arg_va_end以及c++可变参模板
  17. MATLAB08:符号运算
  18. 关于IOPS指标对性能的影响
  19. 一流在线课程申报表公共计算机,衡阳财经业职业技术学院精品课程建设申报表.doc...
  20. android sdk manager下载后怎么安装,【转载】一个不错的介绍配置Android SDK Manager安装的教程与注意事项...

热门文章

  1. python凹多边形分割_在Python中OpenCV多边形的凹凸角点
  2. sai笔记3-钢笔图层
  3. php不能撤销,word无法撤销怎么解决
  4. 怎么让计算机文件格式显示,怎么显示文件后缀名,详细教您如何让电脑显示文件后缀名...
  5. WinForm界面开发
  6. 仿淘宝,京东红包雨(基于Phaser框架)
  7. Springboot图片上传 百度ocr文字识别提取
  8. python 循环高级用法 [expression for x in X [if condition] for y in Y [if condition] ... for n in N [if con
  9. 前端,html,css,js,vue
  10. Unicode(全世界每个国家字符的唯一编码0x000000 到 0x10FFFF)与UTF-8的区别