基于iOS原生態(tài)API 的二維碼掃描

前幾天由于項(xiàng)目的需要,需要對(duì)名片的二維碼進(jìn)行掃描,獲取名片上的信息, 在掃描的過(guò)程中發(fā)現(xiàn)對(duì)有些二維碼圖像界面比較復(fù)雜時(shí), ZBarSDK 這個(gè)第三方無(wú)法掃描成功, 具體是什么原因還尚不清楚, 于是利用的原生態(tài)的二維碼API, 在iOS7 之后, 蘋(píng)果提供了一套掃描二維碼的API。
基本設(shè)置代碼如下:

 - (void)scanBeginning
{
    //獲取攝像設(shè)備
    AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    //創(chuàng)建輸入流
    AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
    //創(chuàng)建輸出流
    AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];
    //設(shè)置代理 在主線(xiàn)程里刷新
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    
    
    //初始化鏈接對(duì)象
    self.session = [[AVCaptureSession alloc]init];
    //高質(zhì)量采集率
    [self.session setSessionPreset:AVCaptureSessionPresetHigh];
    
    [self.session addInput:input];
    [self.session addOutput:output];
    //設(shè)置掃碼支持的編碼格式(如下設(shè)置條形碼和二維碼兼容)
    output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
    
    AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    layer.videoGravity=AVLayerVideoGravityResizeAspectFill;
    layer.frame=self.view.layer.bounds;
    [self.view.layer insertSublayer:layer atIndex:0];
    
//    //掃描區(qū)域坐標(biāo)系轉(zhuǎn)換 不知道為什么轉(zhuǎn)換不了
//    CGRect intertRect = [layer metadataOutputRectOfInterestForRect:_scanCropView.frame];
    //rectOfInterest 是一個(gè) CGRect 類(lèi)型, 其值在(0,1)之間
    CGFloat x = _scanCropView.frame.origin.x / CGRectGetWidth(self.view.frame);
    CGFloat y = _scanCropView.frame.origin.y / CGRectGetWidth(self.view.frame);
    CGFloat width = _scanCropView.frame.size.width / CGRectGetHeight(self.view.frame);
    CGFloat height = _scanCropView.frame.size.height / CGRectGetHeight(self.view.frame);
    output.rectOfInterest = CGRectMake(x, y, width, height);
    DLog(@"______%@",NSStringFromCGRect(CGRectMake(x, y, width, height)));
    
    //開(kāi)始捕獲
    [self.session startRunning];
}

掃描的結(jié)果在代理方法里返回:

#pragma mark - Delegate
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    if (metadataObjects.count>0) {
        AVMetadataMachineReadableCodeObject * metadataObject = metadataObjects.firstObject;
        //輸出掃描字符串
        NSString *resultStr = metadataObject.stringValue;
        // 這是返回的掃描結(jié)果
        DLog(@"_________%@",resultStr);
    }
}

完整的 Demo已上傳到 Github: https://github.com/leo-ll/QRCode

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

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

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