您的位置:首页 > 其它

菜鸟成长记-二维码生成、扫描

2016-04-08 10:50 211 查看

项目中经常会有生成二维码的需求,其实做起来还是很简单的,只需求照几步走就行

每一步的作用,我都会有注释,学习起来很方便
1:生成二维码

//
实例化二维码滤镜

CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

[filter setDefaults];

//
将字符串转换成NSdata

NSData *data = [@"http://www.baidu.com" dataUsingEncoding:NSUTF8StringEncoding];

//
通过KVO设置滤镜,
传入data,

[filter setValue:data forKey:@"inputMessage"];

//
生成二维码

CIImage *outputImage = [filter outputImage];

UIImage *image = [UIImage imageWithCIImage:outputImage];

//
设置生成好得二维码到imageview上

self.myImage.image = image;

2:扫描二维码

// 1. 实例化拍摄设备

AVCaptureDevice *device = [AVCaptureDevice
defaultDeviceWithMediaType:AVMediaTypeVideo];

// 2.
设置输入设备

AVCaptureDeviceInput *input = [AVCaptureDeviceInput
deviceInputWithDevice:device error:nil];

// 3.
设置元数据输出

// 3.1
实例化拍摄元数据输出

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput
alloc] init];

// 3.3
设置输出数据代理

[output setMetadataObjectsDelegate:self
queue:dispatch_get_main_queue()];

// 4.
添加拍摄会话

// 4.1
实例化拍摄会话

AVCaptureSession *session = [[AVCaptureSession
alloc] init];

// 4.2
添加会话输入

[session addInput:input];

// 4.3
添加会话输出

[session addOutput:output];

// 4.3 设置输出数据类型,需要将元数据输出添加到会话后,才能指定元数据类型,否则会报错

[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

self.session = session;

// 5.
视频预览图层

// 5.1 实例化预览图层,
传递_session是为了告诉图层将来显示什么内容

AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer
layerWithSession:_session];

preview.videoGravity =
AVLayerVideoGravityResizeAspectFill;

preview.frame =
self.view.bounds;

// 5.2
将图层插入当前视图

[self.view.layer
insertSublayer:preview atIndex:100];

self.VideoLayer = preview;

// 6.
启动会话

[_session
startRunning];

3:实现协议方法

#pragma mark AVCaptureMetadataOutputObjectsDelegate

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection
*)connection

{

// 会频繁的扫描,调用代理方法

// 如果扫描完成,停止会话

[self.session
stopRunning];

//
删除预览图层

[self.VideoLayer
removeFromSuperlayer];

NSLog(@"%@", metadataObjects);

// 设置界面显示扫描结果

if (metadataObjects.count > 0) {

AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];

// 提示:如果需要对url或者名片等信息进行扫描,可以在此进行扩展!

NSLog(@"%@", obj.stringValue);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: