iOS 原生二维码扫描(可限制扫描区域)
2016-02-19 17:45
567 查看
http://www.bubuko.com/infodetail-1142586.html
http://blog.csdn.net/lc_obj/article/details/41549469?utm_source=tuicool&utm_medium=referral
/article/2680081.html
https://github.com/lcddhr/QRWeiXinDemo
使用 AVFoundation系统库来进行二维码扫描并且限制扫描二维码的范围。(因为默认的是全屏扫描)
-(void)beginCode
{
//1.摄像头设备
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
/*
// Media types
AVMediaTypeVideo
AVMediaTypeAudio
AVMediaTypeText
AVMediaTypeClosedCaption
AVMediaTypeSubtitle
AVMediaTypeTimecode
AVMediaTypeMetadata
AVMediaTypeMuxed
*/
//2.设置输入
/**
* 设置输入 此方法需要判断 因为模拟器没有摄像头
*
* @param 把摄像头作为输入的设备
*
* @return 返回AVCaptureInput
*/
NSError *error = nil;
AVCaptureInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (error) {
NSLog(@"没有摄像头%@",error);
return;
}
//3.设置输出(Metdata元数据)
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
//3.1输出的代理 捕获二维码的图像
//dispatch_get_main_queue()使用主线程队列,响应比较同步,使用其他队列响应不同步。
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
//3.2 设置扫描区域 默认是全屏扫描
//这个CGRectMake(Y,X,H,W) 1代表最大值 原点是导航右下角 为起始点
// [output setRectOfInterest:CGRectMake(0, 0.5, 0.5, 0.5)];//左上角 1/4 屏幕
// [output setRectOfInterest:CGRectMake(0.5, 0.5, 0.5, 0.5)];//左下角 1/4 屏幕
// [output setRectOfInterest:CGRectMake(0.5, 0, 0.5, 0.5)]; //右下角 1/4 屏幕
// [output setRectOfInterest:CGRectMake(0, 0, 0.5, 0.5)]; //右上角 1/4 屏幕
// [output setRectOfInterest:CGRectMake((124)/ScreenHigh, ((ScreenWidth220)/2)/ScreenWidth,220/ScreenHigh,220/ScreenWidth)]; //设置自定义像素点的 位置
[output setRectOfInterest:CGRectMake(0.25,0.25, 0.5, 0.5)]; //貌似 中间的感觉!!!
//4.拍摄会话
AVCaptureSession *session = [[AVCaptureSession alloc] init];
_session = session;
//添加session的输入和输出
[session addInput:input];
[session addOutput:output];
//4.1设置输出的格式
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
//5.设置预览图层 (让用户看到扫描结果)
AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:session];
_previewLayer = preview;
//5.1设置preview的属性
preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
//5.2设置preview的图层的大小
[preview setFrame:self.view.bounds];
//5.3将图层添加到视图的图层
[self.view.layer insertSublayer:preview atIndex:0];
//6.启动会话
[session startRunning];
}
#pragma mark 输出的代理方法
//此方法是在识别到QRCode,并且完成转换
//如果QRCode的内容越大,转换需要的时间就越长
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
//会频繁的扫描
//如果扫描完成就停止
[_session stopRunning];
//删除预览的图层
[_previewLayer removeFromSuperlayer];
//设置界面显示扫描结果
NSString *reslutStr = [[NSString alloc] init];
if (metadataObjects.count > 0) {
AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
reslutStr = [obj stringValue];//这个就是 扫描的结果
//如果需要对URL 名片 等信息进行扫描 再次进行扩展
}
NSLog(@"%@",metadataObjects);
}
http://blog.csdn.net/lc_obj/article/details/41549469?utm_source=tuicool&utm_medium=referral
/article/2680081.html
https://github.com/lcddhr/QRWeiXinDemo
使用 AVFoundation系统库来进行二维码扫描并且限制扫描二维码的范围。(因为默认的是全屏扫描)
-(void)beginCode
{
//1.摄像头设备
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
/*
// Media types
AVMediaTypeVideo
AVMediaTypeAudio
AVMediaTypeText
AVMediaTypeClosedCaption
AVMediaTypeSubtitle
AVMediaTypeTimecode
AVMediaTypeMetadata
AVMediaTypeMuxed
*/
//2.设置输入
/**
* 设置输入 此方法需要判断 因为模拟器没有摄像头
*
* @param 把摄像头作为输入的设备
*
* @return 返回AVCaptureInput
*/
NSError *error = nil;
AVCaptureInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (error) {
NSLog(@"没有摄像头%@",error);
return;
}
//3.设置输出(Metdata元数据)
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
//3.1输出的代理 捕获二维码的图像
//dispatch_get_main_queue()使用主线程队列,响应比较同步,使用其他队列响应不同步。
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
//3.2 设置扫描区域 默认是全屏扫描
//这个CGRectMake(Y,X,H,W) 1代表最大值 原点是导航右下角 为起始点
// [output setRectOfInterest:CGRectMake(0, 0.5, 0.5, 0.5)];//左上角 1/4 屏幕
// [output setRectOfInterest:CGRectMake(0.5, 0.5, 0.5, 0.5)];//左下角 1/4 屏幕
// [output setRectOfInterest:CGRectMake(0.5, 0, 0.5, 0.5)]; //右下角 1/4 屏幕
// [output setRectOfInterest:CGRectMake(0, 0, 0.5, 0.5)]; //右上角 1/4 屏幕
// [output setRectOfInterest:CGRectMake((124)/ScreenHigh, ((ScreenWidth220)/2)/ScreenWidth,220/ScreenHigh,220/ScreenWidth)]; //设置自定义像素点的 位置
[output setRectOfInterest:CGRectMake(0.25,0.25, 0.5, 0.5)]; //貌似 中间的感觉!!!
//4.拍摄会话
AVCaptureSession *session = [[AVCaptureSession alloc] init];
_session = session;
//添加session的输入和输出
[session addInput:input];
[session addOutput:output];
//4.1设置输出的格式
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
//5.设置预览图层 (让用户看到扫描结果)
AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:session];
_previewLayer = preview;
//5.1设置preview的属性
preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
//5.2设置preview的图层的大小
[preview setFrame:self.view.bounds];
//5.3将图层添加到视图的图层
[self.view.layer insertSublayer:preview atIndex:0];
//6.启动会话
[session startRunning];
}
#pragma mark 输出的代理方法
//此方法是在识别到QRCode,并且完成转换
//如果QRCode的内容越大,转换需要的时间就越长
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
//会频繁的扫描
//如果扫描完成就停止
[_session stopRunning];
//删除预览的图层
[_previewLayer removeFromSuperlayer];
//设置界面显示扫描结果
NSString *reslutStr = [[NSString alloc] init];
if (metadataObjects.count > 0) {
AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
reslutStr = [obj stringValue];//这个就是 扫描的结果
//如果需要对URL 名片 等信息进行扫描 再次进行扩展
}
NSLog(@"%@",metadataObjects);
}
相关文章推荐
- ios布局-与xib结合
- ios自定义归档解档
- JSPatch-动态更新IOS APP
- iOS比较好的几个博客网址
- <转>iOS深拷贝与浅拷贝 附NSSet讲解
- iOS 知识点
- iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期
- ios 原生二维码的扫描和生成
- tableview取消CELL的多余行数
- iOS开发中那些高效常用的宏
- ios开发- 将字符串切割成数组 componentSeparatedByString
- 仿ios的对话框
- iOS设计模式-工厂方法
- 解决Xcode7.1上传成功但iTunesconnect一直不能构建版本的问题
- iOS9适配
- iOS开发中的几种设计模式介绍
- iOS中延时执行方法的比较和汇总
- IOS第四天_面向对象2
- ios开发之itunes打包流程
- IOS沙盒路径