某些二维码中间有图片,能够直接在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];
生成二维码解决方法session
-(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]; }
@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(@"没有扫描到数据"); } }
导入必要的框架框架
实现ZBarReaderDelegate协议ide
//二维码识别 -(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); }
实现ZBarReaderViewDelegate协议学习
//二维码识别 -(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 *)image { ZBarSymbol *symbol = nil; for (symbol in symbols) { break; } NSLog(@"========%@==========",symbol.data); }