iOS原生二维码的生成
现在大多数的App都使用到二维码,所以就需要我们在App开发的时候,加入这个功能。其实苹果官方也提供了这样的框架,这个框架是需要手动添加的
1. 导入库后,我们就可以对象了
// 创建过滤对象CIQRCodeGenerator必须这样写 才可以创建出来二维码(意思就是我要创建的是二维码,个人理解,英语水平有限)
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
2.这个对象是需要初始化后 ,要恢复下他的默认设置 (也就一句代码)
// 恢复默认
[filter setDefaults];
3.这样对象我们就可以设置好了 现在我们改设置下要生成的内容了 (如果你设置的是个网址,也不需要转化为NSURL的,直接设置为NSString就可以,可以自动转化的)
// 3.0 给过滤器添加数据 如果想设置网址时 直接将网址设置为NSString
// NSString *dataString = @"小爱八点半";
NSString *dataString = @"http://www.baidu.com";
NSData *data =[dataString dataUsingEncoding:4];// 这个就是转化为UFT-8
// 利用KVC将数据设置给过滤器 inputMessage也必须这样写
[filter setValue:data forKeyPath:@"inputMessage"];
在此的过滤对象设置些 二维码的颜色
UIColor *onColor = [UIColor blackColor];// 绘制的颜色4.数据已经设置好了,也该生成最后的二维码了 图片生成了,
UIColor *offColor = [UIColor whiteColor];// 空白的颜色
//上色
CIFilter *colorFilter = [CIFilter filterWithName:@"CIFalseColor" keysAndValues:@"inputImage",qrFilter.outputImage,@"inputColor0",[CIColor colorWithCGColor:onColor.CGColor],@"inputColor1",[CIColor colorWithCGColor:offColor.CGColor],nil];
// 获取二维码
CIImage * ciimage =[colorFilter outputImage];
5。但是该注意了,他是CIImage哟 其实也没啥难度的,也就是一句代码就可以的
self.imageView.image = [UIImage imageWithCIImage:ciimage];
这样我们的二维码就能够现实出来了,但是显示出来不是很清楚的(这就是苹果的坑爹之处),如果你们的策划不是很严格的话,你就可以万事大吉,此功能就完成。
下面再教大家一个个方法,生成个清晰的二维码,其实就是拿着咱们的CIImage对象利用图形上下文将图形绘制一下
/**
* 根据CIImage生成指定大小的UIImage
*
* @param image CIImage
* @param size 图片宽度
*/
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size
{
CGRect extent = CGRectIntegral(image.extent);
CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
// 1.创建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);
// 2.保存bitmap到图片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage imageWithCGImage:scaledImage];
}
二维码的扫描
1.二维码的扫描就需要导入框架
// 创建扑捉对象 Capture Session 捕获会话
AVCaptureSession *session =[[AVCaptureSession alloc]init];
self.session = session;
2.创建输入的设备 也就是扫描设备
// 2.0 设置输入设备
/**
* 创建输入设备 为摄像头输入 Video录像
*/
AVCaptureDevice *device =[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input =[AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
// 添加输入设备
[session addInput:input];
3.0 设置输出的方式 (也就是你要扫描什么样的内容)
// 3.0 设置输出方式
AVCaptureMetadataOutput *outPut =[[AVCaptureMetadataOutput alloc]init];
// 添加输入方式的代理方法 获取扫描的数据 queue 在哪个线程里面获取扫描的对象
[outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:outPut];
/**
* 设置扫描的是哪个数据 AVMetadataObjectTypeQRCode 二维码数据
*/
[outPut setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
4.0 创建个layer 就是扫描的区域
// 4.0 添加一个显示的layer
AVCaptureVideoPreviewLayer *layer =[[AVCaptureVideoPreviewLayer alloc]initWithSession:session];
// 扫描框在哪
layer.frame = self.view.bounds;
[self.view.layer addSublayer:layer];
self.layer = layer;
// 5.0 开始扫描
[session startRunning];
5.0 最后就的在输出内容方式的代理方法里面截取到程序扫描的内容
#pragma mark 代理的实现
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if (metadataObjects.count > 0) {
// 1.0 获取数据
AVMetadataMachineReadableCodeObject *object =[metadataObjects lastObject];
NSLog(@"%@",object.stringValue);// 如果获取的是个网址,直接会跳转到网址的地址页面
//2.0 停止扫描
[self.session stopRunning];
// 3.0 移除扫描图层
[self.layer removeFromSuperlayer];
}
}
作者:七秒记忆的鱼儿
链接:https://www.jianshu.com/p/6a687d06ab6f
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。