二维码的生成

1.二维码

a. 二维码的本质
二维码的本质就是一个 NSString 类型的字符串.
/*

  • 二维码的内容是字符串
  • CoreImage中有个核心, CIFilter滤镜
  • CIFilter的参数设置是通过KVC来配置, 而不是属性
  • CoreImage框架提供了很多可以直接使用的滤镜
  • 一个滤镜的输出可以是另一个滤镜的输入 (多个滤镜的效果可以组合起来使用)
  • 二维码的内容越多, 黑黑的方格就越多
    根据字符串来生成一个对应的二维码
    /
    b. 如何生成二维码
    1. 首先要导入一个专门用来处理静态与动态图片的框架#import ,这里的一个关键类叫做滤镜 CIFilter ,它的作用就相当于一个染坊,为图片添加特殊的图片效果的从而生成一张新的图片
      2.iOS 系统为开发者提供了许多不同功能的滤镜,其中比如有渲染颜色的,有二维码的等等,我们可以从对应CIFilter.h 头文件中找到. 废话不多讲了,直接贴代码:
      /**
  • 二维码的内容是字符串
  • CoreImage中有个核心, CIFilter滤镜
  • CIFilter的参数设置是通过KVC来配置, 而不是属性
  • CoreImage框架提供了很多可以直接使用的滤镜

根据字符串来生成一个对应的二维码
*/

import "ViewController.h"

// 专门用来处理静态与动态图片的处理 (实现一些特殊效果)

import

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

/* 滤镜 (为图片添加特殊效果 -> 生成新的图片) */
@property (strong, nonatomic) CIFilter *filter;

@end

@implementation ViewController

  • (void)viewDidLoad
    {
    [super viewDidLoad];

    /**

    • 获取所有可用的滤镜 (名字)
      kCICategoryBuiltIn 指是系统内建的滤镜
      */
      NSArray *fileNames = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
      NSLog(@"fileNames: %@", fileNames);

    /**

    • 必须要确保滤镜名字是正确, CIQRCodeGenerator
      */
      // 根据滤镜名创建对应的滤镜 (滤镜名必须正确, 而且是系统提供的)
      self.filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
      // 1. 通过文档来查找该滤镜 (图文效果)
      // 2. 通过代码方式来查找, 找到相应的Key与Value的描述
      NSDictionary *attributes = self.filter.attributes;
      NSLog(@"%@", attributes);

    // 直接生成一张字符串对应的二维码图片, 并不需要图片输入

    // -------- 配置输入参数 --------
    NSString *message = @"科比一路走好, 我永远怀念你! 死在朋友圈里了!";
    NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];
    [self.filter setValue:data forKey:@"inputMessage"];

    // 会影响二维码能被遮挡的内容大小 (H接近30%)
    [self.filter setValue:@"H" forKey:@"inputCorrectionLevel"];

    // -------- 获取 --------
    // 获取滤镜的输出图片
    CIImage *outputImage = self.filter.outputImage;
    UIImage *image = [UIImage imageWithCIImage:outputImage];

    self.imageView.image = image;
    }

@end

c.展示效果

二维码的生成_第1张图片
image.png

d. 生成彩色二维码

/**
 * 必须要确保滤镜名字是正确, CIQRCodeGenerator
 */
NSArray  *fileNames = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
NSLog(@"fileNames: %@", fileNames);
// 根据滤镜名创建对应的滤镜 (滤镜名必须正确, 而且是系统提供的)
self.filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 1. 通过文档来查找该滤镜 (图文效果)
// 2. 通过代码方式来查找, 找到相应的Key与Value的描述
NSDictionary  *attributes = self.filter.attributes;
NSLog(@"%@", attributes);

// 直接生成一张字符串对应的二维码图片, 并不需要图片输入

// -------- 配置输入参数 --------
NSString *message = @"OurAppName://RequestFriend?username=yueyue!";
NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];
[self.filter setValue:data forKey:@"inputMessage"];

// 会影响二维码能被遮挡的内容大小 (H接近30%)
[self.filter setValue:@"H" forKey:@"inputCorrectionLevel"];

// -------- 获取 --------
// 获取滤镜的输出图片, outputImage是二维码滤镜输出的二维码图片
CIImage *outputImage = self.filter.outputImage;

// -------- 修改颜色 --------
CIFilter *filter = [CIFilter filterWithName:@"CIFalseColor"];

// 配置参数 (参考文档)
[filter setValue:outputImage forKey:@"inputImage"];

CIColor *color0 = [CIColor colorWithRed:10/255.0 green:110/255.0 blue:180/255.0];
CIColor *color1 = [CIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0];
[filter setValue:color0 forKey:@"inputColor0"];
[filter setValue:color1 forKey:@"inputColor1"];

outputImage = filter.outputImage;

// -------- 调整CIImage的大小 --------
outputImage = [outputImage imageByApplyingTransform:CGAffineTransformMakeScale(20, 20)];
NSLog(@"Size: %@", NSStringFromCGSize(outputImage.extent.size));

UIImage *image = [UIImage imageWithCIImage:outputImage];

self.imageView.image = image;  


E *展示效果*  
二维码的生成_第2张图片
image.png
F. 生成带头像的二维码    

import "UIImage+QRCode.h"

@implementation UIImage (QRCode)
*- (UIImage *)imageWithIcon:(UIImage *)icon
{
// 图形上下文
UIGraphicsBeginImageContext(self.size);

// 将原来的图片画上去 (二维码)
[self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)];

// 将用户头像画上去, 假定用户头像的宽高是原图25%
CGFloat wh = MIN(self.size.width, self.size.height) * 0.25;
CGFloat centerX = (self.size.width - wh) / 2;
CGFloat centerY = (self.size.height - wh) / 2;
[icon drawInRect:CGRectMake(centerX, centerY, wh, wh)];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return newImage;

}

@end

你可能感兴趣的:(二维码的生成)