iOS二维码

一、介绍

iOS7之后,苹果API中集成了二维码的生成和读取功能。
框架:CoreImage
二维码的内容:纯文本,名片,URL

二、生成二维码

// 1.创建生成二维码的滤镜
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 2.把数据输入给滤镜
NSString *url = @"http://www.baidu.com";
NSData *data = [url dataUsingEncoding:NSUTF8StringEncoding];
//需要把NSString 转为 NSData
[filter setValue:data forKeyPath:@"inputMessage"];
// 3.获得滤镜生成的二维码
CIImage *image = [filter outputImage];
// 4.为图片设置image
self.imageView.image = [UIImage imageWithCIImage:image];

三、参数细节

1.创建滤镜的参数获得方式
//创建滤镜的参数的获得方式
NSArray *array = [CIFilter filterNamesInCategories:@[kCICategoryBuiltIn]];
NSLog(@"%@",array);
2.设置滤镜参数的KeyPath获得方式
NSLog(@"%@",[filter inputKeys]);

四、二维码中间添加图片

- (UIImage *)lufyImageWithImage:(UIImage *)image withHeadImage:(UIImage *)headImage{
  //1.开启上下文
  UIGraphicsBeginImageContext(image.size);
  //2.绘制二维码图
  [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
  //3.绘制头像 - 头像的大小不能超过二维码的30%
  CGFloat imageX = (image.size.width - headImage.size.width) * 0.5;
  CGFloat imageY = (image.size.height - headImage.size.height) * 0.5;;
  CGFloat imageW = image.size.width * 0.3;
  CGFloat imageH = image.size.height * 0.3;
  [headImage drawInRect:CGRectMake(imageX, imageY, imageW, imageH)];
  //4.取出图片
  UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
  //5.关闭上下文
  UIGraphicsEndImageContext();
  return newImage;
}

五、二维码扫描

//开启二维码扫描
- (void)startCode{
  // 1. 输入设备-摄像头
  AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
  AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
  // 2. 会话(沟通输入-输出)
  self.session = [[AVCaptureSession alloc] init];
  // 2.1添加输入
  if ([self.session canAddInput:input]) {
    [self.session addInput:input];
  }
  // 2.2 预览图层 -- 可以自定义一个UIView来做自己想要的界面
  AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
  // 注意: 必须设置layer的frame值
  layer.frame = self.view.bounds;
  [self.view.layer addSublayer:layer];
  // 3. 输出
  AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
  // 3.1 配置代理和线程
  [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
  // 3.2 将输出添加到session
  if ([self.session canAddOutput:output]) {
    [self.session addOutput:output];
  }
  // 3.3 设置解析的数据类型--二维码
  [output setMetadataObjectTypes:@[@"org.iso.QRCode"]];
  // 3.4设置有效扫描范围,rectOfInterest的值是0.0-1.0.
  output.rectOfInterest = [self rectWithRect:self.view.bounds];
  // 4.开始扫描, 会一直不断的扫描
  [_session startRunning];
}

//计算有效扫描范围
- (CGRect)rectWithRect:(CGRect)screenRect{
  // 在正中间添加一个 200 * 200 的效区域
  CGFloat x = ((screenRect.size.width - 200) * 0.5) / screenRect.size.width;
  CGFloat y = ((screenRect.size.height - 200) * 0.5) / screenRect.size.height;
  CGFloat width = 200 / screenRect.size.width;
  CGFloat height = 200 / screenRect.size.height;
  return CGRectMake(y, x, height, width);
}

//二维码扫描代理
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
  AVMetadataMachineReadableCodeObject *codeObject = metadataObjects.lastObject;
  NSString *content = codeObject.stringValue;
  NSLog(@"%@", content);
  // 停止扫描
  [_session stopRunning];
}

六、输出设备的解析类型查询方式

注意: 只有真机能查看到相应的type值, 查看可用类型
NSArray *metadataTypes = [output availableMetadataObjectTypes];

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