非凡管家旗下:微信机器人,微信助手,社群营销,营销大师,企业微信大管家,小鹿活码,非凡建群宝,非凡群直播,非凡一折购商城,SAAS 非凡营销商城等微信社群营销服务平台,为你的微信营销私欲流量保驾护航。非凡微信社群营销服务平台 www.haqsl.com
我们提供【社群管理裂变】【自动建群】【多群转播】【活码系统】【小程序开发】【公众号开发】【各类商城 SAAS】一站式服务,各类功能提供免费体验,满意付款,如您还有其他疑问请您添加企鹅/微信 1003312430 方便咨询哦。
非凡社群助手------微信活码系统演示(客户活码二维码累计扫描量一千万+)
活码系统介绍:
二维码图案不变,内容可随时变更, 极大提高营销效果,基于活码技术,二维码图案更简单,扫码更加容易宣传海报、二维码印刷、商品.群.软文。
让二维码图案更简单,扫码更加容易宣传。
,
特殊微信社群营销服务平台 www.haqsl.com 我们提供【社群治理裂变】【自动建群】【多群转播】【活码系统】【小程序开发】【民众号开发】【种种商城 SAAS】一站式服务,种种功效提供免费体验,知足付款,如您尚有其他疑问请您添加企鹅/微信 1003312430 利便咨询哦。
特殊社群助手——微信活码系统演示(客户活码二维码累计扫描量一万万+)
活码系统先容:
二维码图案稳固,内容可随时调换, 极大提高营销效果,基于活码手艺,二维码图案更简朴,扫码加倍容易宣传海报、二维码印刷、商品.群.软文。
让二维码图案更简朴,扫码加倍容易宣传。,
前言
zxing 是一款跨平台的基于 Java 实现的处置一维或二维条码的库。支持多种名堂,一维条码支持 UPC-A,UPC-E,EAN-8,Code 39,Code 93 等名堂,二维条码支持 QR Code,Data Matrix,PDF 417,MaxiCode 等名堂。
上述的二维条码指的是较宽泛的二维条码,而不是 QR Code 示意的二维码。
原本 Lark 直接集成了 zxing 实现扫一扫功效。由于 Lark 的特殊营业需求,因此并不需要支持到这么多名堂,只需要支持 QR Code,因此我们对 zxing 内部举行定制,使得 zxing 只支持 QR Code。这样既可以削减 zxing 库的巨细,也可以加速 zxing 处置一帧数据的速率。
优化主要包罗两方面:(1)扫描性能(2)交互体验。
扫描性能优化包罗:
- 去除 zxing 格外支持的名堂。
- 删除 zxing 冗余代码。
- 将处置相机帧从串行改为并行。
交互体验优化包罗:
- 自动放大。
- 双击放大。
- 重力传感器聚焦。
- 手势调整焦距。
1. 去除 zxing 格外支持的名堂
MultiFormatReader 的 decodeWithState()是使用方的入口方式,内部挪用了 decodeInternal(),输入是相机的一帧数据,若是抛了 NotFoundException,则示意没找到二维码;若是返回了 Result,则示意找到了二维码,并剖析完成。代码如下:
其中,readers 变量是一个数组,数组的巨细示意支持的条码名堂个数,zxing 原本由于支持许多名堂,因此这个数组长度对照长。当拿到相机的一帧数据后,需要去检测是否是所有支持名堂的某一个名堂,每一种名堂的检测都需要破费一些时间,因此这个遍历对于 Lark 是不需要的。若是将 zxing 内部定制成只支持 QR Code 名堂,那么就免去了格外的名堂检测。
2. 删除 zxing 冗余代码
我们主要从几方面删除冗余代码:
- 删除 zxing 除了二维码之外的名堂的相关代码,zxing 对每种名堂的相关代码都放在各自的目录中,因此我们只需要把这些名堂对应的目录删除即可,好比 aztec、maxicode 等。
- 删除二维码的 encode 相关代码,即”qrcode/encoder”目录。
- 删除 decode 后文本的剖析相关类(好比地址、通讯录、邮件等剖析类),只保留 URI、URL、Text。
通过以上方式,zxing 文件数目从 263 个缩减到 67 个,库巨细从 1.8M 缩减到 451K,效果异常显著。
3. 将处置相机帧从串行改为并行
原本 Lark 扫一扫的逻辑是串行的,如下图:
每次从 onPreviewFrame()中获取一帧数据,然后挪用 zxing 的 decode 剖析二维码,若是乐成,则返回;若是失败,则挪用 setOneShotPreviewCallback()重新挪用一次 onPreviewFrame()。
瑕玷是若是处置一帧数据时间很长,会阻碍下一帧的处置,好比上一帧是没有二维码的,而下一帧是有二维码的,若是上一帧处置时间较长,那么虽然用户瞄准了二维码,然则现实处置的照样上一帧,因此不太合理。
我们将串行处置改成并行处置,一旦从 onPreviewFrame()获取一帧数据,将 decode 义务丢进线程池,并马上挪用 setOneShotPreviewCallback()获取下一帧数据。一旦某个义务检测到二维码,马上将 isSuccess 变量置为 true,忽略其他义务。这样能够大大加速二维码检测的速率。
4. 自动放大
当二维码很小很远时,自动放大能大大加速检测二维码的速率。
QRCodeReader 的 decode()是二维码检测的主方式,分为两步:(1)大致判断是否存在二维码;(2)解码。
第一步只是检测是否存在二维码,好比去寻找是否存在 Position Detection Pattern,Timing Pattern,Alignment Pattern。若是检测到了,则返回 DetectorResult,内部包罗了定位点的位置信息;若是没检测到,则抛出 NotFoundException。若是二维码很小,纵然第一步检测存在二维码,然则第二步解码也可能会失败。由于我们在第一步已经能够知道二维码的巨细,因此凭证 DetectorResult 返回的二维码定位点信息盘算出二维码的大致宽度,然后判断二维码巨细在扫码框中是否足够小,若是足够小,则放大一定焦距:若是小于十分之一,则放大到最大焦距;若是小于即是六分之一,则放大到最大焦距的一半。
详细二维码的原理参见: 。
我们实现了 zoomCamera(),若是判断需要放大,则返回 true,若是不需要放大,则返回 false。代码如下:
我们在第一步和第二步中央插入该方式,若是需要放大,则不执行第二步;若是二维码已经足够大,则执行第二步。代码如下:
5. 双击放大
原本 Lark 的二维码扫描中没有调整焦距的功效,这个对于一些特定场景下会不太利便,因此这里加入了双击放大的功效能够对焦距举行简略的调整。行使 GestureDetector 的 onDoubleTap()回调捕捉用户双击事宜,并在 CameraPreview 中的 onTouchEvent()中添加 mGestureDetector.onTouchEvent()。实现如下:
6. 重力传感器聚焦
重力传感器能够捕捉用户手机的运动状态,当检测到用户手机住手时,触发对焦逻辑。我们通过实现 SensorEventListener 接口,并重写 onSensorChanged()监听手机的运动状态。
7. 手势调整焦距
为了更精致化的让用户调整焦距,我们提供了手势来缩放焦距。通过在 onTouchEvent()中获取用户两个手指的距离是越来越近照样越来越远来调整焦距。代码如下:
优化效果
经由上述优化,不仅增添了用户体验,而且还大幅增添了二维码扫描速率。 测试手机:坚果 Pro,4G 内存,Android 7.1.1。
上图示意了从打开相机到二维码解码乐成的耗时,可以看出,整体时间提升了 300%+。
上图示意检测失败时的耗时指的是当相机帧中没有二维码时检测的时间,检测失败耗时的削减有助于更快地处置相机帧数据,当包罗二维码的帧泛起时更快地处置它;上图中看出,耗时削减 300%+。
上图示意检测乐成时的耗时指的是当相机帧中有二维码时检测+解码的时间;上图中看出,耗时削减 150%+。
还没有人赞赏,快来当第一个赞赏的人吧!
- 2¥
- 5¥
- 10¥
- 20¥
- 50¥
声明:本文来自非凡微信机器人助手投稿,不代表微信机器人立场,版权归原作者所有,欢迎分享本文,转载请保留出处!