一.二維碼的介紹
- 二維碼是用特定的幾何圖形來記錄信息
- 常用的二維碼開發(fā)框架有:ZXing和ZBarSDK
- 蘋果從iOS7開始集成了二維碼的生成和讀取功能,并且之前的框架不支持64位,因此目前只使用蘋果的框架即可
二.二維碼的生成
- 二維碼的生成就是將固定的信息生成對應(yīng)的二維碼圖形
- 生成二維碼的步驟:
- 導(dǎo)入CoreImage框架
- 通過濾鏡CIFilter生成二維碼
- 創(chuàng)建濾鏡對象
- 設(shè)置濾鏡的默認(rèn)設(shè)置
- 給濾鏡設(shè)置數(shù)據(jù)(KVC)
- 獲取生成的二維碼圖形
//1. 創(chuàng)建濾鏡
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 2.恢復(fù)默認(rèn)設(shè)置
[filter setDefaults];
// 3. 設(shè)置數(shù)據(jù)
NSString *info = @"http://www.reibang.com/users/57da48d44319/latest_articles";
NSData *infoData = [info dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:infoData forKey:@"inputMessage"];
// 4. 生成二維碼
CIImage *im = [filter outputImage] ;
self.imageView.image = [im createNonInterpolatedWithSize:300.0];
三.二維碼的掃描
- 二維碼掃描就是將二維碼的圖像讀取,并且解析成我們可以識別的信息
- 掃描二維碼的步驟
- 讀取二維碼需要導(dǎo)入AVFoundation框架
- 利用攝像頭讀取信息,并且輸入
- 獲取捕捉會話(AVCaptureSession)
- 設(shè)置輸入(攝像頭)
- 設(shè)置輸出(數(shù)據(jù))
- 添加預(yù)覽圖層
- 開始掃描二維碼
#pragma mark - 掃描二維碼
- (void)scanEWM{
// 1.創(chuàng)建捕捉會話
AVCaptureSession *session = [[AVCaptureSession alloc] init];
self.session = session;
// 2.設(shè)置輸入(攝像頭)
// AVMediaTypeVideo:攝像頭 AVMediaTypeAudio:話筒 AVMediaTypeMuxed:彈幕
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
[session addInput:input];
// 3.設(shè)置輸出(數(shù)據(jù))
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:output];
// 設(shè)置輸入的類型,必須在output加入到會話之后來設(shè)置
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
// 4.添加閱覽圖層
AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
layer.frame = self.view.bounds;
[self.view.layer addSublayer:layer];
self.layer = layer;
// 5.開始掃描
[session startRunning];
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if (metadataObjects.count > 0) {
// 1.獲取掃描到的內(nèi)容
AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
NSLog(@"%@", object.stringValue);
// 2.停止會話
[self.session stopRunning];
// 3.移除預(yù)覽圖層
[self.layer removeFromSuperlayer];
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者