前期准备
#import <CoreImage/CoreImage.h> #import <AssetsLibrary/AssetsLibrary.h> #import <AVFoundation/AVFoundation.h> @interface QRViewController ()<AVCaptureMetadataOutputObjectsDelegate> @property (nonatomic, strong) UIImageView *QRimageV; @property (strong,nonatomic)AVCaptureDevice * device; @property (strong,nonatomic)AVCaptureDeviceInput * input; @property (strong,nonatomic)AVCaptureMetadataOutput * output; @property (strong,nonatomic)AVCaptureSession * session; @property (strong,nonatomic)AVCaptureVideoPreviewLayer * preview; @end生成二维码
//生成二维码 - (void)getQRImage{ //1.创建滤镜 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; //滤镜回复默认设置 [filter setDefaults]; //2.给滤镜添加数据 NSString *str = @"my name is WX"; NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; [filter setValue:data forKeyPath:@"inputMessage"];//使用kvc形式给filter赋值 //3.生成二维码 CIImage *image = [filter outputImage]; //4.显示二维码 // self.QRimageV.image = [UIImage imageWithCIImage:image]; //图片会模糊 self.QRimageV.image = [self createNonInterpolatedUIImageFormCIImage:image withSize:200]; }处理二维码图片模糊问题
//处理二维码不清晰问题 - (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size { CGRect extent = CGRectIntegral(image.extent); //设置比例 CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent)); // 创建bitmap(位图); size_t width = CGRectGetWidth(extent) * scale; size_t height = CGRectGetHeight(extent) * scale; CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray(); CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone); CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef bitmapImage = [context createCGImage:image fromRect:extent]; CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone); CGContextScaleCTM(bitmapRef, scale, scale); CGContextDrawImage(bitmapRef, extent, bitmapImage); // 保存bitmap到图片 CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef); CGContextRelease(bitmapRef); CGImageRelease(bitmapImage); return [UIImage imageWithCGImage:scaledImage]; }保存二维码图片到本地
//保存图片 - (void)saveImage:(UIImage *)image{ __block ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init]; [lib writeImageToSavedPhotosAlbum:image.CGImage metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) { NSLog(@"assetURL = %@, error = %@", assetURL, error); lib = nil; }]; }扫描二维码
//扫描二维码 - (void)scanQR{ // Device _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; // Input _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil]; // Output _output = [[AVCaptureMetadataOutput alloc]init]; [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; // Session _session = [[AVCaptureSession alloc]init]; [_session setSessionPreset:AVCaptureSessionPresetHigh]; //连接输入输出 if ([_session canAddInput:self.input]) { [_session addInput:self.input]; } if ([_session canAddOutput:self.output]) { [_session addOutput:self.output]; } //设置条形码类型 _output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode]; //添加扫描画面 _preview =[AVCaptureVideoPreviewLayer layerWithSession:_session]; _preview.videoGravity =AVLayerVideoGravityResizeAspectFill; _preview.frame =self.view.layer.bounds; [self.view.layer insertSublayer:_preview atIndex:0]; //开始扫面 [_session startRunning]; }实现扫描之后的代理方法
#pragma 实现扫描后的代理方法 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { NSString *stringValue; if ([metadataObjects count] >0){ //停止扫描 [_session stopRunning]; AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0]; stringValue = metadataObject.stringValue; NSLog(@"stringValue==%@",stringValue); //二维码中的内容 } }