:full_moon_with_face:良心整理,希望看官老爷喜欢.2333二维码的生成.//生成二维码图片 CIFilter *filter = [CIFilter filterWithNa
:full_moon_with_face:良心整理,希望看官老爷喜欢.2333
二维码的生成.
//生成二维码图片 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; //2.恢复滤镜的默认属性(因为滤镜有可能保存上一次的属性) [filter setDefaults]; //3.经字符串转化成NSData NSData *data = [[EMClient sharedClient].currentUsername dataUsingEncoding:NSUTF8StringEncoding]; //4.通过KVC设置滤镜,传入data,将来滤镜就知道要通过传入的数据生成二维码 [filter setValue:data forKey:@"inputMessage"]; //5.生成二维码 CIImage *image = [filter outputImage]; //CIImage是CoreImage框架中最基本代表图像的对象,他不仅包含元图像数据,还包含作用在原图像上的滤镜链。 self.imageOfQR.image = [UIImage imageWithCIImage:image]; self.imageOfQR.image = [self createNonInterpolatedUIImageFormCIImage:image withSize:100.0];
- (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];}
二维码的扫描(原生二维码)
导入avfoundation框架, 签 AVCaptureMetadataOutputObjectsDelegate协议
定义以下全局变量.
@property (strong,nonatomic)AVCaptureDevice * device;//是AVCaptureInput的子类,可以作为输入捕获会话,用AVCaptureDevice实例初始化。@property (strong,nonatomic)AVCaptureDeviceInput * input;//是AVCaptureOutput的子类,处理输出捕获会话@property (strong,nonatomic)AVCaptureMetadataOutput * output;//管理输入(AVCaptureInput)和输出(AVCaptureOutput)流,包含开启和停止会话方法。@property (strong,nonatomic)AVCaptureSession * session;@property (strong,nonatomic)AVCaptureVideoPreviewLayer * preview;@property (nonatomic, assign)BOOL lastResult;
- 创建设备,输入输出流等.
// Device _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; // Input _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil]; // Output _output = [[AVCaptureMetadataOutput alloc]init]; [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; // Session _session = [[AVCaptureSession alloc]init]; [_session setSessionPreset:AVCaptureSessionPresetHigh]; //连接输入和输出 if ([_session canAddInput:self.input]) { [_session addInput:self.input]; } if ([_session canAddOutput:self.output]) { [_session addOutput:self.output]; } //设置条形码类型 _output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode]; //添加扫描画面 _preview = [AVCaptureVideoPreviewLayer layerWithSession:_session]; _preview.videoGravity = AVLayerVideoGravityResizeAspectFill; //相机范围. _preview.frame = CGRectMake([UIScreen mainScreen].bounds.size.width / 2 - 150, [UIScreen mainScreen].bounds.size.height / 2 - 175, 300, 350); [self.view.layer insertSublayer:_preview atIndex:0]; [_session startRunning];
4.停止扫描
- (void)stopReading { [_session stopRunning]; _session = nil;}
5.扫描二维码
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { if (metadataObjects != nil && [metadataObjects count] > 0) { AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0]; NSString *result; if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) { result = metadataObj.stringValue; //实现页面跳转. } else { NSLog(@"不是二维码"); } [self performSelectorOnMainThread:@selector(reportScanResult:) withObject:result waitUntilDone:NO]; }}- (void)reportScanResult:(NSString *)result { [self stopReading]; if (!_lastResult) { _lastResult = NO; return; } else{ //以下处理了结果,继续下次扫描 _lastResult = YES; }}