这里简单总结一下关于二维码的扫描与生成,用的是原生的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:此列比较简单,写得比较简陋,后续有需求会逐渐完善,大家有什么好的代码也可以贴上来,一起交流。