AVFoundation掃描二維碼,條形碼

在使用AVFoundation以前用過,zbar,zxing來實現二維碼的生成以及解析,可是未進行掃描二維碼,經過查閱資料發現使用AVFoundation會更有優點。html

zbar和zxing有哪些優劣勢能夠看看:http://www.cocoachina.com/industry/20140530/8615.html  這篇文章,這裏就很少述。git

本文主要是爲了說明,在參考網上一些使用AVFoundation進行掃描去實現二維碼,條形碼掃描時出現的問題,解決的方法以及技巧。github

1、實現ide

    參考上面提供的裏面的代碼,應該均可以實現效果,也能夠參考本人的寫的一個demo:https://github.com/yanghaha/HYScanningView spa

二,問題及解決rest

    在封裝HYScanningView 這個控件的時候,發現掃描區域的設定的問題。code

    查詢相關資料,發現好多資料也提到了關鍵點,設置AVCaptureMetadataOutput的rectOfInterest屬性,可是須要注意的rectOfInterest這個範圍都是0~1之間的數值;並且在設置rectOfInterest的方法上大部分相似以下代碼htm

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 = 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 = 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);
}

這段代碼看上去沒問題,可是本人使用的是如下這段代碼get

   CGRect rectOfInterest = [self.videoPreviewLayer metadataOutputRectOfInterestForRect:self.boxFrame];
    _output.rectOfInterest = rectOfInterest;

使用it

self.videoPreviewLayer metadataOutputRectOfInterestForRect:self.boxFrame

這個獲取轉換後的rect時,須要確保 self.videoPreviewLayer已經添加到指定的layer上而且已顯示

相關文章
相關標籤/搜索