全部 android asp.net C/C++ cshap IOS Java javascript nodejs perl php python ruby web容器 其他 前端 数据库 第三方平台 混合式APP 网络 系统 默认分类

iOS二维码生成、识别、扫描等

0 109

二维码扫描

前言:

最近的项目中使用到了二维码,二维码这个模块功能也完成;觉得还是有必要总结一下用来做记录。好长时间没有写二维码了都忘记在差不多了,重新拾起来还是挻快的。

二维码使用场景:

生活中有很多的地方都在使用,比如把它分享给朋友,通过扫描来关注平台。它的功能有生成二维码、扫描二维码、从相册中读取二维码。主要从这几个方面来讲二维码的使用,最后会封装一个方便快捷使用的库,供想快速集成的使用者。

1.生成二维码

效果图:

1.gif

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.

找到原因:

通过打断点的方式查到创建filter的时候,filter为空;是因为我在创建的时候使用了宏定义;
错误的方式:
//1.创建滤镜
    CIFilter *filter = [CIFilter filterWithName: CIFILETERNAME];

正确的方式:

备注:filter的名字只能是这个不能是别的:CIQRCodeGenerator
//1.创建滤镜
    CIFilter *filter = [CIFilter filterWithName: @"CIQRCodeGenerator"];
    

2.扫描二维码

效果图:

2.gif

  1. 创建上下文
  2. 创建一个探测器
  3. 直接开始识别图片,获取图片特征 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. 读取特征

3.生成二维码

效果图:

3.gif

  1. 判断输入输出能否加入当前会话
  • 添加一个视频预览图层
  1. 设置输出数据媒体类型
  2. 添加预栏图层,放在最底层
  3. 添加绘图图层到预栏图层上面
  4. 开始扫描
代理

```

pragma mark - AVCaptureMetadataOutputObjectsDelegate代理

//得到扫描结果

  • (void)captureOutput:(AVCaptureOutput )captureOutput didOutputMetadataObjects:(NSArray )metadataObjects fromConnection:(AVCaptureConnection )connection { //1.移除之前的边框 [self removeQRCodeFrame]; if (metadataObjects == nil || metadataObjects.count == 0) { NSLog(@"未能识别"); } [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[metadataObjects.lastObject stringValue]]]; for (AVMetadataObject obj in metadataObjects) { //转换成机器可读的编码数据 AVMetadataMachineReadableCodeObject codeObj = (AVMetadataMachineReadableCodeObject )[self.previerLayer transformedMetadataObjectForMetadataObject:obj]; //绘制二维码边框 [self drawQRBorderShape:codeObj]; } }

```

Demo下载地址

封装的还没有做好,做好了之后再更新。

热忱回答0

  • 加入年费大会员(20每年)
  • 热门标签

    猜你喜欢

    1. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用
    2. iOS团队风格的统一
    3. iOS快速集成友盟社会化分享功能(v6.1.1)
    4. 视频直播SDK-ios版
    5. JHChart iOS图表工具库1.0.3新版本详解
    6. iOS 跑马灯 之 TXScrollLabelView
    7. 【iOS系列】-多图片多线程异步下载
    8. 告别被拒,如何提升iOS审核通过率(上篇)
    9. iOS核心笔记—MapKit框架-基础
    10. iOS APP打包分发给远程的手机测试

    衣食父母

    最近热帖

    1. 走进JavaScript——重拾对象 6
    2. 最近用django做了个在线数据分析小网站 6
    3. mysql之 mysqldump 备份恢复详解 7
    4. 深入理解Java常用类-----时间日期 7
    5. css重构之旅 8
    6. 分布式队列ZooKeeper的实现 6
    7. Java-面向对象总结 7
    8. 《HelloGitHub》第 14 期 8
    9. 压缩&#39;语料库,即提取特征词或词频,做量化处理之后以“列向量”形式保存到数据库 8
    10. 【charger battery 充電 充電器 電池】過充保護警告訊息 over charging protection,Battery over voltage protection, warning message 7

    随机文章

    1. 天才黑客!17岁打脸乔布斯,20岁搞疯索尼,26岁叫板特斯拉,写2000行代码市值8000万美金
    2. 基础拾遗------委托详解
    3. Yii2框架RESTful API - 格式化响应,授权认证和速率限制
    4. 创建hexo风格的markdown页面
    5. 【持续更新】android studio 编译各种疑难杂症,总有你想要的~