了解Core Image框架

#Core Image框架提供:

  • 访问内置图像处理过滤器
  • 特征检测功能
  • 支持自动图像增强
  • 将多个过滤器链接在一起以创建自定义效果的功能
  • 支持创建在GPU上运行的自定义过滤器
  • 基于反馈的图像处理功能
    ##CIImage 介绍
  • CIImage 由Core Image过滤器处理或生成的图像的表示。
  • CIImage对象具有与之关联的图像数据,但它不是图像。可以将CIImage对象视为图像“食谱”。
  • CIImage对象具有生成图像所需的所有信息,但Core Image在被告知这样做之前实际上不会渲染图像.
  • CIContext 和CIImage对象是不可变的,这意味着每个都可以在线程之间安全地共享。
    几乎任何图像数据源创建Core Image图像对象,包括:
    1. 引用要加载的图像文件的URL或NSData包含图像文件数据的对象.

    2. Quartz2D,UIKit中,或者了AppKit图像表示(CGImageRef,UIImage,或NSBitmapImageRep对象).

    3. Metal,OpenGL或OpenGL ES纹理.

    4. CoreVideo图像或像素缓冲区(CVImageBufferRef或CVPixelBufferRef).

    5. IOSurfaceRef 在进程之间共享图像数据的对象.

    6. 内存中的图像位图数据(指向此类数据的指针,或CIImageProvider按需提供数据的对象).
      创建CIImage方式之一:

       CIImage *image = [CIImage imageWithCGImage:[UIImage imageNamed:@"youyong"].CGImage];
      

##CIFilter过滤器描述

  • CIFilter该类的实例是表示图像处理效果的可变对象以及控制该效果行为的任何参数。

  • 过滤器参数定义为键值对; 要使用参数,通常使用valueForKey:和setValue:forKey:键或基于键值编码构建的其他功能(例如Core Animation)。

  • 注意: CIFilter对象是可变的,因此您无法在不同的线程之间安全地共享它们。每个线程都必须创建自己的CIFilter对象。

  • 一些更常见的输入参数类型具有关联的键,例如kCIInputImageKey。如果无法推断关联的键常量,则只需使用过滤器引用中的***字符串文字***即可。
    查看系统自带过滤器类别
    创建CIGaussianBlur类型的CIFIter:
    这里写图片描述

      CIImage *image = [CIImage imageWithCGImage:[UIImage imageWithContentsOfFile:urlString].CGImage];
      	CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"]; //高斯分布
      	[filter setValue:image forKey:kCIInputImageKey];
      	[filter setValue:@(10) forKey:kCIInputRadiusKey]; //默认为10.0
      	CIImage *resultImage = [filter outputImage];
      	UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 400, 200)];
      	imageView.backgroundColor = [UIColor clearColor];
      	imageView.center = self.view.center;
      	imageView.image = [UIImage imageWithCIImage:resultImage];
      	[self.view addSubview:imageView];
    

    效果如下:
    这里写图片描述
    使用CIContext构建自己的工作流
    CIContext是管理大量资源和状态的重量级对象。反复创建和销毁上下文会产生很大的性能成本,因此如果您计划执行多个图像处理操作,请尽早创建上下文并将其存储以供将来重用。

  • 使用CIContext名称以render或开头的方法create来指定显式目标。想要实时渲染Core Image结果,即在过滤器参数中设置动画效果,生成动画过渡效果,或者处理已经每秒渲染多次的视频或其他可视内容,请小心使用此方法。即使CIContext使用此方法创建的对象可以使用GPU自动渲染,呈现渲染结果也可能涉及CPU和GPU内存之间的昂贵复制操作。
    Core Image轻松地在应用程序的用户界面中为游戏,视频或图像添加视觉效果,而无需构建复杂的渲染代码。以下部分介绍了在应用程序中使用Core Image的几种常用方法,以及为每种方法提供的便利系统框架。

    1. 在UIKit中处理静止图像
      注意:请勿使用Core Image创建作为用户界面设计一部分的模糊效果(如半透明侧边栏,工具栏以及macOS,iOS和tvOS系统界面的背景中所见)UIVisualEffectView(iOS / tvOS)类,它们自动匹配系统外观并提供高效的实时渲染。
    2. 使用AV Foundation处理视频
      可以使用AVVideoComposition对象在回放或导出期间将核心图像过滤器应用于视频的每个帧.
    3. 使用Core Image Context构建自己的工作流
      CIContext是管理大量资源和状态的重量级对象.反复创建和销毁上下文会产生很大的性能成本,因此在执行多个图像处理操作,尽早创建上下文并将其存储以供将来重用。
      有以下几种渲染方式可以参考:
      • 使用CIContext进行渲染:该方法非常适合于渲染已处理图像以导出到文件(例如,使用该writeJPEGRepresentationOfImage:toURL:colorSpace:options:error:方法)的任务。
      • 用Metal实时渲染:Metal框架提供对GPU的低开销访问,实现图形渲染和并行计算工作流的高性能.此类工作流程是图像处理不可或缺的一部分,因此Core Image尽可能在Metal上构建。
      • 使用OpenGL或OpenGL ES进行实时渲染:基于GPU的高性能渲染.
      • 使用Quartz 2D进行基于CPU的渲染:如果应用程序不需要实时渲染和绘制视图则使用CoreGraphics.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果不想使用CoreImage框架,也可以使用ZBarSDK来获取图片中二维码的定位。 1. 导入ZBarSDK: 在项目中导入ZBarSDK,并在需要使用的文件中引入头文件: ``` #import "ZBarSDK.h" ``` 2. 加载图片: ``` UIImage *image = [UIImage imageNamed:@"image.png"]; CGImageRef imageRef = image.CGImage; ``` 3. 创建ZBarImageScanner并设置识别类型: ``` ZBarImageScanner *scanner = [[ZBarImageScanner alloc] init]; [scanner setSymbology: ZBAR_QRCODE config: ZBAR_CFG_ENABLE to: 1]; ``` 4. 将图片转换为ZBarImage对象: ``` ZBarImage *zbarImage = [[ZBarImage alloc] initWithCGImage:imageRef]; ``` 5. 扫描二维码: ``` [scanner scanImage:zbarImage]; ``` 6. 遍历扫描结果,获取二维码定位: ``` for (ZBarSymbol *symbol in scanner.results) { NSArray *corners = symbol.bounds; // 获取定位四个角的坐标 // 在图像上绘制定位 UIGraphicsBeginImageContext(imageSize); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor); CGContextSetLineWidth(context, 2.0); CGContextMoveToPoint(context, corners[0].x, corners[0].y); CGContextAddLineToPoint(context, corners[1].x, corners[1].y); CGContextAddLineToPoint(context, corners[2].x, corners[2].y); CGContextAddLineToPoint(context, corners[3].x, corners[3].y); CGContextAddLineToPoint(context, corners[0].x, corners[0].y); CGContextStrokePath(context); UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } ``` 这样就可以在原图上绘制出二维码的定位了。需要注意的是,ZBarSDK是第三方框架,需要先在官网注册并获取授权才能使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值