iOS_AVCaptureSessionを使用してQRコードとバーコードのスキャンを実現
3053 ワード
前の記事では、明確なQRコードの画像を生成する方法について説明しましたが、今日はiOS 7を使用します.0以降、アップルが公式に提供してくれたQRコードとバーコードをスキャンする方法は、ZBarやZXingという比較的古いサードパーティを聞いたことがあるかもしれませんが、公式APIがない前に、この2つのサードパーティは32ビットの時期に私たちに大きな助けを与えてくれて、深く感謝しています.しかし、システムの独自の方法の使用を経て、アップルが公式に書いたAPIの効率が本当に高いことを発見しました.次にスキャンを実行します.
ステップ1:
ステップ2:
ステップ3:
ステップ4:
ステップ5:
ステップ6:
注:不足点がありますが、引き続き研究を続けます.ありがとうございます.
ステップ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];
}
}
注:不足点がありますが、引き続き研究を続けます.ありがとうございます.