iOS中二維碼的生成與使用(入門篇)


      這里簡單總結一下關於二維碼的掃描與生成,用的是原生的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:此列比較簡單,寫得比較簡陋,后續有需求會逐漸完善,大家有什么好的代碼也可以貼上來,一起交流。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM