二维码扫描

前言:

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

二维码使用场景:

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

1.生成二维码

效果图:

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.扫描二维码

效果图:

  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.生成二维码

效果图:

  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下载地址

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

???如果对你有帮助,或觉得可以。请右上角star一下,这是对我一种鼓励,让我知道我写的东西有人认可,我才会后续不断的进行完善。

有任何问题或建议请及时issues me,以便我能更快的进行更新修复。

Email: marlonxlj@163.com

转载于:https://www.cnblogs.com/marlonxlj/p/6253205.html

iOS二维码生成、识别、扫描等相关推荐

  1. iOS 二维码生成和扫描

    一.二维码生成 //创建二维码视图     UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 100, ...

  2. iOS - 二维码生成、扫描及页面跳转

    主要内容的介绍 普通二维码生成 彩色二维码生成 带有小图标二维码生成 扫描二维码的自定义 是否开启闪光灯 从相册中获取二维码 扫描成功之后提示音 扫描成功之后的界面之间的跳转 扫描二维码界面采取了微信 ...

  3. 二维码生成、扫描、图片识别(Zxing)

    这样的例子虽然已经很多了,不过我在网上浏览了一圈,也没找到几个图库二维码图片识别例子,好的算法识别率才高.这里有一个好点的算法,算法不是我写的,只是作为整理记录,给众多安卓开发者一个方便.demo的U ...

  4. iOS二维码生成中间带图片Logo

    iOS二维码生成中间带图片效果图: ViewController.h 1 #import <UIKit/UIKit.h> 2 @interface ViewController : UIV ...

  5. 微信公众平台----带参数二维码生成和扫描事件

    原文:微信公众平台----带参数二维码生成和扫描事件 摘要: 账号管理----生成带参数的二维码 消息管理----接收消息----接收事件推送 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众 ...

  6. 苹果原生二维码生成与扫描及生成的二维码不清楚的解决方案

    苹果原生二维码生成与扫描及生成的二维码不清楚的解决方案 参考文章: (1)苹果原生二维码生成与扫描及生成的二维码不清楚的解决方案 (2)https://www.cnblogs.com/CoderEYL ...

  7. Android开发——Android中的二维码生成与扫描

    0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维 ...

  8. iOS二维码生成(带logo)

    实在不好意思,昨天忘记写的<<二维码生成>>忘记写最常见的黑白二维码嵌入一张图片,一般都是公司的logo.今天补上 // // ViewController.m // 内置图片 ...

  9. iOS二维码生成与识别

    在 IOS7 以前,在IOS中实现二维码和条形码扫描,有两大开源组件 ZBar 与 ZXing. 总结下各自的缺点: ZBar在扫描的灵敏度上,和内存的使用上相对于ZXing上都是较优的,但是对于 & ...

  10. iOS开发二维码生成和扫描

    准备工作 导入<CoreImage/CoreImage.h>,生成二维码用 导入<AVFoundation/AVFoundation.h>,读取二维码用 设置代理协议AVCap ...

最新文章

  1. Java 集合——List集合
  2. nginx的小总结(二)
  3. C++程序中调用其他exe可执行文件方法
  4. XCTF-高手进阶区:php_rce
  5. BeanUtils的学习
  6. 【CF#2A】Winner(模拟 STL-map)☆
  7. Invalid prop: type check failed for prop price. Expected String, got Number.
  8. 新手用手机学黑客编程一秒变黑客
  9. AWVS12搭建-Ubuntu
  10. Pwn-2018_HITB_CTF-gundam
  11. Hive综合应用案例——用户学历查询
  12. workstation安装Windows Server 2016
  13. A. Shifting Stacks
  14. 最近最久未使用页面置换算法C语言,LRU页面置换算法模拟-最近最久未使用置换算法...
  15. 第五期:写一篇高水平的工程类英文论文(SCI/EI)_图和表(Figure and Table)【论文写作】
  16. XML DOM摘要五(XPath)
  17. 油猴(tampermonkey)脚本安装及使用教程
  18. 爆品铺货新出路?选品为王的电商APP如何高效拉新,实现GMV飙升
  19. ThinkPHP最新版支付宝接口开…
  20. 和python高级知识分子的风骨_侯伯宇 一个高级知识分子的风骨

热门文章

  1. DAPM之四:dapm机制深入分析(下)
  2. 绿色债券数据集2016.01-2021.11年
  3. 集牛气 展虎威 | 指令集祝您新春快乐,虎年大吉!
  4. iOS no summary
  5. 自动下载必应主页图片做壁纸
  6. Java正则表达式提取字符的方法实例
  7. 可达性分析算法-针对的对象
  8. 怎么下载淘宝商品大图
  9. PHP实现图片合并功能(根据群用户头像生成群logo图片)
  10. 目录 - 《ARM嵌入式Linux系统开发从入门到精通》 - 免费试读 - book.csdn.net