系统原生二维码生成和扫描
2016-03-01 14:03
344 查看
-、扫描二维码
导入#import
<AVFoundation/AVFoundation.h>
使用以下代码调用系统原生扫描二维码api
//获取摄像设备
AVCaptureDevice * device = [AVCaptureDevice
defaultDeviceWithMediaType:AVMediaTypeVideo];
//创建输入流
AVCaptureDeviceInput * input = [AVCaptureDeviceInput
deviceInputWithDevice:device
error:nil];
//创建输出流
output = [[AVCaptureMetadataOutput
alloc]init];
//设置代理在主线程里刷新
[output
setMetadataObjectsDelegate:self
queue:dispatch_get_main_queue()];
//初始化链接对象
session = [[AVCaptureSession
alloc]init];
//高质量采集率
[session
setSessionPreset:AVCaptureSessionPresetHigh];
[session
addInput:input];
[session
addOutput:output];
//设置扫码支持的编码格式(如下设置条形码和二维码兼容)
output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,
AVMetadataObjectTypeEAN8Code,
AVMetadataObjectTypeCode128Code];
AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer
layerWithSession:session];
layer.videoGravity=AVLayerVideoGravityResizeAspectFill;
layer.frame=self.view.layer.bounds;
[self.view.layer
insertSublayer:layer
atIndex:0];
//此方法可设置扫描区域,默认(0,0,1,1)全屏扫描,但是一般项目中都会有一个小方框作为扫描区域,所以可根据此方法设置你想要的扫面范围
[output setRectOfInterest:CGRectMake(0,
0, 1,
1)];
要注意,第一个参数是扫描框y坐标相对于屏幕高的比例,第二个参数是x坐标相对于屏幕宽的比例,第三个参数是扫描框长相对于屏幕高的比例,第四个是扫描框宽相对于屏幕宽的比例,一定不要设置反了
继承代理AVCaptureMetadataOutputObjectsDelegate
实现代理方法:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray*)metadataObjects fromConnection:(AVCaptureConnection
*)connection
{
NSString *stringValue;
if([metadataObjects
count] >0)
{
//停止扫描
[session
stopRunning];
AVMetadataMachineReadableCodeObject * metadataObject =[metadataObjects
objectAtIndex:0];
stringValue = metadataObject.stringValue;
NSLog(@"%@",stringValue);
//处理扫描数据
}
}
二、二维码生成
- (void)CreatCode:(id)sender {
//二维码滤镜
CIFilter *filter=[CIFilter
filterWithName:@"CIQRCodeGenerator"];
//恢复滤镜的默认属性
[filter setDefaults];
//将字符串转换成NSData
NSData *data=[tf_text.text
dataUsingEncoding:NSUTF8StringEncoding];
/
4000
/通过KVO设置滤镜inputmessage数据
[filter setValue:data
forKey:@"inputMessage"];
//获得滤镜输出的图像
CIImage *outputImage=[filter
outputImage];
//将CIImage转换成UIImage,并放大显示
img.image=[self
createNonInterpolatedUIImageFormCIImage:outputImage
withSize:100.0];
// //如果还想加上阴影,就在ImageView的Layer上使用下面代码添加阴影
//
// _imgView.layer.shadowOffset=CGSizeMake(0,0.5);//设置阴影的偏移量
//
// _imgView.layer.shadowRadius=1;//设置阴影的半径
//
// _imgView.layer.shadowColor=[UIColorblackColor].CGColor;//设置阴影的颜色为黑色
//
// _imgView.layer.shadowOpacity=0.3;
}
//改变二维码大小
- (UIImage*)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
CGRect extent =
CGRectIntegral(image.extent);
CGFloat scale =
MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
// 创建bitmap;
size_t width =
CGRectGetWidth(extent) * scale;
size_t height =
CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs =
CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef =
CGBitmapContextCreate(nil, width, height,
8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext
contextWithOptions:nil];
CGImageRef bitmapImage = [context
createCGImage:image
fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef,
kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent,bitmapImage);
// 保存bitmap到图片
CGImageRef scaledImage =
CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage
imageWithCGImage:scaledImage];
}
导入#import
<AVFoundation/AVFoundation.h>
使用以下代码调用系统原生扫描二维码api
//获取摄像设备
AVCaptureDevice * device = [AVCaptureDevice
defaultDeviceWithMediaType:AVMediaTypeVideo];
//创建输入流
AVCaptureDeviceInput * input = [AVCaptureDeviceInput
deviceInputWithDevice:device
error:nil];
//创建输出流
output = [[AVCaptureMetadataOutput
alloc]init];
//设置代理在主线程里刷新
[output
setMetadataObjectsDelegate:self
queue:dispatch_get_main_queue()];
//初始化链接对象
session = [[AVCaptureSession
alloc]init];
//高质量采集率
[session
setSessionPreset:AVCaptureSessionPresetHigh];
[session
addInput:input];
[session
addOutput:output];
//设置扫码支持的编码格式(如下设置条形码和二维码兼容)
output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,
AVMetadataObjectTypeEAN8Code,
AVMetadataObjectTypeCode128Code];
AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer
layerWithSession:session];
layer.videoGravity=AVLayerVideoGravityResizeAspectFill;
layer.frame=self.view.layer.bounds;
[self.view.layer
insertSublayer:layer
atIndex:0];
//此方法可设置扫描区域,默认(0,0,1,1)全屏扫描,但是一般项目中都会有一个小方框作为扫描区域,所以可根据此方法设置你想要的扫面范围
[output setRectOfInterest:CGRectMake(0,
0, 1,
1)];
要注意,第一个参数是扫描框y坐标相对于屏幕高的比例,第二个参数是x坐标相对于屏幕宽的比例,第三个参数是扫描框长相对于屏幕高的比例,第四个是扫描框宽相对于屏幕宽的比例,一定不要设置反了
继承代理AVCaptureMetadataOutputObjectsDelegate
实现代理方法:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray*)metadataObjects fromConnection:(AVCaptureConnection
*)connection
{
NSString *stringValue;
if([metadataObjects
count] >0)
{
//停止扫描
[session
stopRunning];
AVMetadataMachineReadableCodeObject * metadataObject =[metadataObjects
objectAtIndex:0];
stringValue = metadataObject.stringValue;
NSLog(@"%@",stringValue);
//处理扫描数据
}
}
二、二维码生成
- (void)CreatCode:(id)sender {
//二维码滤镜
CIFilter *filter=[CIFilter
filterWithName:@"CIQRCodeGenerator"];
//恢复滤镜的默认属性
[filter setDefaults];
//将字符串转换成NSData
NSData *data=[tf_text.text
dataUsingEncoding:NSUTF8StringEncoding];
/
4000
/通过KVO设置滤镜inputmessage数据
[filter setValue:data
forKey:@"inputMessage"];
//获得滤镜输出的图像
CIImage *outputImage=[filter
outputImage];
//将CIImage转换成UIImage,并放大显示
img.image=[self
createNonInterpolatedUIImageFormCIImage:outputImage
withSize:100.0];
// //如果还想加上阴影,就在ImageView的Layer上使用下面代码添加阴影
//
// _imgView.layer.shadowOffset=CGSizeMake(0,0.5);//设置阴影的偏移量
//
// _imgView.layer.shadowRadius=1;//设置阴影的半径
//
// _imgView.layer.shadowColor=[UIColorblackColor].CGColor;//设置阴影的颜色为黑色
//
// _imgView.layer.shadowOpacity=0.3;
}
//改变二维码大小
- (UIImage*)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
CGRect extent =
CGRectIntegral(image.extent);
CGFloat scale =
MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
// 创建bitmap;
size_t width =
CGRectGetWidth(extent) * scale;
size_t height =
CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs =
CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef =
CGBitmapContextCreate(nil, width, height,
8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext
contextWithOptions:nil];
CGImageRef bitmapImage = [context
createCGImage:image
fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef,
kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent,bitmapImage);
// 保存bitmap到图片
CGImageRef scaledImage =
CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage
imageWithCGImage:scaledImage];
}
相关文章推荐
- PHP生成二维码的两个方法和实例
- 分享用Asp.net做的几个实例,数据报表、二维码、数据抓取、批量上传图片
- 分享用Asp.net做的几个实例,数据报表、二维码、数据抓取、批量上传图片
- Asp.net生成二维码和解析二维码源码
- Asp.net生成二维码和解析二维码
- 用java生成二维码
- 使用二维码生成框架libqrencode时遇到的问题解决办法
- IOS生成二维码、扫二维码
- iO7以上用CIFilter生成二维码
- 关于php生成二维码
- 使用ThoughtWorks.QRCode生成二维码
- java实现二维码的生成和解析。
- [iOS]分享一段用系统API生产二维码的代码
- python 生成待图片的二维码代码
- php--------php库生成二维码和有logo的二维码
- php--------使用js生成二维码
- Android之扫描二维码和根据输入信息生成名片二维码
- 使用PHP生成二维码,并可以在网站中调用
- iOS生成二维码(中间包含图片),长按识别二维码(Swift)
- 自带logo的二维码生成代码