学习Swift中的CoreImage(图形核心编程)

Core Image是一个可以让你轻松使用图形过虑器的强力框架。在这里你几乎可以获得所有不同种类的效果,比如修改图像饱和度,色彩范围,亮度等。它甚至也可以利用CPU或者GPU来处理图像数据并且它的速度很快,快到可以对视频进行实时处理。Core Image过滤器也可以把图像或者视频的多重效果同时串在一起。多重的过滤器会被合并为一个单独的过滤器来应用到图像中。相对于同时处理多个不同效果来说这样
摘要由CSDN通过智能技术生成

Core Image是一个可以让你轻松使用图形过虑器的强力框架。在这里你几乎可以获得所有不同种类的效果,比如修改图像饱和度,色彩范围,亮度等。它甚至也可以利用CPU或者GPU来处理图像数据并且它的速度很快,快到可以对视频进行实时处理。

Core Image过滤器也可以把图像或者视频的多重效果同时串在一起。多重的过滤器会被合并为一个单独的过滤器来应用到图像中。相对于同时处理多个不同效果来说这样做更有效率。

在本教程中,你将会获得关于CoreImage的实践经验。你将会学会一些不同的效果,并且你将会明白将物效实时应用到图像是多么的容易。

提示:在撰写本教程的时候,据我们了解由于Xcdoe6和iOS8仍然还在beta测试阶段,所以关于它们的截图不能上传。因此,在我们确认可以上传前,是不会出现关于它们的截图的。

开始学习

在开始学习前,让我们先讨论下在CoreImage框架中比较重要的一些类:

·CIContext:所有的图像处理都在一个CIContext类中完成。它和CoreGraphics或者OpenGL环境比较相似。

·CIImage:这个类中保存着图像的数据。它可以使用UIImage对象,一个图像文件,或者像素数据来进行创建。

·CIFilter:该类中存在一个字典,存储定义了它所描述具体特效的各种属性。比如饱和度,颜色亮度,载切等等。

在本教程中以上的每个类你都将会使用的到。

创建项目CoreImageFun

打开Xcode使用iOS中Application下的Single View Application模板创建一个新的项目工程。使用CoreImageFun作为项目名称,选择Iphone作为默认设备,确认当前的使用语言选择的为Swift.

下载本教程的资源,把这里的image.png添加到你的工程中。

下一步,打开Main.storyboard,然后拖动并添加一个新的图像视图作为现有视图的子视图。在属性面板中,设置图像视图的显示模式为(Aspect Fit)恢复拉伸,这就就不会使图像失帧了。

下一步,确保视图大纲可见(在视图界面的左下方有一个小按钮),你可以在菜单Editor中的Show Document Outline进行设定。

鼠标右键点击图像视图并拖曳到父视图三次,并添加下面3条限定:

1:添加Top Space to Layout Guide限定,如果需要的话可以使用尺寸检查器来设定限定的大小为0。

2:添加Center Horizontally限定,也设定为0。

3:添Equal Width 限定。

最后,为了限定图像视图的高度,点击鼠标右键在图像视图中拖动,并添加Aspect Ratio限定,使用尺寸检查器将宽和高的比率为定为8:5,将值设置为0。最后,点击菜单Editor下的Resolve Auto Layout 下的All Views in View Controller 下的Update Frames,然后布局会按钮刚才的设定生效。

下一步,打开Assistant Editor,请确保当前视图显示的为ViewController.swift。鼠标右键点击视图拖动到刚才打开的ViewController类中。命名为imageView,点击connect按钮。

编译并运行项目,确定到目前为止一切都是正常的,运行起来后你应当看到一个没有任何内容的屏幕显示。初始化工作完成,现在开始CoreImage!

基础的图像过滤

你即将会把一张带有简单CIFilter效果的图像显示到屏幕上来了。每当你想在图像上使用CIFilter前都需要经过下面4步:

1:创建CIImage对象。CIIMage有好几种初始化方法,有:CIImage(contenttsOfURL),CIImage(data:),CIImage(CGImage:),CIIMage(bitmapData:bytesPerRow:size:format:colorSpace:)等等。大多数情况下,都会使用CIIMage(contentsOfURL:),大多数情况下。

2:创建CIContext.CIContext是使用CPU或者GPU的基础。CIContext创建起来相对比较低效,所以重复使用比一次次的创建更好。你经常会使用到它当输出CIImage对象的时候。

3:创建CIFilter.当你创建它的时候,你需要配置一个依赖于你所使用的CIFilter数字类型的属性。

4:获得filter的输出。filter会将输出对象转换为CIImage,你可以使用CIContext把它转换为UIImage,就像下面这样.

让我们来看一下它是如何工作的。把下面的代码添加到ViewController.swift的viewDidLoad()方法中:

// 1

let fileURL = NSBundle.mainBundle().URLForResource("image", withExtension: "png")



// 2

let beginImage = CIImage(contentsOfURL: fileURL)



// 3

let filter = CIFilter(name: "CISepiaTone")

filter.setValue(beginImage, forKey: kCIInputImageKey)

filter.setValue(0.5, forKey: kCIInputIntensityKey)



// 4

let newImage = UIImage(CIImage: filter.outputImage)

self.imageView.image = newImage

根据编号来逐条解释下:

1.这一行代码创建了一个NSURL对象,存储了你所使用的图像路径。

2.下一步,使用CIImage(contentsOfURL:)构造方法创建了一个CIImage对象。

3:下一步,创建CIFilter对象。CIFilter的构造方法中包括了这个过滤器的名字,还有一对用来描述过滤器的键值字典。每一个过滤器都有它自己的唯一键和值。CISepiaTone过滤器只有2个值,KCIInputImageKey和kCIInputIntensityKey,是0~1之前的浮点类型。这里设定的值为0.5。大多数过滤器如果没有设定都会使用默认的值。例外的是CIImage,必须要指定一个值。

4:使用outputImage属性会很容易的从过滤器中获得一个CIImage。一但你有了CIImage,你就需要将它转换为UIImage对象。UIImage(CIImage:)构造方法可以使用CIImage来创建一个UIImage。转换为UIImage对象后,你只需要尽早的将它显示到视图中。

编译并运行项目,你将会看到使用sepiaTone filter效果创建的图像。

恭喜,你现在已经学会使用CIImage和CIFilters了!

使用Context创建图像

在你继续之前,你应该了解下这样的一个优化建议。

前面我曾提到过,你需要使用一个CIContext对象来创建使用CIFilter,但到目前为止还未提及过它。这表明,UIImage(CIImage:)的构造方法已经把这些工作都完成了。它自动创建了一个CIContext对象并将它应用到filter.它使得使用Core Image API变得很容易。

但是它有一个不好的地方-每次在使用它的时候,它都会重新创建一个CIContext对象。CIContext实例意味着可重用性将大大性能。如果你相使用一个滑动条来更新filter的值,就像在本教程中之前的方法,每次更新都创建一个新的CIContext对象会使性能大大下降。

让我们适当的修改一下。删除之前在viewDidLoad()的第四步代码,使用如下代码进行替换:

//1

let context = CIcontext(options:nil)



//2

let cgimg = context.createCGImage(filter.outputImage,formRect:filter.outputimage.extend())



//3

let newImage = UIImage(CGImage:cgimg)

self.imageView.image = newImage

同样的,让我们一行一行的来看下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值