1.简介
屏幕快照 2017-10-11 下午4.17.14.png1.二维码起源于日本,可以认为是条形码的升级版。二维码理论上可以包含7089个数字,4296 个字母和数字混合字符,2953个8位字节数据,1817个汉字;实际容量取决于二维码尺寸的大小、清晰度及手机摄像头的质量。
一个二维码由如下几部分组成:其中黑白色区域用于定位、蓝色区域用于纠错、黄色信息用于存储实际的编码信息
屏幕快照 2017-10-11 下午4.14.21.png2.从iOS7开始苹果集成了二维码的生成和读取功能,并且自己原生的API的效率比三方库的效率要好很多。此前被广泛使用的zbarsdk目前不支持64位处理器,所以从2015年2月起, 不允许不支持64位处理器的APP上架
2.使用场景
- 信息获取(名片、WIFI密码、资料)
- 手机电商(用户扫码、手机直接购物下单)
- 加好友(QQ, 微信, 扫一扫加好友)
- 手机支付(扫描商品二维码,通过银行或第三方支付提供的手机端通道完成支付)
3.生成二维码图片
生成二维码的基本步骤:
1.传入生成二维码的字符串
NSString *text=@"";
NSData *stringData = [text dataUsingEncoding: NSUTF8StringEncoding];
//官方建议使用 NSISOLatin1StringEncoding 来编码,但经测试这种编码对中文或表情无法生成,
改用 NSUTF8StringEncoding 就可以了
2.创建CIFilter
CIFilter. 滤镜类包含一个字典结构,对各种滤镜定义了属于他们各自的属性。滤镜有很多种,比如鲜艳程度滤镜,色彩反转滤镜,剪裁滤镜等等
生成二维码用到了 CIQRCodeGenerator 这种 CIFilter。它有两个字段可以设置,inputMessage 和 inputCorrectionLevel
CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
设置内容和纠错级别
//inputMessage 是一个 NSData 对象,可以是字符串也可以是一个 URL。
[qrFilter setValue:stringData forKey:@"inputMessage"];
inputCorrectionLevel 是一个单字母(@"L", @"M", @"Q", @"H" 中的一个),表示不同级别的容错率,默认为 @"M"
QR码有容错能力,QR码图形如果有破损,仍然可以被机器读取内容,最高可以到7%~30%面积破损仍可被读取
相对而言,容错率愈高,QR码图形面积愈大。所以一般折衷使用15%容错能力。错误修正容量 L水平 7%的字码可被修正
M水平 15%的字码可被修正
Q水平 25%的字码可被修正
H水平 30%的字码可被修正
所以很多二维码的中间都有头像之类的图片但仍然可以识别出来就是这个原因
[qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"];
3.3上色(当然这一步不是必须的 如果仅仅需要白底黑块的QRCode 可以跳过这一步)
UIColor *onColor = [UIColor redColor];
UIColor *offColor = [UIColor blueColor];
CIFilter *colorFilter = [CIFilter filterWithName:@"CIFalseColor"
keysAndValues:
@"inputImage",qrFilter.outputImage,
@"inputColor0",[CIColor colorWithCGColor:onColor.CGColor],
@"inputColor1",[CIColor colorWithCGColor:offColor.CGColor],
nil];
CIImage *qrImage = colorFilter.outputImage;
4.绘制(首先你需要看看这个CGContext的基本认识)
CGSize size = CGSizeMake(300, 300);
CGImageRef cgImage = [[CIContext contextWithOptions:nil] createCGImage:qrImage fromRect:qrImage.extent];
//创建一个基于位图的上下文(context),并将其设置为当前上下文(context)。
UIGraphicsBeginImageContext(size);
//设置上下文
CGContextRef context = UIGraphicsGetCurrentContext();
//背景内置颜色质量等级
CGContextSetInterpolationQuality(context, kCGInterpolationNone);
//反转画布,翻转一下图片 不然生成的QRCode就是上下颠倒
CGContextScaleCTM(context, 1.0, -1.0);
//画图片
CGContextDrawImage(context, CGContextGetClipBoundingBox(context), cgImage);
//最后无损放大并绘制QRCode (上面两步生成的QRCode很小 大概是31*31 如果不放大 就会很模糊)
//对图片放大缩小的功能就是慢了点
UIImage *codeImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//需要释放内存,不然会引发内存泄露
CGImageRelease(cgImage);
self.imageView.image = codeImage;
ps:IOS 自带coreImage CIFilter 共有100多种滤镜效果,官方只介绍了一种,找不到中文介绍,下面是其中一部分中文介绍CIFilter的种类
例子Demo代码:
屏幕快照 2017-04-14 下午3.38.33.png 屏幕快照 2017-04-14 下午3.38.45.png
效果:
FAA7DF0B7461AF8E3CC6CCF962CA693B.png相关链接:http://www.jianshu.com/p/18cb6632064e
4.二维码扫描、
1.苹果原生API实现扫码二维码功能
http://www.cocoachina.com/ios/20161011/17719.html
网友评论