最近的项目中使用到了二维码,二维码这个模块功能也完成;以为仍是有必要总结一下用来作记录。好长时间没有写二维码了都忘记在差很少了,从新拾起来仍是挻快的。git
生活中有不少的地方都在使用,好比把它分享给朋友,经过扫描来关注平台。它的功能有生成二维码、扫描二维码、从相册中读取二维码。主要从这几个方面来说二维码的使用,最后会封装一个方便快捷使用的库,供想快速集成的使用者。github
1. 建立二维码滤镜--CIFilter
1.1 恢复滤镜的默认属性
1.2 设置滤镜的输入数据
- 将传入的字符串转换成NSData数据
- 经过KVC来设置输入的内容
inputMessage
1.3 二维码容错率
- inputCorrectionLevel 是一个单字母(@"L", @"M", @"Q", @"H" 中的一个),表示不一样级别的容错率,默认为 @"M".
- QR码有容错能力,QR码图形若是有破损,仍然能够被机器读取内容,最高能够到7%~30%面积破损仍可被读取,相对而言,容错率愈高,QR码图形面积愈大。因此通常折衷使用15%容错能力。
- L水平 7%的字码可被修正.
- M水平 15%的字码可被修正
- Q水平 25%的字码可被修正
- H水平 30%的字码可被修正
代码: [filter setValue:@"H" forKey:@"inputCorrectionLevel"];
1.4 获取滤镜输出的图片
1.5 将CIImage转换成UIImage
1.6 经过位图建立高清图片
1.7 图片合成
Jan 3 16:35:22 二维码扫描demo[4032] <Error>: CGContextSetInterpolationQuality: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Jan 3 16:35:22 二维码扫描demo[4032] <Error>: CGContextScaleCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Jan 3 16:35:22 二维码扫描demo[4032] <Error>: CGContextDrawImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Jan 3 16:35:22 二维码扫描demo[4032] <Error>: CGBitmapContextCreateImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Jan 3 16:35:22 二维码扫描demo[4032] <Error>: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Jan 3 16:35:22 二维码扫描demo[4032] <Error>: CGContextSetBlendMode: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Jan 3 16:35:22 二维码扫描demo[4032] <Error>: CGContextSetAlpha: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Jan 3 16:35:22 二维码扫描demo[4032] <Error>: CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Jan 3 16:35:22 二维码扫描demo[4032] <Error>: CGContextScaleCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Jan 3 16:35:22 二维码扫描demo[4032] <Error>: CGContextDrawImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Jan 3 16:35:22 二维码扫描demo[4032] <Error>: CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
//1.建立滤镜 CIFilter *filter = [CIFilter filterWithName: CIFILETERNAME];
CIQRCodeGenerator
//1.建立滤镜 CIFilter *filter = [CIFilter filterWithName: @"CIQRCodeGenerator"];
- 建立上下文
- 建立一个探测器
- 直接开始识别图片,获取图片特征
CIImage *imageCI = [[CIImage alloc] initWithImage:self.sourceImage]; NSArray <CIFeature *> *features = [detector featuresInImage:imageCI];
NSMutableArray *resultArray = @[].mutableCopy; for (CIFeature *feature in features) { CIQRCodeFeature *tempFeature = (CIQRCodeFeature *)feature; [resultArray addObject:tempFeature.messageString]; //获取到二维码的东西 self.urlString = tempFeature.messageString; if (isDrawCodeFrame) { tempImage = [self drawQRCodeFrameFeatre: tempFeature toImage: tempImage]; } }
4. 读取特征
- 判断输入输出可否加入当前会话
- 添加一个视频预览图层
- 设置输出数据媒体类型
- 添加预栏图层,放在最底层
- 添加绘图图层到预栏图层上面
- 开始扫描
代理
```ui
pragma mark - AVCaptureMetadataOutputObjectsDelegate代理
//获得扫描结果编码
```url