- 二维码是用特定的几何图形来记录信息
- 在之前,常用的二维码开发框架有:
ZXing
和ZBarSDK
- 苹果从
iOS7
开始集成了二维码的生成和读取功能,并且之前的框架不支持64
位,因此目前只是用苹果的框架即可
二.二维码的生成
- 二维码的生成就是将固定的信息生成对应的二维码
- 生成二维码的步骤:
(1).导入CoreImage框架
(2).通过滤镜CIFilter生成二维码
<1>.创建滤镜对象
<2>.设置滤镜的默认设置
<3>.给滤镜设置数据(KVC)
<4>.获取生成的二维码图形
下面是实际代码:
- 1.导入#import <CoreImage/CoreImage.h> :此框架非常强大
- 2.创建CIFilte(滤镜)对象
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
- 3.恢复滤镜默认设置
[filter setDefaults];
- 4.设置数据(通过滤镜对象的
KVC
)
//存放的信息 NSString *info = @"我叫王冲"; //把信息转化为NSData NSData *infoData = [info dataUsingEncoding:NSUTF8StringEncoding]; //滤镜对象kvc存值 [filter setValue:infoData forKeyPath:@"inputMessage"]; //我们可以打印,看过滤器的 输入属性.这样我们才知道给谁赋值 NSLog(@"%@",qrImageFilter.inputKeys); /* inputMessage, //二维码输入信息 inputCorrectionLevel //二维码错误的等级,就是容错率 */
- 5.生成二维码(前提建立一个
UIIMageView
对象存放图片),但是图片 发现有的小 (27,27),我们需要放大
CIImage *outImage = [filter outputImage];
- (1).不处理的情况下生成的二维码(其实生成的二维码是小的,目前是被放大了)
- imageView.image = [UIImage imageWithCIImage:outImage];//不处理图片模糊,故而调用下面的信息
(2).处理过的图片(需要调用一个方法来处理图片)
imageView.image = [self createNonInterpolatedUIImageFormCIImage:outImage withSize:300]; /** * 根据CIImage生成指定大小的UIImage * * @param image CIImage * @param size 图片宽度以及高度 */ - (UIImage *)createNonInterpolatedUIImageFormCIImage:(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]; }
生成的二维码
iOS生成二维码code 密码: bt8f
iOS二维码生成方法封装过的code 密码: 3vqj
重点:在此我进行了对二维码的改善:效果如下
你需要做的是:(已经封装好了)
1.导入:SDWebImage 框架 2.拖入我封装好的类 ,导入 #import "LogoQR.h" 3.创建UIImageView的对象来放二维码 4.调用方法 /** * [LogoQR new] 调用方法的对象 * QRurl :头像的链接 * messages: 二维码里面存放的信息 */ UIImageView的对象.image = [[LogoQR new] QRurl:urlString messages:self.messages];
带logo的二维码 密码: q6s6
三.二维码的扫描
- 二维码扫描就是将二维码的图像读取,并且解析成我们可以是别的信息
- 扫描二维码的步骤
(1).读取二维码需要导入AVFoundation框架
(2).利用摄像头读取信息,并且输入
<1>.获取捕捉会话(AVFoundation框架) <2>.设置输入摄像头 <3>.设置输出数据 <4>.添加预览图层 <5>.开始扫描二维码
- 1.导入框架 #import <AVFoundation/AVFoundation.h>
- 2.获取捕捉会话
AVCaptureSession *session = [[AVCaptureSession alloc]init]; self.session = session;
- 3.设置输入(摄像头)
//AVMediaTypeVideo:摄像头, AVMediaTypeAudio:话筒, AVMediaTypeMuxed:弹幕 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if (error) { //防止模拟器崩溃 NSLog(@"没有摄像头设备"); return; } AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; [session addInput:input];
- 4.设置输出(数据) 挂代理
<AVCaptureMetadataOutputObjectsDelegate> 挂代理 AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc]init]; [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; [session addOutput:output]; //设置输出类型,必须在output 加入到会话之后来设置 [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
- 5.添加预览层
AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session]; layer.frame = self.view.bounds; [self.view.layer addSublayer:layer]; self.layer = layer;
- 6.开始扫描
[session startRunning];
- 7.调用扫面结果的代理方法
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { if (metadataObjects.count>0) { //1.获取到扫描的内容 AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject]; NSLog(@"扫描的内容==%@",object.stringValue); //2.停止会话 [self.session stopRunning]; //3.移除预览图层 [self.layer removeFromSuperlayer]; } }
说明:扫描的内容是什么是可以打印出来的,如果是链接,你可以用WebView来加载的