专栏首页非著名程序员Android二维码扫描开发(一):实现思路与原理

Android二维码扫描开发(一):实现思路与原理

现在二维码已经非常普及了,那么二维码的扫描与处理也成为了Android开发中的一个必要技能。网上有很多关于Android中二维码处理的帖子,大都是在讲开源框架zxing用法,然后贴贴代码就完了,并没有一个系统的分析和原理解析。其中涉及到的Camera的操作和YUV图像处理,也大都没有详细的介绍。所以我自己写了这篇文章,把Android二维码的开发来从头捋一下。

本例界面如下图所示,代码链接在文章最下方。

二维码处理流程分为几个步骤:

  1. 初始化相机,设置一些相机参数;
  2. 绑定SurfaceView,在SurfaceView上显示预览图像;
  3. 获取相机的一帧图像;
  4. 对图像进行一定的预处理,只保留亮度信息,成为灰度图像;
  5. 对灰度图像进行二维码解析,解析成功进入下一步,不成功回到第③步;
  6. 返回解析结果并退出。

流程图如下图所示:

一、初始化相机

相机使用的是android.hardware.Camera这个类,在Android 5.0之后,推荐使用更强大的android.hardware.Camera2这个类,为了兼容更低版本Android系统,我们在这里仍然使用Camera类来实现。

Camera可以通过setDisplayOrientation()方法设置预览图像的方向,旋转度数只能是0、90、180、270中的一个,根据需求,本例中设置为90度。

Camera还可以通过Camera.Parameters类设置预览图像的分辨率,但是只能在气可支持的分辨率中选择一个,不能随便设置,我们需要根据屏幕大小,在其中选出一个最佳的预览图像分辨率,太大浪费资源,太小会显示不清楚,具体选择方法,在代码中有,这里就不细述了。

Camera可以通过setPreviewFormat()方法来设置预览图像的数据格式,推荐选择的有ImageFormat.NV21和ImageFormat.YV12,默认是NV21。NV21属于YUV图像,和RGB图像有所不同,YUV图像在下一篇会有详细介绍。

注意在使用Camera时,需要在AndroidManifest.xml里声明一些权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />

二、绑定SurfaceView

在SurfaceView创建好后,通过Camera类的setPreviewDisplay()方法,将SurfaceHolder传入Camera。

调用Camera的startPreview()方法,Camera捕捉到的图像就会显示到SurfaceView上了。

三、获取一帧图像

调用Camera的setOneShotPreviewCallback(PreviewCallback cb)方法,可以请求获取一帧图像,获取到图像后,会调用PreviewCallback的onPreviewFrame(byte[] data, Camera camera)方法,其中的data参数就是图像的YUV数据了。

四、图像预处理

根据二维码的原理,我们只需要图像的亮度信息来进行二维码解析,所以我们要把获取到的彩色图像转换为灰度图像。YUV图像转换为灰度图像的方法,以及RGB图像转换为灰度图像的方法,在后续文章中会有介绍,这里只说原理,具体实现就不再赘述。

五、二维码解析

在这里,二维码解析使用的是google的zxing开源框架,把上一步处理后的灰度图像,封装为zxing的LuminanceSource,再封装为zxing的BinaryBitmap,然后就可以进行二维码解析了。

值得一提的是,利用zxing解析二维码是耗时操作,为避免ANR,需要写到子线程中来处理。

具体代码在这里就不贴了,后续章节中将会对zxing的使用及LuminanceSource的处理做详细解答。

六、解析结果

本例中,除了返回解析到的字符串之外,还对LuminanceSource增加了一个renderCroppedGreyScaleBitmap()方法,用来生成处理好的灰度图像Bitmap。

二维码扫描的大致流程和原理就叙述到这里了,下一篇将会对YUV图像进行详细的介绍。

源码地址:https://github.com/xushanmeng/QRCodeScannerDemo

本文分享自微信公众号 - 非著名程序员(non-famous-coder)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-03-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 阻止iOS Web APP中点击链接跳转到Safari 浏览器新标签页

    最近为了更好地接触移动Web 开发狠心购买了一台ipad mini(之前一直都是借同学的,借多了就不好意思了)。拿来调试DeveMobile 与EaseMobi...

    Jeff
  • 一行 Python 代码实现并行

    译者:caspar 译文:https://segmentfault.com/a/1190000000414339 原文:https://medium.com/b...

    企鹅号小编
  • 1.[Andriod]之Andriod布局 VS WinPhone布局

    0.写在前面的话 近来被HTML+CSS的布局折腾的死去活来,眼巴巴的看着CSS3中的flex,grid等更便捷更高效的的布局方式无法在项目中应用,心里那叫一个...

    blackheart
  • 2.[Andriod]Andriod Studio结合Visual Studio Emulator for Android调试Android App

    0. 工欲善其事必先利其器 上一篇博客对比了一下Android和WinPhnoe的布局容器,后续篇章重点放在Android的开发上了。 说到开发就绕不开调试程序...

    blackheart
  • 0.[Andriod]之从零安装配置Android Studio并编写第一个Android App

    0. 所需的安装文件 笔者做了几年WP,近来对Android有点兴趣,尝试一下Android开发,废话不多说,直接进入主题,先安装开发环境,笔者的系统环境为wi...

    blackheart
  • iOS 7 Web App的初级优化之道

    本文所涉及的内容大体上是作为《移动Web 开发中的一些前端知识收集汇总》的扩展,但只限于iOS7 系统,建议在阅读本文之前先看看该文以及《将你的网站打造成一个i...

    Jeff
  • 低多边形(Low-Poly)简介及相关素材分享下载

    最近一直缺乏原创文章,只因被各种琐事所累,难以静下心来写文章。这篇文章也非原创,分享下我知道的一些低多边形(Low-Poly)的素材。低多边形(Low-Poly...

    Jeff
  • 产品之上的世界观

    image.png 推荐语: 虽然此前有Foxmail和QQ邮箱的成功,但是,因其天性低调,张小龙仍然可以说是一个默默无闻的人。虽然微信用户超过5亿...

    腾讯研究院
  • Batik渲染png图片异常的bug修复全程记录

    batik是apache的一个开源项目,可以实现svg的渲染,后端借助它可以比较简单的实现图片渲染,当然和java一贯处理图片不太方便一样,使用起来也有不少坑

    小灰灰
  • iOS / Android 移动设备中的 Touch Icons

    上次转载了一篇《将你的网站打造成一个iOS Web App》,但偶然发现这篇文章的内容有些是错误的——准确来说也不是错误,只是不适合自半年前来的情况了(也可以说...

    Jeff

扫码关注云+社区

领取腾讯云代金券