CoreImage 是从 iOS5.0开始引入,其功能强大不由惊叹。
不管是扫一扫,生成二维码,人脸识别,图片压缩,滤镜等处理,应有竟有。
图片模糊是从6.0开始支持,下面我们从一个简单的例子看起。
首先介绍一个对象 : CIImage 不是 UIImage。
CIImage是CoreImage中的图片对象。
常用的创建的方式是
<span style="font-size:14px;">+ (CIImage *)imageWithContentsOfURL:(NSURL *)url; + (CIImage *)imageWithContentsOfURL:(NSURL *)url options:(NSDictionary *)d; + (CIImage *)imageWithData:(NSData *)data; + (CIImage *)imageWithData:(NSData *)data options:(NSDictionary *)d;</span>
1. 首先你导入1.Jpg文件到工程里。然后引入资源路径
<span style="font-size:14px;"> CIImage *beginImage = [CIImage imageWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"1.jpg" withExtension:nil]];</span>2. 创建一个CIContext上下文
<span style="font-size:14px;"> CIContext *context = [CIContext contextWithOptions:nil];</span>3. 创建一个滤镜
CIFilter 是滤镜对象,需要传入一个滤镜名。( 滤镜名有近百种 )。kCIInputImageKey 是指输入图像的关键
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur" keysAndValues:kCIInputImageKey,beginImage, nil];
4. 获取输出的图片
<span style="font-size:14px;"> CIImage *outputImage = [filter outputImage];</span>
<span style="font-size:14px;">CGImageRef ref = [context createCGImage:outputImage fromRect:[outputImage extent]];</span>
<span style="font-size:14px;"> UIImage *newImage = [UIImage imageWithCGImage:ref];</span>
<span style="font-size:14px;">CGImageRelease(ref);</span>
如果创建CIContext 多的话,会很消耗内存。
所以,一般我建议将 CIContext\CIFiter 对象做成属性来引用。
这样就可以了。
假设我们需要有一个Slider要设置图片的模糊量。
---- 滑动改变图片的透明度
Slider 改变Value的时候去改变透明度<span style="font-size:14px;">[self.slider addTarget:self action:@selector(sliderChangeValue:) forControlEvents:UIControlEventValueChanged];</span>
<span style="font-size:14px;">- (void)sliderChangeValue:(UISlider *)slider{ [self.filter setValue:self.beginImage forKeyPath:kCIInputImageKey]; [self.filter setValue:[NSNumber numberWithFloat:slider.value * 10] forKey:@"inputRadius"]; // 得到过滤后的图片 CIImage *outputImage = [self.filter outputImage]; // 转换图片 CGImageRef cgimg = [self.context createCGImage:outputImage fromRect:[outputImage extent]]; UIImage *newImg = [UIImage imageWithCGImage:cgimg]; // 显示图片 [self.imageV setImage:newImg]; // 释放C对象 CGImageRelease(cgimg); }</span>
这样就可以了。
原文地址:http://blog.csdn.net/meters_l/article/details/42293125