首页 > 代码库 > iOS CoreImage/图片模糊处理(一)

iOS CoreImage/图片模糊处理(一)

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>

我们可以先创建一个CIImage对象

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>


5. 通过上下文来创建一块CGImageRef

<span style="font-size:14px;">CGImageRef ref = [context createCGImage:outputImage fromRect:[outputImage extent]];</span>

6. 将ref转成UIImage对象

<span style="font-size:14px;">    UIImage *newImage = [UIImage imageWithCGImage:ref];</span>

7. 释放内存

<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>


这样就可以了。



iOS CoreImage/图片模糊处理(一)