初步学习CoreImage,我学习的博客点这里,首先映入我眼的就是CIImage了,他和UIImage长得好像,于是想到了UIImage的三种创建方式
这里拷贝一下我从博客看到的四种方式:
- 1.CIImage*image=[CIImage imageWithContentsOfURL:myURL];
- 2.CIImage*image=[CIImage imageWithData:myData];
- 3.CIImage*image=[CIImage imageWithCGImage:myCgimage];
- 4.CIImage*image=[CIImage imageWithCVPixelBuffer:CVBuffer];
第四种方式不明白,以后再说吧
关于CIImage的说明,学习博客这样说: CIImage是CoreImage框架中最基本代表图像的对象,他不仅包含元图像数据,还包含作用在原图像上的滤镜链。这里我想特别强调的是CIImage和其他图像是不同的,在CIImage被CIContext渲染出来之前,他是依赖于滤镜链的,滤镜是不会更改CIImage中的图像数据。这个需要正确理解,不然会给你的程序造成错误。说到了CIImage的不同,就必须得提一下如何创建CIImage了,CIImage是不能直接有UIImage转化而来的
反复看了几遍:我的总结如下:CIImage含两个东西——原图像数据和滤镜链,滤镜不会影响原图像数据,由于CIImage比UIImage多了一个滤镜链,所以他和UIImage不同。 如果我的理解有错,希望广大大神给我指点一二,谢谢!
CIFilter学习博客上说了好多,像我这种完全没接触过的菜鸟有点不想看,于是乎,看了另外一个博客:CIFilter的使用方法
前面直接跳过,来到基本的图像滤镜:这个博客讲滤镜的形成和显示讲的很通俗,适合我:以下是拷贝:
作为第一个尝试,我们先简单的让图像通过一个CIFilter 之后显示在屏幕上。每一次当我们想应用一个CIFilter的时候都要有以下四个步骤:
- 创建一个 CIImage 对象: CIImage 有如下的初始化方法: imageWithURL:, imageWithData:, imageWithCVPixelBuffer:, 和 imageWithBitmapData:bytesPerRow:size:format:colorSpace:。但是大多数时候你只会经常用到imageWithURL。
- 创建一个 CIContext: 一个 CIContext 可以是基于CPU或是GPU的。它可以被重用,所以你不用每次都创建一个。但是当输出CIImage对象的时候你至少一定会需要一个CIContext。
- 创建一个CIFilter: 当你创建滤镜的时候,你可以在上面配置一定数量的属性。具体的属性取决于你所要用的滤镜。
- 输出滤镜:这个滤镜会输出一个图像成为CIImage。 你可以用CIContext把它转化为一个UIImage
1.创建一个CIImage,这个太简单了
NSString *imageStr = [[NSBundle mainBundle] pathForResource:@"IMG_3705" ofType:@"jpg"];
NSData *data = [NSData dataWithContentsOfFile:imageStr];
CIImage *image = [CIImage imageWithData:data];
2.创建CIContext对象 (这个还一点都不了解,就直接拷贝从网上看的吧,搜索找到
这个)
// 第一种方式: CIContext构造函数的输入是一个NSDictionary。它规定了各种选项,包括颜色格式以及内容是否应该运行在CPU或是GPU上。对于这 个应用程序,默认值是可以用的。所以你只需要传入nil作为参数就好。
CIContext *context = [CIContext contextWithOptions:nil];
// 第二种方式: cpu 渲染
CIContext *cpuContext = [CIContext contextWithOptions:[NSDictionary dictionaryWithObjects:[NSNumber numberWithBool:YES] forKeys:kCIContextUseSoftwareRenderer]];
3.创建一个CIFilter对象,(由于已经知道CIFilter和滤镜效果有太大的关系了,所以他的参数的可变性必定很大,所以关于它必定是要重点研究的对象,所以~~,现在我不懂,先上网上解释的我看得最懂的一种吧)
// 一个CIFilter构造函数有两个输出,分别是滤镜的名字,还有规定了滤镜属性的键值和取值的字典。每一个滤镜会有他自己唯一个键值和一组有效的取值。CISepiaTone滤镜只能选两个值:KCIInputImageKey(一个CIImage)和@“inputIntensity”。后者是一个封装成NSNumber(用新的文字型语法)的浮点小数,取值在0-1之间。大部分的滤镜有默认值,只有CIImage是个例外。你必须提供一个值给它,因为它没有默认值
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" keysAndValues:kCIInputImageKey,image, @"inputIntensity",@0.8,nil];
// 这个滤镜会输出一个图像成为CIImage
CIImage *outputImage = [filter outputImage];
// 用CIContext把他转换成UIImage
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImage = [UIImage imageWithCGImage:cgimg];
写到这里应该就是写完了,有滤镜效果的图片已经得到了,写下来就显示在界面上了
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 100, 400, 265)];
imageView.image = newImage;
[self.view addSubview:imageView];
原图:
运行结果图: