iOS通过CoreImage实现的简单滤镜效果

释放双眼,带上耳机,听听看~!

CoreImage是苹果提供的图形处理类库, 可以非常简便地实现滤镜等图片处理效果.

CGImageRef

CGImageRef是定义在QuartzCore.framework中的一个结构体指针:

typedef struct CGImage *CGImageRef;

该结构用于创建像素位图, 可通过操作存储的像素位来编辑图片.

使用CGImageRef进行图片截取

UIImage *originImage = [UIImage imageNamed:@"testImage"];
//转换成位图
CGImageRef imageRef = originImage.CGImage;
//截取图片
imageRef = CGImageCreateWithImageInRect(imageRef, CGRectMake(0, 0, 100, 100));
//生成新的图片
UIImage *retImage = [UIImage imageWithCGImage:imageRef];
//释放位图对象
CGImageRelease(imageRef);

CGImageRef还有很多其他的用法, 在此就不一一举例了.

CoreImage滤镜示例

需要引入QuartzCore.framework和CoreGraphics.framework.

    // 导入CIImage
CIImage *ciInputImage = [[CIImage alloc] initWithImage:self.originImage];
// 创建CIFilter
CIFilter *filterPixellate = [CIFilter filterWithName:@"CIPixellate"];
[filterPixellate setValue:ciInputImage forKey:kCIInputImageKey];
[filterPixellate setDefaults];
NSLog(@"filterPixellate : %@", filterPixellate.attributes);
// 获取滤镜效果之后的CIImage
CIImage *ciOutputImagePixellate = [filterPixellate valueForKey:kCIOutputImageKey];
// 使用CIContext将CI中的图片渲染出来为CGImageRef
CIContext *ciContext = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [ciContext createCGImage:ciOutputImagePixellate fromRect:[ciOutputImagePixellate extent]];
// 获取UIImage
_filteredImage = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
_filteredImageView.image = _filteredImage;

效果如下:
这里写图片描述

CoreImage多重滤镜效果

多重滤镜效果的实现, 只需要将之前滤镜的输出结果再次输入到下一个滤镜中即可.

    // 导入CIImage
CIImage *ciInputImage = [[CIImage alloc] initWithImage:self.originImage];
// 创建CIFilter
CIFilter *filterPixellate = [CIFilter filterWithName:@"CIPixellate"];
[filterPixellate setValue:ciInputImage forKey:kCIInputImageKey];
[filterPixellate setDefaults];
NSLog(@"filterPixellate : %@", filterPixellate.attributes);
// 获取滤镜效果之后的CIImage
CIImage *ciOutputImagePixellate = (CIImage *)[filterPixellate valueForKey:kCIOutputImageKey];
// 滤镜可以叠加, 上一个滤镜的输出作为下一个滤镜的输入
CIFilter *filterSepiaTone = [CIFilter filterWithName:@"CISepiaTone"];
[filterSepiaTone setValue:ciOutputImagePixellate forKey:kCIInputImageKey];
[filterSepiaTone setDefaults];
NSLog(@"filterSepiaTone : %@", filterSepiaTone.attributes);
CIImage *ciOutputImageSepiaTone = [filterSepiaTone outputImage];
// 使用CIContext将CI中的图片渲染出来为CGImageRef
CIContext *ciContext = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [ciContext createCGImage:ciOutputImageSepiaTone fromRect:[ciOutputImageSepiaTone extent]];
// 获取UIImage
_filteredImage = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
_filteredImageView.image = _filteredImage;

此时的滤镜处理过程就能感受到明显的卡顿, 说明CoreImage的处理效率还不是非常理想.
效果如图:
这里写图片描述

Demo

Demo地址: DemoImageFilter

人已赞赏
iOS文章

iOS通过CPU实现的简单滤镜效果

2020-4-17 15:33:10

iOS文章

iOS音频编程之实时语音通信(对讲机功能)

2020-4-17 21:48:01

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索