项目简介
做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing。IOS 7.0之后,可以使用AVFoundation框架开发原生的二维码扫描功能。
这里,实现一个案例,具有以下功能:
1.使用AVFoundation扫描二维码,扫描的同时扫描线上下移动
2.使用ZBar SDK解析 相册中现有的二维码图片
3.可以切换灯光的开闭。
项目的界面。
扫描二维码功能的实现
首先,创建与扫描二维码相关的一系列AVFoundation对象
<span style="font-weight: normal;">- (void)prepareForCaptureQRCode{
AVCaptureSession *captureSession=[[AVCaptureSession alloc] init];
captureSession.sessionPreset=AVCaptureSessionPreset640x480;
self.captureSession=captureSession;
AVCaptureDevice *captureDevice=[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
self.captureDevice=captureDevice;
NSError *deviceInputError;
AVCaptureDeviceInput *captureDeviceInput=[AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&deviceInputError ];
AVCaptureMetadataOutput *captureMetadataOutput=[[AVCaptureMetadataOutput alloc] init];
dispatch_queue_t myQueue=dispatch_queue_create("myQueue", NULL);
[captureMetadataOutput setMetadataObjectsDelegate:self queue:myQueue];
if ([captureSession canAddInput:captureDeviceInput]) {
[captureSession addInput:captureDeviceInput];
}
if ([captureSession canAddOutput:captureMetadataOutput]) {
[captureSession addOutput:captureMetadataOutput];
}
//注意,在设置输出数据类型之前,一定要把输出对象添加到session中
[captureMetadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer=[[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];
captureVideoPreviewLayer.frame=self.view.bounds;
captureVideoPreviewLayer.videoGravity=AVLayerVideoGravityResizeAspectFill;
self.captureVideoPreviewLayer=captureVideoPreviewLayer;
[self.view.layer insertSublayer:captureVideoPreviewLayer atIndex:0];
captureMetadataOutput.rectOfInterest=[self resizeRectOfInterest:CGSizeMake(480, 640)];
}</span>
有几个重要的属性需要解释一下。
1.AVCaptureSession的sessionPreset属性 指定拍摄的视频或者图片的大小。如AVCaptureSessionPreset640x480,指定视频或者图片的高为640,宽为480.
2.设置AVCaptureMetadataOutput的Metada