首页 » SEO优化 » phpqrreader失足技巧_二维码扫描优化

phpqrreader失足技巧_二维码扫描优化

访客 2024-11-22 0

扫一扫用手机浏览

文章目录 [+]

zxing是一款跨平台的基于Java实现的处理一维或二维条码的库。
支持多种格式,一维条码支持UPC-A,UPC-E,EAN-8,Code 39,Code 93等格式,二维条码支持QR Code,Data Matrix,PDF 417,MaxiCode等格式。

注:上述的二维条码指的是较宽泛的二维条码,而不是QR Code表示的二维码。

序言

phpqrreader失足技巧_二维码扫描优化

原来Lark直接集成了zxing实现扫一扫功能。
由于Lark的分外业务需求,因此并不须要支持到这么多格式,只须要支持QR Code,因此我们对zxing内部进行定制,使得zxing只支持QR Code。
这样既可以减少zxing库的大小,也可以加快zxing处理一帧数据的速率。
优化紧张包含两方面:(1)扫描性能(2)交互体验。

phpqrreader失足技巧_二维码扫描优化
(图片来自网络侵删)

扫描性能优化包括:

去除zxing额外支持的格式。
删除zxing冗余代码。
将处理相机帧从串行改为并行。

交互体验优化包括:

自动放大。
双击放大。
重力传感器聚焦。
手势调度焦距。

去除zxing额外支持的格式

MultiFormatReader的decodeWithState( )是利用方的入口方法,内部调用了decodeInternal( ),输入是相机的一帧数据,如果抛了NotFoundException,则表示没找到二维码;如果返回了Result,则表示找到了二维码,并解析完成。
代码如下:

个中,readers变量是一个数组,数组的大小表示支持的条码格式个数,zxing原来由于支持很多格式,因此这个数组长度比较长。
当拿到相机的一帧数据后,须要去检测是否是所有支持格式的某一个格式,每一种格式的检测都须要花费一些韶光,因此这个遍历对付Lark是不必要的。
如果将zxing内部定制成只支持QR Code格式,那么就免去了额外的格式检测。

删除zxing冗余代码

我们紧张从几方面删除冗余代码:

删除zxing除了二维码之外的格式的干系代码,zxing对每种格式的干系代码都放在各自的目录中,因此我们只须要把这些格式对应的目录删除即可,比如aztec、maxicode等。
删除二维码的encode干系代码,即\"大众qrcode/encoder\公众目录。
删除decode后文本的解析干系类(比如地址、通讯录、邮件等解析类),只保留URI、URL、Text。

通过以上办法,zxing文件数量从263个缩减到67个,库大小从1.8M缩减到451K,效果非常明显。

将处理相机帧从串行改为并行

原来Lark扫一扫的逻辑是串行的,如下图:

每次从onPreviewFrame()中获取一帧数据,然后调用zxing的decode解析二维码,如果成功,则返回;如果失落败,则调用setOneShotPreviewCallback( )重新调用一次onPreviewFrame( )。

缺陷是如果处理一帧数据韶光很长,会阻碍下一帧的处理,比如上一帧是没有二维码的,而下一帧是有二维码的,如果上一帧处理韶光较长,那么虽然用户对准了二维码,但是实际处理的还是上一帧,因此不太合理。

我们将串行处理改成并行处理,一旦从onPreviewFrame( )获取一帧数据,将decode任务丢进线程池,并立即调用setOneShotPreviewCallback( )获取下一帧数据。
一旦某个任务检测到二维码,立即将isSuccess变量置为true,忽略其他任务。
这样能够大大加快二维码检测的速率。

自动放大

当二维码很小很远时,自动放大能大大加快检测二维码的速率。
QRCodeReader的decode( ) 是二维码检测的主理法,分为两步:(1)大致判断是否存在二维码;(2)解码。

第一步只是检测是否存在二维码,比如去探求是否存在Position Detection Pattern,Timing Pattern,Alignment Pattern。
如果检测到了,则返回DetectorResult,内部包含了定位点的位置信息;如果没检测到,则抛出NotFoundException。
如果二维码很小,纵然第一步检测存在二维码,但是第二步解码也可能会失落败。
由于我们在第一步已经能够知道二维码的大小,因此根据DetectorResult返回的二维码定位点信息打算出二维码的大致宽度,然后判断二维码大小在扫码框中是否足够小,如果足够小,则放大一定焦距:如果小于十分之一,则放大到最大焦距;如果小于即是六分之一,则放大到最大焦距的一半。

详细二维码的事理拜会:二维码的天生细节和事理(见原文链接)

我们实现了zoomCamera( ),如果判断须要放大,则返回true,如果不须要放大,则返回false。
代码如下:

我们在第一步和第二步中间插入该方法,如果须要放大,则不实行第二步;如果二维码已经足够大,则实行第二步。
代码如下:

双击放大

原来Lark的二维码扫描中没有调度焦距的功能,这个对付一些特定场景下会不太方便,因此这里加入了双击放大的功能能够对焦距进行粗略的调度。
利用GestureDetector的onDoubleTap()回调捕捉用户双击事宜,并在CameraPreview中的onTouchEvent()中添加mGestureDetector.onTouchEvent()。
实现如下:

重力传感器聚焦

重力传感器能够捕捉用户手机的运动状态,当检测到用户手机停滞时,触发对焦逻辑。
我们通过实现SensorEventListener接口,并重写onSensorChanged()监听手机的运动状态。

手势调度焦距

为了更风雅化的让用户调度焦距,我们供应了手势来缩放焦距。
通过在onTouchEvent()中获取用户两个手指的间隔是越来越近还是越来越远来调度焦距。
代码如下:

优化结果

经由上述优化,不仅增加了用户体验,而且还大幅增加了二维码扫描速率。
测试手机:坚果Pro,4G内存,Android 7.1.1。

上图表示了从打开相机到二维码解码成功的耗时,可以看出,整体韶光提升了300%+ 。

上图表示检测失落败时的耗时指的是当相机帧中没有二维码时检测的韶光,检测失落败耗时的减少有助于更快地处理相机帧数据,当包含二维码的帧涌现时更快地处理它;上图中看出,耗时减少300%+ 。

上图表示检测成功时的耗时指的是当相机帧中有二维码时检测+解码的韶光;上图中看出,耗时减少150%+ 。

相关文章

大数据时代下的影院变革,智慧观影新体验

随着科技的飞速发展,大数据技术已经渗透到我们生活的方方面面。在电影行业,大数据的应用也为影院带来了前所未有的变革,让观影体验变得更...

SEO优化 2024-12-16 阅读0 评论0

大数据时代下的性别视角,挑战与机遇并存

随着大数据技术的飞速发展,人类社会正在经历一场前所未有的变革。大数据为我们提供了前所未有的洞察力,帮助我们更好地理解世界。大数据在...

SEO优化 2024-12-16 阅读0 评论0