iOS之Scanning的实现
http://i.cnblogs.com/EditPosts.aspx?postid=5288517
//写在最前
/*
AVFoundation原生框架的好处就是扫描特别快效率特别高,但是可能会遇到一个问题就是不知道怎么去限制扫描范围。
二维码扫描有关优秀第三方库:---- ZXing google推出的开源项目-----ZBar SDK 里面也有详细的文档
*/
引入头文件导入流媒体需要的框架
@import AVFoundation;
//遵守协议 AVCaptureMetadataOutputObjectsDelegate
@property (nonatomic,strong)AVCaptureSession *session;
@property (nonatomic,strong)AVCaptureVideoPreviewLayer *layer;
- (void)viewDidLoad {
[super viewDidLoad];
[self startRunningSession];
[self.view bringSubviewToFront:self.v];
self.animV = [[UIView alloc]initWithFrame:CGRectMake(92, 124, 190, 2)];
self.animV.backgroundColor = [UIColor redColor];
[self.view addSubview:self.animV];
if (!_t) {
self.t = [NSTimer scheduledTimerWithTimeInterval:4.2/24 target:self selector:@selector(animateShow) userInfo:nil repeats:YES];
}
}
- (void)animateShow{
CGRect frame = self.animV.frame;
frame.origin.y += 8;
if (frame.origin.y >= 316) {
frame.origin.y = 116;
}
self.animV.frame = frame;
}
- (void)startRunningSession
// 获取 AVCaptureDevice 实例
NSError * error;
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
[captureDevice setTorchMode:AVCaptureTorchModeOn]; //开启照明
// 初始化输入流
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
if (!input) {
NSLog(@"%@", [error localizedDescription]);
}
// 创建会话
_session = [[AVCaptureSession alloc] init];
if ([_session canAddInput:input]) {
// 添加输入流
[_session addInput:input];
}
// 初始化输出流
AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
if ([_session canAddOutput:captureMetadataOutput]) {
// 添加输出流
[_session addOutput:captureMetadataOutput];
}
// 创建dispatch queue.
dispatch_queue_t dispatchQueue;
dispatchQueue = dispatch_queue_create(kScanName, NULL);
[captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[captureMetadataOutput setRectOfInterest:CGRectMake(100/667.0,87/375.0,200/667.0, 200/375.0)];
// 设置元数据类型 AVMetadataObjectTypeQRCode
[captureMetadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
//value CGRectMake(0, 0, 1, 1). Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned.
// 创建输出对象
_layer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
[_layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[_layer setFrame:self.view.layer.frame];
[self.view.layer addSublayer:_layer];
// 开始会话
[_session startRunning];
}
#pragma - mark - AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
NSLog(@"-------");
if (metadataObjects && metadataObjects.count) {
AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
NSString *result;
if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {
result = metadataObj.stringValue;
NSLog(@"result:%@",result);
} else {
NSLog(@"不是二维码");
}
[_session stopRunning];
_session = nil;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"QRCodeInfo"
message:result
delegate:nil
cancelButtonTitle:@"cancel"
otherButtonTitles: nil];
[alert show];
}
}
#import "cornView.h"
@import CoreGraphics;
//给扫描控制器加一个View进行遮盖处理就是上面的self.v
- (void)drawRect:(CGRect)rect {
UIBezierPath *p = [UIBezierPath bezierPathWithRect:CGRectMake(87, 56, 200, 200)];
// NSLog(@"0000");
[[UIColor clearColor]setFill];
填充为中间没有颜色
[p fill];
填充之外的不烦
[p fillWithBlendMode:kCGBlendModeClear alpha:1];
}
//写在最后
很小的二维码,边长不到1cm,于是就修改了 sessionPreset
为 1080p 的,当时用的是ZXing, 当把图片质量改清楚时,也造成了性能的下降,基本打开扫描界面就会报memoryWarning,但是也确实解决了小二维码扫描的问题。
AVCaptureSession
可以设置 sessionPreset
属性,这个决定了视频输入每一帧图像质量的大小。
- AVCaptureSessionPreset320x240
- AVCaptureSessionPreset352x288
- AVCaptureSessionPreset640x480
- AVCaptureSessionPreset960x540
- AVCaptureSessionPreset1280x720
- AVCaptureSessionPreset1920x1080
以上列举了部分的属性值,分别代表输入图片质量大小,一般来说AVCaptureSessionPreset640x480
就够使用,但是如果要保证较小的二维码图片能快速扫描,最好设置高些,如AVCaptureSessionPreset1920x1080
(就是我们常说的1080p).
提升扫描速度和性能的就是设置解析的范围,在zbar和zxing中就是scanCrop
, AVFoundation
中设置 AVCaptureMetadataOutput
的 rectOfInterest
属性来配置解析范围。
captureOutput.rectOfInterest = CGRectMake(cropRect.origin.y/size.height,
cropRect.origin.x/size.width,
cropRect.size.height/size.height,
cropRect.size.width/size.width);rectOfInterest
是基于图像的大小裁剪的。 》》》此博文源于各路汇总。
iOS之Scanning的实现的更多相关文章
- IOS零碎技术整理(3)-获取wifi列表
1. 该功能实现基于MobileApple80211框架来进行开发,而目前该框架成为了私有框架,其中的API均为私有API. 如果使用这些API可能导致应用不能上app store或者ios版本升 ...
- iOS蓝牙开发(二)蓝牙相关基础知识
原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...
- iOS蓝牙开发(一)蓝牙相关基础知识(转)
转载自:http://www.cocoachina.com/ios/20150915/13454.html 原文作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad , ...
- ios 可变参数(va_list,va_start,va_end)
例如:UIAlertView的init方法中的otherButtonTitles:(NSString *)otherButtonTitles, ...等多个可变参数. ios实现传递不定长的多个参数的 ...
- iOS CoreBluetooth 教程
去App Store搜索并下载“LightBlue”这个App,对调试你的app和理解Core Bluetooth会很有帮助. ================================ Cor ...
- iOS:原生二维码扫描
做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framewo ...
- iOS蓝牙开发
蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0 ...
- iOS - Bluetooth 蓝牙
1.蓝牙介绍 具体讲解见 蓝牙 技术信息 蓝牙协议栈 2.iBeacon 具体讲解见 Beacon iBeacon 是苹果公司 2013 年 9 月发布的移动设备用 OS(iOS7)上配备的新功能.其 ...
- iOS关于蓝牙连接的简单介绍与使用
下面是两台iPhone6连接同一台蓝牙设备的结果: **成功连接**** peripheral: <CBPeripheral: 0x1700f4500, identifier = 50084F6 ...
随机推荐
- Cocos2dx中的opengl使用(一)简单介绍
引擎提供了CCGLProgram类来处理着色器相关操作,对当前绘图程序进行了封装,其中使用频率最高的应该是获取着色器程序的接口:const GLuint getProgram(); 该接口返回了当前着 ...
- 温故而知新 clone
浅复制(浅克隆) 被复制对象所有变量都含有与原来对象的相同值,对象中对其他对象的引用仍然指向原来的对象,换言之,复制对象只复制考虑的对象,而不复制所引用的对象.继承自java.lang.Object类 ...
- YTU 3019: 螺旋方阵
3019: 螺旋方阵 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 题目描述 以下是一个5*5阶螺旋方阵.设计一个程序,输出该形式的n*n阶方阵(顺时针方向旋进). ...
- 遍历寻找json中的重复数据
string str = "[{\"ID\":1,\"Data\":{\"subjectCode\":\"1\" ...
- JAVA基础知识之多线程——线程池
线程池概念 操作系统或者JVM创建一个线程以及销毁一个线程都需要消耗CPU资源,如果创建或者销毁线程的消耗源远远小于执行一个线程的消耗,则可以忽略不计,但是基本相等或者大于执行线程的消耗,而且需要创建 ...
- session和cookie的总结
cookie在客户端保持,而session在服务器端保持. 1.cookie机制: 产生:服务器通过http协议的响应头,指示浏览器产生相应的cookie信息 使用:浏览器按照一定规则通过ht ...
- Intent官方教程(2)Intent的两种类型
Intent Types There are two types of intents: Explicit intents specify the component to start by name ...
- SqlSever基础 isnull 将null替换成指定字符串
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- mysql查询中通配符的使用
mysql查询中通配符的使用 在mysql查询中经常会使用通配符,并且mysql的通配符和pgsql的存在区别(稍候再讨论),而且mysql中还可以使用正则表达式. SQL模式匹配: “_” ...
- [HDOJ5934]Bomb(强连通分量,缩点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5934 题意:有n个炸弹,爆炸范围和点燃花费给你,如果一个爆炸那么它爆炸范围内的炸弹也会爆炸.问让所有炸 ...