iOS CoreImage 实现二维码生成和识别

  • CoreImage简介

  CoreImage是iOS5中新添加的框架,提供强大高效的图像处理功能,随着系统的不断升级,iOS sdk支持的滤镜也增加了很多,感兴趣的可以去官网查看,当然都是英文的,四级没过的选手估计看着很费劲。本文主要介绍的二维码的解析和生成。Core Image 有一个插件架构,这意味着它允许用户编写自定义的滤镜并与系统提供的滤镜集成来扩展其功能。我们在这篇文章中不会用到 Core Image 的可扩展性;我提到它只是因为它影响到了框架的 API。Core Image 是用来最大化利用其所运行之上的硬件的。每个滤镜实际上的实现,即内核,是由一个 GLSL (即 OpenGL 的着色语言) 的子集来书写的。当多个滤镜连接成一个滤镜图表,Core Image 便把内核串在一起来构建一个可在 GPU 上运行的高效程序。只要有可能,Core Image 都会把工作延迟。通常情况下,直到滤镜图表的最后一个滤镜的输出被请求之前都不会发生分配或处理。为了完成工作,Core Image 需要一个称为上下文 (context) 的对象。这个上下文是框架真正工作的地方,它需要分配必要的内存,并编译和运行滤镜内核来执行图像处理。

  • 首先认识一下这个框架中常用的几个类:
  1. CIFilter: 是一个可变对象,代表一种效果。一个滤镜对象至少要有一个输入参数,并产生一个输出图片。
  2. CIImage: 是一个不变对象,代表一个图片。
  3. CIContext :是一个对象,通过它Core Image可以绘制一个CIFilter产生的结果。一个Core Image Context可以基于CPU或GPU。
  4. CIDetector :对象使用图像处理来寻找和识别显著特征(脸、矩形和条形码)在静态图像或视频。
  • CoreImage 使用 demo TP
  1. 生成二维码

  

//生成
- (void)create
{
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    // 2、恢复滤镜的默认属性
    [filter setDefaults];
    // 3、设置内容
    NSString *str = @"这是一个二维码的生成结果";
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    // 使用KVO设置属性
    [filter setValue:data forKey:@"inputMessage"];
    // 4、获取输出文件
    CIImage *outputImage = [filter outputImage];
    // 5、显示二维码
    UIImage *image =[self createNonInterpolatedUIImageFormCIImage:outputImage withSize:500.0f];
    self.imagevew.image =image;

}
- (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];
}

  2.二维码识别

//识别
- (void)recognition
{
    //识别这块耗性能
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        CIImage *image = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"1.png"]];
        NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil];
        
        CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:options];
        NSArray *features = [detector featuresInImage:image];
        for (CIQRCodeFeature *feature in features) {
            NSLog(@"%@", feature.messageString);
            dispatch_async(dispatch_get_main_queue(), ^{
                self.lblResult.text = feature.messageString;
            });
        }
    });
}
  •  注意情况

  CIDetectorTypeQRCode是ios 8 之后才有的,并且测试真机需要5s以上产品才行。

比较好的博客推荐

http://site.douban.com/129642/widget/notes/5513129/note/268261078/

http://objccn.io/issue-21-6/

原文地址:https://www.cnblogs.com/yzvictory/p/5132304.html