天天看点

二维码生成与扫描

一 生成二维码

20     某些二维码中间有图片,可以直接在imageView添加图片居中

    //1.创建过滤器

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

    //2.恢复默认

    [filter setDefaults];

    //3.给过滤器添加数据

    NSString *str = @"二维码学习"; //也直接输出网址,扫描会自动跳转

    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

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

    //4.获取输出二维码

    CIImage *outputImage = [filter outputImage];

    //5.显示二维码

    self.imageView.image = [UIImage imageWithCIImage:outputImage];

    //解决模糊方法

    // self.imageView.image = [self createNonInterpolatedUIImageFromCIImage:outputImage withSize:200];

生成二维码解决方法

23 -(UIImage *)createNonInterpolatedUIImageFromCIImage:(CIImage *)image withSize:(CGFloat)size

{

    CGRect extent = CGRectIntegral(image.extent);

    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));

    //1.创建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);

    //2.保存bitmap到图片

    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);

    CGContextRelease(bitmapRef);

    CGImageRelease(bitmapImage);

    return [UIImage imageWithCGImage:scaledImage];

}

二 二维码识别

49 @interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>

@property (weak, nonatomic)AVCaptureSession *session;

@property (weak, nonatomic)AVCaptureVideoPreviewLayer *layer;

- (IBAction)scan:(UIButton *)sender {

    //1.创建捕捉会话

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

    self.session = session;

    //2.设置输入设备 设置为摄像头

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

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

    [session addInput:inputDevice];

    //3.设置输出方式 代理数据输出数据

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

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

    [session addOutput:output];

    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

    //4.添加一个显示的layer 类似摄像头拍照阅览

    AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

    layer.frame = self.view.bounds;

    [self.view.layer addSublayer:layer];

    self.layer = layer;

    //5.开始扫描

    [session startRunning];

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

    if (metadataObjects.count > 0) {

        //1.获取扫描结果

        AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];

        self.outLabel.text = object.stringValue;

        //2.停止扫描

        [self.session stopRunning];

        //3.移除图层

        [self.layer removeFromSuperlayer];

    }else{

        NSLog(@"没有扫描到数据");

    }

三 ZBarSDK的使用

导入必要的框架

1).快速集成

实现ZBarReaderDelegate协议

35 //二维码识别

-(void)sysbutbuttonclick{

    //初始化相机控制器

    ZBarReaderViewController *reader = [ZBarReaderViewController new];

    //设置代理

    reader.readerDelegate = self;

    //基本适配

    reader.supportedOrientationsMask = ZBarOrientationMaskAll;

    //二维码/条形码识别设置

    ZBarImageScanner *scanner = reader.scanner;

    [scanner setSymbology: ZBAR_I25

                   config: ZBAR_CFG_ENABLE

                       to: 0];

    //弹出系统照相机,全屏拍摄

    [self presentViewController:reader animated:YES completion:nil];

- (void) imagePickerController: (UIImagePickerController*) reader

  didFinishPickingMediaWithInfo: (NSDictionary*) info

 {

         NSLog(@"info=%@",info);

         // 得到条形码结果

         id<NSFastEnumeration> results =[info objectForKey: ZBarReaderControllerResults];

         ZBarSymbol *symbol = nil;

         for(symbol in results)

                 // EXAMPLE: just grab the first barcode

                 break;

       NSLog(@"%@",symbol.data);

2).自定义窗口

实现ZBarReaderViewDelegate协议

38 //二维码识别

    //初始化照相机窗口

    ZBarReaderView *readview = [ZBarReaderView new];

    //自定义大小

    readview.frame = myScreen;

    //自定义添加相关指示.........发挥各自的APP的想象力

    //此处省略美化10000行代码...................

    //………………………..

    // 好进入正题—— 接着设置好代理

    readview.readerDelegate = self;

    //将其照相机拍摄视图添加到要显示的视图上

    [self.view addSubview:readview];

    ZBarImageScanner *scanner = readview.scanner;

    //启动,必须启动后,手机摄影头拍摄的即时图像菜可以显示在readview上

    [readview start];

-(void)readerView:(ZBarReaderView *)readerView didReadSymbols:(ZBarSymbolSet *)symbols fromImage:(UIImage *)image

    ZBarSymbol *symbol = nil;

    for (symbol in symbols) {

        break;

    NSLog(@"========%@==========",symbol.data);

本文转自 卓行天下  51CTO博客,原文链接:http://blog.51cto.com/9951038/1757594,如需转载请自行联系原作者

继续阅读