您的位置:首页 > 其它

系统原生二维码生成和扫描

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];
   
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  生成二维码