iOS二維碼掃描,快速識別的兩個小妙招

iOS6.0以后,二維碼識別便拋棄了ZBar和ZXing,而是使用掃描靈敏度和性能都最優(yōu)的AVFoundation框架。如果需要兼容iOS7.0以下版本,可以使用ZBar和ZXing,但是在這里就不再對它們多做贅述了。直奔主題,說一說怎么通過對AVFoundation的優(yōu)化,進一步提高二維碼識別的靈敏度和速度。

1.設(shè)置 sessionPreset 屬性

測試的時候,有些二維碼非常小,有的時候距離二維碼比較遠(yuǎn),都會造成無法正常識別二維碼。距離遠(yuǎn)的還可以將手機湊近點,以提高掃描的靈敏度。但是二維碼本身就小的,湊近了無法聚焦,離遠(yuǎn)了又無法識別,必然需要通過相機的像素進行優(yōu)化。

AVCaptureSession 可以設(shè)置 sessionPreset 屬性,這個決定了視頻輸入每一幀圖像質(zhì)量的大小。

  • AVCaptureSessionPreset320x240
  • AVCaptureSessionPreset352x288
  • AVCaptureSessionPreset640x480
  • AVCaptureSessionPreset960x540
  • AVCaptureSessionPreset1280x720
  • AVCaptureSessionPreset1920x1080

以上列舉了部分的屬性值,分別代表輸入圖片質(zhì)量大小,一般來說AVCaptureSessionPreset640x480就夠使用,但是如果要保證較小的二維碼圖片能快速掃描,最好設(shè)置高些,如AVCaptureSessionPreset1920x1080(就是我們常說的1080p)。

  • AVCaptureSessionPreset3840x2160

另外還有一個屬性值,是iOS9.0以后的,適合3840x2160(UHD 4K)視頻輸出,建議慎用,用不好的話,程序會崩。

2.設(shè)置rectOfInterest屬性

AVCaptureMetadataOutput可以設(shè)置rectOfInterest屬性,這個屬性是用來限制二維碼掃描范圍的,一般設(shè)定的范圍都是我們給定好的正方形大小。

_output.rectOfInterest =[self rectOfInterestByScanViewRect:imageView.frame];

或者:

_output.rectOfInterest =[self rectOfInterestByScanViewRect:CGRectMake(0.1, 0, 0.9, 1)];

現(xiàn)在對rectOfInterest屬性的大小,進行了一些修正。代碼如下:

CGSize size = self.view.bounds.size;
CGRect cropRect = CGRectMake(40, 100, 240, 240);
CGFloat p1 = size.height/size.width;
CGFloat p2 = 1920./1080.;  //使用了1080p的圖像輸出
if (p1 < p2) {
     CGFloat fixHeight = self.view.bounds.size.width * 1920. / 1080.;
     CGFloat fixPadding = (fixHeight - size.height)/2;
     captureOutput.rectOfInterest = CGRectMake((cropRect.origin.y +              fixPadding)/fixHeight,
                                              cropRect.origin.x/size.width,
                                              cropRect.size.height/fixHeight,
                                              cropRect.size.width/size.width);
} else {
    CGFloat fixWidth = self.view.bounds.size.height * 1080. / 1920.;
    CGFloat fixPadding = (fixWidth - size.width)/2;
    captureOutput.rectOfInterest = CGRectMake(cropRect.origin.y/size.height,
                                              (cropRect.origin.x + fixPadding)/fixWidth,
                                              cropRect.size.height/size.height,
                                              cropRect.size.width/fixWidth);
}

這樣以來,確實大大提高了掃描的靈敏度,哪怕是二維碼距離稍遠(yuǎn)也能夠輕松掃描出結(jié)果。親測有效,歡迎嘗試。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、掃描 1、 ZBar ZBar在掃描的靈敏度上,和內(nèi)存的使用上相對于ZXing上都是較優(yōu)的,但是對于 “圓角二...
    空白Null閱讀 1,142評論 0 2
  • 現(xiàn)今我們的生活已經(jīng)離不開了二維碼了,無論是出行、購物、吃飯、娛樂等等都伴隨著二維碼的身影,二維碼讓我們的生活更便利...
    this帥氣的名字閱讀 2,671評論 0 4
  • 在 iOS7 以前,在iOS中實現(xiàn)二維碼和條形碼掃描,我們所知的有,兩大開源組件ZBar與ZXing. 這兩大組件...
    野豬哥123閱讀 1,669評論 0 2
  • 青山婉鳴 哀鴻鳴吹著明天 歲月依老了黯淡 一陣風(fēng)吹涼了年華 太認(rèn)真 明月掛心頭 卻照不亮心間 一種憂傷陪伴我把大地...
    九莫閱讀 200評論 0 0
  • 文/寶木笑 1. 見過的新人基本上九成九是熱情似火,干勁兒十足,理想遠(yuǎn)大,欲望強烈,無法自控,恨天無把恨地?zé)o環(huán),恨...
    寶木笑閱讀 1,262評論 8 12

友情鏈接更多精彩內(nèi)容