iOS_AVCaptureSessionを使用してQRコードとバーコードのスキャンを実現

3053 ワード

前の記事では、明確なQRコードの画像を生成する方法について説明しましたが、今日はiOS 7を使用します.0以降、アップルが公式に提供してくれたQRコードとバーコードをスキャンする方法は、ZBarやZXingという比較的古いサードパーティを聞いたことがあるかもしれませんが、公式APIがない前に、この2つのサードパーティは32ビットの時期に私たちに大きな助けを与えてくれて、深く感謝しています.しかし、システムの独自の方法の使用を経て、アップルが公式に書いたAPIの効率が本当に高いことを発見しました.次にスキャンを実行します.
ステップ1:
//  AVFoundation  
#import 

ステップ2:
//   ,                
@interface ViewController ()

ステップ3:
@property(nonatomic, strong)AVCaptureSession *session;//         

ステップ4:
#pragma mark --     
- (void)startScanWithSize:(CGFloat)sizeValue
{
    //      
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    //     
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
    //         
    if (input) {
        //     
        AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];
        //    ,       ,    self   AVCaptureMetadataOutputObjectsDelegate  
        [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
        //       
        self.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;
        //      200             
        layer.frame = CGRectMake((self.view.bounds.size.width - sizeValue) / 2.0, (self.view.bounds.size.height - sizeValue) / 2.0, sizeValue, sizeValue);
        [self.view.layer insertSublayer:layer atIndex:0];
        //      :
        [_session startRunning];
    }
}

ステップ5:
#pragma mark --       
- (void)viewDidLoad {
    [super viewDidLoad];
    //300          
    [self startScanWithSize:300];
}

ステップ6:
#pragma mark -                
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    if (metadataObjects.count>0) {
        //          :
        [_session stopRunning];
        AVMetadataMachineReadableCodeObject *metaDataObject = [metadataObjects objectAtIndex:0];
        //       :
        NSLog(@"%@", metaDataObject.stringValue);
        //      :
        AVCaptureVideoPreviewLayer *layer = (AVCaptureVideoPreviewLayer *)[[self.view.layer sublayers] objectAtIndex:0];
        [layer removeFromSuperlayer];
    }
}

注:不足点がありますが、引き続き研究を続けます.ありがとうございます.