使用IOS7原生API進行二維碼條形碼的掃描

IOS7以前,開發者進行掃碼編程時,通常會藉助第三方庫。經常使用的是ZBarSDK,IOS7以後系統的AVMetadataObject類中,爲咱們提供瞭解析二維碼的接口。通過測試,使用原生API掃描和處理的效率很是高,遠遠高於第三方庫。web

1、使用方法示例

官方提供的接口很是簡單,代碼以下:編程

@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>//用於處理採集信息的代理
{
    AVCaptureSession * session;//輸入輸出的中間橋樑
}
@end
@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //獲取攝像設備
    AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    //建立輸入流
    AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
    //建立輸出流
    AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];
    //設置代理 在主線程裏刷新
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
     
    //初始化連接對象
    session = [[AVCaptureSession alloc]init];
    //高質量採集率
    [session setSessionPreset:AVCaptureSessionPresetHigh];
     
    [session addInput:input];
    [session addOutput:output];
    //設置掃碼支持的編碼格式(以下設置條形碼和二維碼兼容)
    output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
        
    AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:session];
    layer.videoGravity=AVLayerVideoGravityResizeAspectFill;
    layer.frame=self.view.layer.bounds;
    [self.view.layer insertSublayer:layer atIndex:0];
    //開始捕獲
    [session startRunning];
}

以後咱們的UI上已經能夠看到攝像頭捕獲的內容,只要實現代理中的方法,就能夠完成二維碼條形碼的掃描:session

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    if (metadataObjects.count>0) {
        //[session stopRunning];
        AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex : 0 ];
        //輸出掃描字符串
        NSLog(@"%@",metadataObject.stringValue);
    }
}

 

2、一些優化

經過上面的代碼測試,咱們能夠發現系統的解析處理效率是至關的高,IOS官方提供的API也確實很是強大,然而,咱們能夠作進一步的優化,將效率更加提升:
app

首先AVCaptureMetadataOutput類中有一個這樣的屬性(在IOS7.0以後可用):ide

@property(nonatomic) CGRect rectOfInterest;測試

這個屬性大體意思就是告訴系統它須要注意的區域,大部分APP的掃碼UI中都會有一個框,提醒你將條形碼放入那個區域,這個屬性的做用就在這裏,它能夠設置一個範圍,只處理在這個範圍內捕獲到的圖像的信息。如此一來,可想而知,咱們代碼的效率又會獲得很大的提升,在使用這個屬性的時候。須要幾點注意:
優化

一、這個CGRect參數和普通的Rect範圍不太同樣,它的四個值的範圍都是0-1,表示比例。編碼

二、通過測試發現,這個參數裏面的x對應的偏偏是距離左上角的垂直距離,y對應的是距離左上角的水平距離。atom

三、寬度和高度設置的狀況也是相似。spa

三、舉個例子若是咱們想讓掃描的處理區域是屏幕的下半部分,咱們這樣設置

?

1
output.rectOfInterest=CGRectMake(0.5,0,0.5, 1);

具體apple爲何要設計成這樣,或者是這個參數個人用法那裏不對,還須要瞭解的朋友給個指導。

相關文章
相關標籤/搜索