二维码扫描在App中很常见的功能,之前都是用三方工具Zing、ZBar。后来Apple的AVFoundation也支持二维码扫描、生成,而且效率比三方库还要高。我把它封装成一个工具,这样使用起来十分方便,同时还封装了扫描视图,在工程中增加扫描更加快捷。

主要使用AVCaptureSession链接摄像头进行采集信息
Coding~

//初始化链接对象
self.session = [[AVCaptureSession alloc]init];
//高质量采集率
[self.session setSessionPreset:AVCaptureSessionPresetHigh];
//获取摄像设备
self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
//创建输入流
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
//添加输入流
if ([self.session canAddInput:input]) {[self.session addInput:input];
}
//创建输出流
self.output = [[AVCaptureMetadataOutput alloc] init];
//设置代理在主线程里刷新(Tip:如果封装的类不是单利或者全局变量,代理AVCaptureMetadataOutputObjectsDelegated不会被调用)
[self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
//添加输出流
if ([self.session canAddOutput:self.output]) {[self.session addOutput:self.output];
}
//设置扫码支持的编码格式,Tip:必须在添加输出流之后
if ([self.output availableMetadataObjectTypes].count) {if (scanType == ZHBarScanTypeQRCode) {self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];} else if (scanType == ZHBarScanTypeBarCode) {self.output.metadataObjectTypes = @[AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code];} else {self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code];}
}
//设置有效的扫描区域,Tip:rectOfInterest是比值,默认为CGRectMake(0, 0, 1, 1)
/* 手动计算计算为CGRectMake(y1/h, x1/w, h1/h, w1/w);y1,x1,h1,w1为扫描区域的frame,h,w是layer视图的宽高手动计算要在session运行前设置*//* 自动转换- (CGRect)metadataOutputRectOfInterestForRect:(CGRect)rectInLayerCoordinatesl;这个方法可以把扫描区域的frame转成rectOfInterest的坐标系这个方法必须在session运行后设置*///如果传入的scanArea的宽不大于1,说明是手动计算
if (scanRect.size.width <= 1) {self.output.rectOfInterest = scanRect;
}
//创建相机渲染层
self.layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
self.layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
self.layer.frame = layerView.layer.bounds;
[layerView.layer insertSublayer:self.layer atIndex:0];[ZHBarTool requestCameraAuthorizedResult:^(BOOL granted) {if (granted) {dispatch_async(dispatch_get_main_queue(), ^{[self.session startRunning];self.isAvailable = YES;self.scanInterval = self.scanInterval ? self.scanInterval : 2;//如果传入的scanArea的宽大于1,调用系统方法转换if (scanRect.size.width > 1) {self.scanRect = scanRect;CGRect rectOfInterest = [self.layer metadataOutputRectOfInterestForRect:scanRect];self.output.rectOfInterest = rectOfInterest;}});} else {if ([self.delegate respondsToSelector:@selector(ZHBarAuthorizedCameraFailed)]) {[self.delegate ZHBarAuthorizedCameraFailed];}if (self.authorizedCameraFailed) {self.authorizedCameraFailed();}}
}];

注意点:

有效的扫描区域:rectOfInterest。这是个比值,而且坐标系和我们平常开发使用的不一样,计算时需要转化,不过系统给我们提供了方法

- (CGRect)metadataOutputRectOfInterestForRect:(CGRect)rectInLayerCoordinatesl;

可以转化我们熟悉的坐标系下的frame为rectOfInterest需要的坐标,但使用这个方法必须在session启动之后设置。

代理:

- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
AVMetadataMachineReadableCodeObject *object = [metadataObjects objectAtIndex:0];
NSString *obj = [object stringValue];
}

二维码条形码生成

主要使用过滤器CIFilter
//二维码过滤器
CIFilter *filter = [CIFilter filterWithName:@“CIQRCodeGenerator”];
/条形码过滤器
CIFilter *filter = [CIFilter filterWithName:@“CICode128BarcodeGenerator”];

解析二维码图片

NSString *url = nil;
//初始化一个监测器
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
//监测到的结果数组
NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:aImage.CGImage]];
if (features.count >=1) {//结果对象CIQRCodeFeature *feature = [features objectAtIndex:0];NSString *result = feature.messageString;url = result;
}

解析条形码图片

很遗憾╮(╯_╰)原生还不支持解析条形码图片,如果有需要的话只能使用三方库了。

