這里簡單總結一下關於二維碼的掃描與生成,用的是原生的AVFoundation框架,其實這個框架目前功能還是夠用的,不過這里推薦一個二維碼掃描的第三方(face++),網址就不貼了,直接度娘就OK,里面的內容足夠豐富,感興趣的朋友可以自己去倒弄一下。
一.二維碼的掃描
步驟:
1.創建輸入視頻設備(默認是后置攝像頭)
2.創建輸入設備對象
3.創建元數據輸出設備
4.創建session目的是將輸入和輸出聯系在一起)
5.把輸出設備添加到session,將輸入設備添加到session
6.設置數據源的類型(需要真機這個才有值),指定代理(在代理方法中監聽結果)
7.開始掃描
8.添加視頻的預覽界面(這里是打開相機
9.代理方法的實現
代碼實現:
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 4 // 1.創建輸入視頻設備 5 //默認為后置攝像頭 6 AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 7 // 2.創建輸入設備對象 8 NSError * error = nil; 9 AVCaptureDeviceInput * inputDevice = [[AVCaptureDeviceInput alloc]initWithDevice:device error:&error]; 10 11 // 3.創建元數據輸出設備 12 AVCaptureMetadataOutput * outputDevice = [[AVCaptureMetadataOutput alloc]init]; 13 // 4.創建session(作用是為了將輸入和輸出聯系起來) 14 self.session = [[AVCaptureSession alloc]init]; 15 // 5.把輸出設備添加到session 16 if ([self.session canAddOutput:outputDevice]) { 17 [self.session addOutput:outputDevice]; 18 } 19 // 6.把輸入設備添加的session 20 if ([self.session canAddInput:inputDevice]) { 21 [self.session addInput:inputDevice]; 22 } 23 // 7.設置數據源類型,這個值要真機才會有值 24 // NSLog(@"%@",outputDevice.availableMetadataObjectTypes); 25 outputDevice.metadataObjectTypes = @[@"org.iso.QRCode"]; 26 //設置輸出的代理 27 [outputDevice setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; 28 // 8.開始掃描 29 [self.session startRunning]; 30 31 // 9.設置預覽界面 32 //視頻預覽層 33 AVCaptureVideoPreviewLayer * previewL = [[AVCaptureVideoPreviewLayer alloc]initWithSession:self.session]; 34 //設置frame 35 previewL.frame = self.view.bounds; 36 //添加到控制器的view 37 [self.view.layer addSublayer:previewL]; 38 39 } 40 41 #pragma mark - AVCaptureMetadataOutputObjectsDelegate 42 //在這個代理中打印輸出的結果 43 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection 44 { 45 AVMetadataMachineReadableCodeObject * object = [metadataObjects firstObject]; 46 NSLog(@"%@",object.stringValue); 47 //停止掃描,這樣相機會停住了 48 [self.session stopRunning]; 49 }
二.二維碼的生成(此列是根據一段文本生成一個二維碼的圖片)
1 1.1 創建用於生成二維碼濾鏡 2 CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; 3 NSData *messageData = [@"最近好嗎?" dataUsingEncoding:NSUTF8StringEncoding]; 4 // 1.2 設置二維濾鏡的輸入 5 [qrFilter setValue:messageData forKey:@"inputMessage"]; 6 // 1.3取出圖片 7 CIImage *ciImage = qrFilter.outputImage; 8 // 1.4 放大圖片 9 ciImage = [ciImage imageByApplyingTransform:CGAffineTransformMakeScale(8, 8)]; 10 11 #pragma mark - 修改二維碼的前景色和背景色 12 // 修改二維碼的前景色和背景色,當你修改了前景色或背景色都會降低圖片的識別度 13 CIFilter *falseColorFilter = [CIFilter filterWithName:@"CIFalseColor"]; 14 // inputImage, 圖片 15 // inputColor0, 前景顏色 16 // inputColor1 背景色 17 // 這三個參數都是CoreImage中的對象 18 // NSLog(@"%@",falseColorFilter.inputKeys); 19 // 圖片 20 [falseColorFilter setValue:ciImage forKey:@"inputImage"]; 21 // 前景色 22 [falseColorFilter setValue:[CIColor colorWithRed:1 green:0 blue:0] forKey:@"inputColor0"]; 23 // 背景色 24 [falseColorFilter setValue:[CIColor colorWithRed:0 green:0 blue:1] forKey:@"inputColor1"]; 25 26 27 28 // 取出濾鏡中的圖片 29 ciImage = falseColorFilter.outputImage; 30 31 // 二維碼上面添加頭像,也會降低二維碼的識別度 32 UIImage *qrImage = [UIImage imageWithCIImage:ciImage]; 33 34 #pragma mark - 在原來的二維碼的圖片上畫一個頭像 35 // 在原來的二維碼的圖片上畫一個頭像 36 // 開啟圖片上下文 37 UIGraphicsBeginImageContext(qrImage.size); 38 // 繪制二維碼圖片 39 [qrImage drawInRect:CGRectMake(0, 0, qrImage.size.width, qrImage.size.height)]; 40 // 繪制頭像 41 UIImage *headImage = [UIImage imageNamed:@"cang"]; 42 CGFloat headW = qrImage.size.width * 0.2; 43 CGFloat headH = qrImage.size.height * 0.2; 44 CGFloat headX = (qrImage.size.width - headW) * 0.5; 45 CGFloat headY = (qrImage.size.height - headH) * 0.5; 46 [headImage drawInRect:CGRectMake(headX, headY, headW, headH)]; 47 // 從圖片上下文中取出圖片 48 qrImage = UIGraphicsGetImageFromCurrentImageContext(); 49 50 // 關閉圖片上下文 51 UIGraphicsEndImageContext(); 52 53 // 1.6 把CIImage轉換為UIImage 54 self.imageView.image = qrImage; 55
效果圖:
ps:此列比較簡單,寫得比較簡陋,后續有需求會逐漸完善,大家有什么好的代碼也可以貼上來,一起交流。