生成二维码


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

     

    //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.p_w_picpathView.p_w_picpath = [UIImage p_w_picpathWithCIImage:outputImage];

    //解决模糊方法

    // self.p_w_picpathView.p_w_picpath = [self createNonInterpolatedUIImageFromCIImage:outputImage withSize:200];

生成二维码解决方法


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

{

    CGRect extent = CGRectIntegral(p_w_picpath.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:p_w_picpath 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 p_w_picpathWithCGImage: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) p_w_picpathPickerController: (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 //二维码识别

-(void)sysbutbuttonclick{

     

    //初始化照相机窗口

    ZBarReaderView *readview = [ZBarReaderView new];

     

    //自定义大小

    readview.frame = myScreen;

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

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

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

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

    readview.readerDelegate = self;

     

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

    [self.view addSubview:readview];

     

     

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

    ZBarImageScanner *scanner = readview.scanner;

     

    [scanner setSymbology: ZBAR_I25

                   config: ZBAR_CFG_ENABLE

                       to: 0];

     

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

    [readview start];

}

 

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

{

    ZBarSymbol *symbol = nil;

    for (symbol in symbols) {

        break;

    }

     

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

}