iOS原生封装二维码、条形码扫描工具;生成、识别(彩色)二维码、条形码图片相关推荐

  1. 【基础入门详解】程序员的二维码也要玩出不同色彩,用Python生成动态彩色二维码

    一.前言 常见的二维码为QR CodeCode,QR全称是Quick Response,是一个近几年来移动设备上超流行的一种编码方式.它的结构如下: 主要有以下特点: 符号规格从版本1(21×21)到 ...

  2. 二维码的扫描和生成二维码

    前言 之前自己一直想要去实现一个二维码的扫描和生成,但是一直拖到现在,今天趁着夜色落幕,气氛还算可以(各种声音的夹杂中),完成了这个扫描和生成二维码的工具,在这里总结一下. 首先普及一下什么是二维码和 ...

  3. 二维码的扫描与生成(含动态权限)

    首页 博客 学院 下载 GitChat TinyMind 论坛 问答 商城 VIP 活动 招聘 ITeye CSTO 写博客 发Chat cjm2484836553的博客 RSS订阅 原 Androi ...

  4. 可变数据印刷工具之可变彩色二维码实例

    现如今,二维码在各行各业的应用越来越广泛和便捷,二维码支付,彩色二维码防伪等等.通过可变二维码,一物一码,为物品建立独特的"身份证".那么,在中琅可变数据印刷工具中是如何制作可变彩 ...

  5. opencv识别彩色二维码

    记录一下识别彩色二维码过程,以及当中遇到的问题和解决办法 1. 由于过程中图片处理需要用到灰度图像,所以读取原图之后,需要转换一个grayImage (CV_BGR2GRAY) 2. Gaussian ...

  6. Android基于Google Zxing实现二维码/条形码扫描、生成二维码/条形码

     二维码/条形码生成器 二维码/条形码扫描器 一.二维码与条形码工作原理 目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine,通过一张简单的图片就能扫描添加还有,还有分 ...

  7. Android中二维码的扫描与生成(zxing库)

    目录 一.zxing是什么? 二.集成zxing框架 三.界面设计 四.二维码生成 五.二维码扫描 一.zxing是什么? zxing是google推出的一个开源的二维码框架,可以实现使用手机的摄像头 ...

  8. 二维码的扫描和生成(zxing-android-embedded)的基础使用

    简述:这个博客主要记载zxing-android-embedded的简单使用,如何替换相机的布局,如何去掉生成二维码的空白等等一系列问题. zxing-android-embedded的使用 1.首先 ...

  9. Android Zxing3.3.2扫描、生成、解析二维码,以及近距离无法识别的问题

    Zxing目前最新版本3.3.2,打开摄像头就成功了,真正的极速扫描,效果喜人. 一.集成流程 1.克隆代码就不说了. 2.zxing项目巨大,我们只需要扫描部分的代码. 将android.andro ...

最新文章

  1. 023_Jedis的发布和订阅
  2. python小游戏编程100例_经典编程100例——python版(例9例10)
  3. 【转载保存】Lucene7.1.0超详细的使用文档
  4. Java讲课笔记29:Swing入门
  5. 被国产机所迫?苹果或将每半年发布一次新iPhone
  6. java二叉树的序列化_二叉树的序列化和反序列化
  7. java流程控制both_java web面试题
  8. Elasticsearch 架构原理—— 新数据写入过程
  9. 【社会/人文】概念的理解 —— 断舍离、饭(饭制版)
  10. UnityShader8:编写Shader时需要注意的细节和可能需要的意外/BUG
  11. 巧用ASP.NET预编译Web应用程序规避调用延迟,徐汇区网站设计
  12. 服务器怎么与plc通讯协议,PLC如何与云服务器通讯
  13. Linux curl命令详解 【转】
  14. 在线学习Java的资源网站
  15. PyQt5 QPushButton 设置文字对齐方式(基于setStyleSheet)
  16. 虚拟盒子下装linux系统,eUnoBox(虚拟盒子) v3.14免费版
  17. tcl/tk参考——列表操作llength
  18. JAVA WEB整合开发王者归来 -- 读书笔记 by CZF 完整版
  19. - 在c语言中是什么意思?
  20. 通过外网主机加速 github 访问速度

热门文章

  1. [UNR #6]机器人表演
  2. 单片机外围电路设计攻略(全)!
  3. Android悬浮窗原理解析(Window)[源码]
  4. 示性函数、共轭函数、对偶范数、共轭
  5. 谭浩强版c语言笔记(1)
  6. 使用fastboot命令刷机
  7. 前端、后端、学习网址
  8. 2020年9月全国计算机二级c语言题库,2020年9月全国计算机等级考试二级C语言上机题库(共95套全)(76页)-原创力文档...
  9. Python中文乱码问题(转)
  10. js阻止事件的默认行为发生的三种方式