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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值