• swift学习之coreImage篇


           coreImage就是一个强大的框架,用这个框架我们可以通过调用简单的API使用框架所带的各种滤镜对图像进行处理,而不需要关心CPU/GPU等底层是如何对图像进行处理的。

           coreImage的三个核心类:CIFilter 滤镜;CIContext:创建上下文;CIImage:构建图像数据的模型对象 

           CIFilter:CIFilter是对图像数据进行处理的核心部分,我的理解是对指定的输入图像经过设置的参数进行一系列计算,然后组合成一个经过处理的输出图像数据,到目前(xcode6.0.2-beat 版,IOS8.0.2)为止,IOS自己带的有20个类型kCICategory,总计650种滤镜。只是指定滤镜类型而没有设置参数时,我们可以用setDefauts设置默认参数,滤镜就会根据默认参数对图像进行过滤处理。

          CIContext:Core Image通过CIContext来渲染CIFilter产生的对象。滤镜的输入inputImage输出outputImage图像数据都是CIImage,CIImage图像数据不能直接渲染在CPU上,只有当真正将要显示的时候,才会通过第三个对象去渲染。这个对象就是CIContext;CIContext在初始化的时候需要一个字典,可以通过kCIContextUseSoftwareRenderer创建一个基于CPU的CIContext对象,默认是创建基于GPU的CIContext对象,不同之处在于GPU的CIContext对象处理起来会更快但是不能后台处理,如果需要保存到相册的话,一般建议使用CPU处理,以保证图像处理过程中退出后台也能正常处理完,而基于CPU的CIContext对象除了支持更大的图像以外,还能在后台处理。

          CIImage:CIImage是一个模型对象,它保存能构建图像的数据,可以是图像的Data,可以是一个文件,也可以是CIFilter输出的对象。

    下面是核心代码:

           

           var beginImage = CIImage(image: image))//由UIImage创建一个CIImage;CIImage的创建方式有多种:CIImage(contenttsOfURL),CIImage(data:),CIImage(CGImage:),CIIMage(bitmapData:bytesPerRow:size:format:colorSpace:)等等。

            var filter:CIFilter = CIFilter(name: "CISepiaTone")//CIFilter的构造方法中包括了这个过滤器(CISepiaTone)的名字,还有一对用来描述过滤器的键值字典。每一个过滤器都有它自己的唯一键和值

            filter.setValue(beginImage, forKey: kCIInputImageKey)//设置过滤器的图片

            filter.setValue(0.5, forKey: kCIInputIntensityKey)//设置过滤器的图片透明度?

    //        self.changedImageview?.image = UIImage(CIImage:self.filter!.outputImage)//利用过滤器的outputImage属性导出经过过虑处理的图片 用CIImage直接转换成UIImage其实也使用了CIContext做转换,只不过是把我们手动处理的东西都封装起来了,但是每次都要新创建一个CIContext,而CIContext的创建是一个比较低效率的,而且比较耗内存,所以考虑到性能问题,我们直接用CIContext(CIContext可以重用,以提高性能)的createCGImage创建CGImage图像

            self.context = CIContext(options:[kCIContextUseSoftwareRenderer: true])//self.context = CIContext(options:nil)//options为空时 默认为GPU处理,options为[kCIContextUseSoftwareRenderer: true]时 创建一个CPU处理的CIContext上下文对象 

            let cgimg = self.context!.createCGImage(filter.outputImage, fromRect: filter.outputImage.extent())//createCGImage返回一个CGImage对象

            self.oriImgview!.image = UIImage(CGImage:cgimg!)

  • 相关阅读:
    在 .NET 3.5 中序列化和反序列化 JSON Kevin
    .NET 3.5 获取不全Cookie的问题 Kevin
    C#反序列化JSON数组对象 Kevin
    使用ConfigurationManager类 读写配置文件 Kevin
    C# post数据时 出现如下错误: System.Net.WebException: 远程服务器返回错误: (417) Expectation Failed 的解决办法 Kevin
    .NET 关于反序列化 JSON 对象数组的问题 Kevin
    为什么调用thread.Abort(),线程不会马上停止 Kevin
    vs2005调用迅雷完美解决方案 Kevin
    .NET 复杂的 DataBinding 接受 IList 或 IListSource 作为数据源 Kevin
    找不到DataContract属性! Kevin
  • 原文地址:https://www.cnblogs.com/yanyan1119/p/4030766.html
Copyright © 2020-2023  润新知