iOS–iOS7摄像头识别二维码功能

属性介绍:

AVFoundation 框架基于以下几个类实现图像捕捉 ,通过这些类可以访问来自相机设备的原始数据并控制它的组件。

  • AVCaptureDevice 是关于相机硬件的接口。它被用于控制硬件特性,诸如镜头的位置、曝光、闪光灯等。
  • AVCaptureDeviceInput 提供来自设备的数据。
  • AVCaptureOutput 是一个抽象类,描述 capture session 的结果。以下是三种关于静态图片捕捉的具体子类:
    • AVCaptureStillImageOutput 用于捕捉静态图片
    • AVCaptureMetadataOutput 启用检测人脸和二维码
    • AVCaptureVideoOutput 为实时预览图提供原始帧
  • AVCaptureSession 管理输入与输出之间的数据流,以及在出现问题时生成运行时错误。
  • AVCaptureVideoPreviewLayer 是 CALayer 的子类,可被用于自动显示相机产生的实时图像。它还有几个工具性质的方法,可将 layer 上的坐标转化到设备上。它看起来像输出,但其实不是。另外,它拥有 session (outputs 被 session 所拥有)。

设置属性:

@property (nonatomic, strong) AVCaptureSession *session;
@property (nonatomic, strong) AVCaptureDevice *device;
@property (nonatomic, strong) AVCaptureDeviceInput *input;
@property (nonatomic, strong) AVCaptureMetadataOutput *outPut;
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;

添加摄像头方法

/**
* 设置摄像头代码
*/
- (void)setupCamera{
//设备
_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //输入绑定设备
NSError *error;
_input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:&error];
if (error) {
return;
} //输出
_outPut = [[AVCaptureMetadataOutput alloc]init];
[_outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; //session
_session = [[AVCaptureSession alloc]init];
[_session setSessionPreset:AVCaptureSessionPresetHigh]; //设置画面采集的质量
if ([_session canAddInput:_input]) {
[_session addInput:_input];
}
if ([_session canAddOutput:_outPut]) {
[_session addOutput:_outPut];
} //一定要先设置session的输出为output之后,再指定输出的元数据类型为二维码类型!
[_outPut setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]]; //预览图层
_previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:_session];
// _previewLayer.videoGravity = AVLayerVideoGravityResizeAspect; //preview图层的属性,使视图形状为屏幕大小形状
_previewLayer.frame = self.view.frame;//preview图层的大小
[self.view.layer insertSublayer:_previewLayer atIndex:0]; //将图层添加到视图的图层 //开始运行
[_session startRunning];
}

注意output中设置了一个delegate,我们需要怎么这个协议,然后在下面的代码中设置

[_outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]

协议的实现部分如下:

#pragma mark - AVCaptureMetadataOutputObjectsDelegate
// 在完成二维码解码时,调用
// 如果QRCode的内容越大,转换需要的时间就越长
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ NSString *stringValue;
if ([metadataObjects count] >0)
{
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
stringValue = metadataObject.stringValue;
} NSLog(@"%@",stringValue);
//获取扫描数据,结束编辑
[_session stopRunning];
[self dismissViewControllerAnimated:YES completion:nil];
}

二维码生成网站,测试时可使用

http://cli.im/text?text053e86238125abe22dd1474278f5855d

最新文章

  1. Navsion二次开发_学习笔记
  2. Machine Learning Algorithms Study Notes(6)—遗忘的数学知识
  3. NOIP模拟赛20161007
  4. touch的属性
  5. JSTL标签出错:<c:forEach var="book" items="${requestScope.books}" varStatus="status">
  6. UItableview里面的header、footer
  7. sql2000无法打开1433端口及解决方法
  8. Access时间日期比较查询的方法总结
  9. Volley网络请求框架的基本用法
  10. yarn不是内部指令 react-native不是内部指令
  11. GAN初步——本质上就是在做优化,对于生成器传给辨别器的生成图片,生成器希望辨别器打上标签 1,体现在loss上!
  12. 使用just-api 进行接口测试
  13. 生产环境rails console spring自动启动的问题
  14. live555笔记_hi3516A
  15. Log4J2 配置文件模板及代码说明
  16. ictclas4j 分词工具包 安装流程
  17. 《Java并发编程实战》第十章 避免活跃性危急 读书笔记
  18. C++远征之封装篇(下)-学习笔记
  19. ironic的自动化脚本
  20. 「 JSOI2004」「LuoguP1337」平衡点 / 吊打XXX(模拟退火

热门文章

  1. xfire实现webservice客户端之测试关注点
  2. golang_protobuf环境搭建
  3. vbox里面的Ubuntu虚拟机与主机win7之间设置共享文件夹
  4. oralce闪回
  5. [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】
  6. GNOME Shell叫板Ubuntu Unity:优劣PK
  7. Cow Contest
  8. Scarborough Fair 绝美天籁
  9. 【HDOJ】2966 In case of failure
  10. 在PC上使用串口向开发板传送文件