二维码功能(扫描+读取+生成)

1.简介

1.二维码起源于日本,可以认为是条形码的升级版。二维码理论上可以包含7089个数字,4296 个字母和数字混合字符,2953个8位字节数据,1817个汉字;实际容量取决于二维码尺寸的大小、清晰度及手机摄像头的质量。
一个二维码由如下几部分组成:其中黑白色区域用于定位、蓝色区域用于纠错、黄色信息用于存储实际的编码信息


二维码功能(扫描+读取+生成)_第1张图片
二维码

2.从iOS7开始苹果集成了二维码的生成和读取功能,并且自己原生的API的效率比三方库的效率要好很多。此前被广泛使用的zbarsdk目前不支持64位处理器,所以从2015年2月起, 不允许不支持64位处理器的APP上架

二维码功能(扫描+读取+生成)_第2张图片
屏幕快照 2017-10-11 下午4.17.14.png

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代码:


二维码功能(扫描+读取+生成)_第3张图片
屏幕快照 2017-04-14 下午3.38.33.png
二维码功能(扫描+读取+生成)_第4张图片
屏幕快照 2017-04-14 下午3.38.45.png

效果:

二维码功能(扫描+读取+生成)_第5张图片
FAA7DF0B7461AF8E3CC6CCF962CA693B.png

相关链接: http://www.jianshu.com/p/18cb6632064e

补充例子:点金树iPad端生成二维码

使用UTo二维码封装类,链接:https://pan.baidu.com/s/1Mf8ycKievgTFDmBbFh0zAQ

二维码功能(扫描+读取+生成)_第6张图片
UTo二维码封装类

效果图:

二维码功能(扫描+读取+生成)_第7张图片
确认信息跳到二维码页面
二维码功能(扫描+读取+生成)_第8张图片
生成二维码

代码:

二维码功能(扫描+读取+生成)_第9张图片
确认订单页面
二维码功能(扫描+读取+生成)_第10张图片
生成二维码h页面
二维码功能(扫描+读取+生成)_第11张图片
生成二维码m页面
二维码功能(扫描+读取+生成)_第12张图片
生成二维码m页面
二维码功能(扫描+读取+生成)_第13张图片
生成二维码m页面
二维码功能(扫描+读取+生成)_第14张图片
生成二维码m页面
二维码功能(扫描+读取+生成)_第15张图片
生成二维码m页面
二维码功能(扫描+读取+生成)_第16张图片
生成二维码m页面

4.二维码扫描

点金树商城的扫码例子如下图,使用的类跟上面的iPad一样;扫码之前需要先获取用户的权限,这个在plist中设置;这里有个地方没有处理,就是扫任意二维码时的结果未处理;其他相关链接:(苹果原生API实现扫码二维码功能:
http://www.cocoachina.com/ios/20161011/17719.html)

效果图:

二维码功能(扫描+读取+生成)_第17张图片
二维码按钮
二维码功能(扫描+读取+生成)_第18张图片
需要获取用户同意弹框
二维码功能(扫描+读取+生成)_第19张图片
二维码扫描页面

代码:

二维码功能(扫描+读取+生成)_第20张图片
二维码按钮
二维码功能(扫描+读取+生成)_第21张图片
扫码h页面
二维码功能(扫描+读取+生成)_第22张图片
扫码m页面
二维码功能(扫描+读取+生成)_第23张图片
扫码m页面
二维码功能(扫描+读取+生成)_第24张图片
扫码m页面
二维码功能(扫描+读取+生成)_第25张图片
扫码m页面
二维码功能(扫描+读取+生成)_第26张图片
扫码m页面
二维码功能(扫描+读取+生成)_第27张图片
扫码m页面
二维码功能(扫描+读取+生成)_第28张图片
扫码m页面
二维码功能(扫描+读取+生成)_第29张图片
扫码m页面
二维码功能(扫描+读取+生成)_第30张图片
扫码m页面
二维码功能(扫描+读取+生成)_第31张图片
扫码m页面
二维码功能(扫描+读取+生成)_第32张图片
扫码m页面

你可能感兴趣的:(二维码功能(扫描+读取+生成))