CoreImage的初步学习—

初步学习CoreImage,我学习的博客点这里,首先映入我眼的就是CIImage了,他和UIImage长得好像,于是想到了UIImage的三种创建方式

这里拷贝一下我从博客看到的四种方式:

  1. 1.CIImage*image=[CIImage imageWithContentsOfURL:myURL];  
  2. 2.CIImage*image=[CIImage imageWithData:myData];  
  3. 3.CIImage*image=[CIImage imageWithCGImage:myCgimage];  
  4. 4.CIImage*image=[CIImage imageWithCVPixelBuffer:CVBuffer];  
前面两种创建方式和UIImag相同,第三种UIImage也有,跟的参数其实是uiImage(UIImage对象).CGImage

第四种方式不明白,以后再说吧

关于CIImage的说明,学习博客这样说: CIImage是CoreImage框架中最基本代表图像的对象,他不仅包含元图像数据,还包含作用在原图像上的滤镜链。这里我想特别强调的是CIImage和其他图像是不同的,在CIImage被CIContext渲染出来之前,他是依赖于滤镜链的,滤镜是不会更改CIImage中的图像数据。这个需要正确理解,不然会给你的程序造成错误。说到了CIImage的不同,就必须得提一下如何创建CIImage了,CIImage是不能直接有UIImage转化而来的

反复看了几遍:我的总结如下:CIImage含两个东西——原图像数据和滤镜链,滤镜不会影响原图像数据,由于CIImage比UIImage多了一个滤镜链,所以他和UIImage不同。      如果我的理解有错,希望广大大神给我指点一二,谢谢!

CIFilter学习博客上说了好多,像我这种完全没接触过的菜鸟有点不想看,于是乎,看了另外一个博客:CIFilter的使用方法

前面直接跳过,来到基本的图像滤镜:这个博客讲滤镜的形成和显示讲的很通俗,适合我:以下是拷贝:

作为第一个尝试,我们先简单的让图像通过一个CIFilter 之后显示在屏幕上。每一次当我们想应用一个CIFilter的时候都要有以下四个步骤:

  1. 创建一个 CIImage 对象: CIImage 有如下的初始化方法: imageWithURL:, imageWithData:, imageWithCVPixelBuffer:, 和 imageWithBitmapData:bytesPerRow:size:format:colorSpace:。但是大多数时候你只会经常用到imageWithURL。
  2. 创建一个 CIContext: 一个 CIContext 可以是基于CPU或是GPU的。它可以被重用,所以你不用每次都创建一个。但是当输出CIImage对象的时候你至少一定会需要一个CIContext。
  3. 创建一个CIFilter: 当你创建滤镜的时候,你可以在上面配置一定数量的属性。具体的属性取决于你所要用的滤镜。
  4. 输出滤镜:这个滤镜会输出一个图像成为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];
    


写到这里我知道,这个CISepiaTone就是一种滤镜效果,并且他还有一大堆兄弟,并且肯定有一种方法可以查到所有兄弟以及他们对应的键值和有效的取值,这个先留在这里,有机会今天另开一个文章写,或者明天写

4.输出滤镜
 // 这个滤镜会输出一个图像成为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];
    

原图:                                                                 

运行结果图:





























  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值