iOS源生二维码扫描及生成
来源:互联网 发布:知鸟软件 编辑:程序博客网 时间:2024/05/23 10:57
示例源码地址:https://github.com/chaseDeil/YQOriginQRDemo
因项目需求,很多都会涉及到二维码扫描及生成功能,以前用过两个第三方库ZBar和ZXing,但在集成过程中,很多人可能都会遇到或多或少的问题,解决起来头痛不已。而在iOS7开始官方集成了二维码扫描和生成功能,使用起来更加便捷、高效,本偏文章主要介绍其用法。
一、二维码扫描
要使用源生二维码扫描功能,首先要在工程中添加AVFoundation.framework框架到build phase的”Link Binary With Libraries”之下。接下来就是代码的事情了,先导入框架
#import <AVFoundation/AVFoundation.h>
然后实现AVCaptureMetadataOutputObjectsDelegate协议
@interface YQQRViewController ()<AVCaptureMetadataOutputObjectsDelegate>
接下来代码实现:
- (void)createQR{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ if (!_device) { //初始化捕捉设备 _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //用_device创建输入流 _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil]; //创建媒体数据输出流 _output = [[AVCaptureMetadataOutput alloc] init]; [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; //实例化捕捉会话 _session = [[AVCaptureSession alloc] init]; [_session setSessionPreset:AVCaptureSessionPresetHigh]; if ([_session canAddInput:self.input]) { //将输入流添加到会话 [_session addInput:self.input]; _canOpen = YES; } else { dispatch_async(dispatch_get_main_queue(), ^{ //回到主线程 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"打开相机权限" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"去设置", nil]; [alert show]; }); } if (_canOpen) { if ([_session canAddOutput:self.output]) { //将媒体输出流添加到会话中 [_session addOutput:self.output]; } // 条形码/二维码 _output.metadataObjectTypes =[NSArray arrayWithObjects:AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeQRCode, nil]; // 只支持二维码// _output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode]; //实例化预览图层 _preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session]; //设置预览图层填充方式 _preview.videoGravity = AVLayerVideoGravityResizeAspectFill; // 控制扫描区域 参考:http://blog.csdn.net/lc_obj/article/details/41549469 [_output setRectOfInterest:CGRectMake(Top_Height / kScreenHeight, ((kScreenWidth - MiddleWidth) / 2) / kScreenWidth, MiddleWidth / kScreenHeight, MiddleWidth / kScreenWidth)]; dispatch_async(dispatch_get_main_queue(), ^{ //回到主线程 _preview.frame =CGRectMake(0,0,kScreenWidth,kScreenHeight); [self.view.layer insertSublayer:self.preview atIndex:0]; }); if (_canOpen) { dispatch_async(dispatch_get_main_queue(), ^{ //回到主线程 timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(YQAnimation) userInfo:nil repeats:YES]; [_session startRunning]; }); } } } });}
实现协议方法
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ if ([metadataObjects count] > 0) { AVMetadataMachineReadableCodeObject *matadataObject = [metadataObjects objectAtIndex:0]; NSLog(@"%@", matadataObject.stringValue); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"扫描信息" message:matadataObject.stringValue delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil]; [alert show]; [_session stopRunning]; [timer invalidate]; timer = nil; }}
二、二维码生成
主要实现
- (void)createQRCode{ CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; [filter setDefaults]; NSData *data = [@"有限责任公司 注册号:210403)。http://gext.lngs.gov.cn" dataUsingEncoding:NSUTF8StringEncoding]; [filter setValue:data forKey:@"inputMessage"]; CIImage *outputImg = [filter outputImage]; CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef imgRef = [context createCGImage:outputImg fromRect:[outputImg extent]]; UIImage *img = [UIImage imageWithCGImage:imgRef]; _imgView.image = img; //在ImageView的Layer上使用下面代码添加阴影// _imgView.layer.shadowOffset=CGSizeMake(0, 0.5);//设置阴影的偏移量// _imgView.layer.shadowRadius=1;//设置阴影的半径// _imgView.layer.shadowColor=[UIColor blackColor].CGColor;//设置阴影的颜色为黑色// _imgView.layer.shadowOpacity=0.3;}
以上代码仅为部分实现,具体请查看Demo,代码写的比较粗糙,大神轻喷,如果觉得还能用,请给个star~
示例源码地址:https://github.com/chaseDeil/YQOriginQRDemo
扫描区域控制:http://blog.csdn.net/lc_obj/article/details/41549469
0 0
- iOS源生二维码扫描及生成
- IOS开发二维码生成及扫描ZBarDemo
- iOS开发--生成二维码及扫描二维码(原生)
- 二维码扫描及生成
- 二维码生成及扫描
- cocos2dx-lua在ios上实现生成及扫描二维码
- iOS OC_二维码扫描、生成及长按识别
- cocos2dx-lua在ios上实现生成及扫描二维码
- iOS二维码生成与扫描
- ios二维码生成和扫描
- iOS 二维码生成和扫描
- ios 二维码扫描和生成
- Android扫描及生成二维码
- iOS生成二维码,以及二维码扫描
- iOS开发之 二维码生成/二维码扫描
- iOS中 扫描二维码/生成二维码详解
- iOS中 扫描二维码/生成二维码详解
- IOS中生成二维码、扫描二维码
- w3school的职业建议
- zookeeper 系列之 1——zookeeper基本概念
- LeetCode-88.Merge Sorted Array
- hdu 2363(限制最短路 二分+枚举+最短路)
- Eclipse去除js(JavaScript)验证---红叉
- iOS源生二维码扫描及生成
- android ViewPager用作广告轮播
- 畅通工程
- HDU 4366 Successor(dfn序 + 线段树)
- Xamarin.Forms 获取当前版本号
- iOS-NSUndoManager与怎样弄崩微信
- EAP协议类型
- 封装datatables
- HDU1003 动态规划,最大子序列之和