博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS-CoreImage简单使用
阅读量:5985 次
发布时间:2019-06-20

本文共 1991 字,大约阅读时间需要 6 分钟。

CoreImage是一个图像框架,它基于OpenGL顶层创建,底层则用着色器来处理图像,这意味着它利用了GPU基于硬件加速来处理图像。 CoreImage中有很多滤镜,它们能够一次给予一张图像或者视频帧多种视觉效果。而且滤镜可以连接起来组成一个滤镜链,把滤镜效果叠加起来处理图像。

CoreImage框架最常用的类:

* CIImage

保存图像数据的类,可以通过UIImage,图像文件或者像素数据来创建,包括未处理的像素数据如:

- imageWithCVPixelBuffer:

- imageWithData:

方法等等。

也可以通过图像数据类比如UIImage,CGImageRef等等。

* CIFilter

滤镜类,这个框架中对图片属性进行细节处理的类。它对所有的像素进行操作,用一些键-值设置来决定具体操作的程度。

* CIContext

上下文类,如CoreGraphics以及CoreData中的上下文用于处理绘制渲染以及处理托管对象一样,CoreImage的上下文也是实现对图像处理的具体对象。

这里需要注意的是在Context创建的时候,我们需要给它设定为是基于GPU还是CPU。(这里使用GPU)

基于GPU的话,处理速度更快,因为利用了GPU硬件的并行优势。但是GPU受限于硬件纹理尺寸,而且如果你的程序在后台继续处理和保存图片的话,那么需要使用CPU,因为当app切换到后台状态时GPU处理会被打断。

 

使用步骤:

0.导入CIImage图片

    CIImage *ciImage = [[CIImage alloc]initWithImage:[UIImage imageNamed:
@"
test.jpg
"]];

1.创建出Filter滤镜

    CIFilter *filterOne = [CIFilter filterWithName:
@"
CIPixellate
"];
    [filterOne setValue:ciImage forKey:kCIInputImageKey];
    [filterOne setDefaults];
    CIImage *outImage = [filterOne valueForKey:kCIOutputImageKey];

2.用CIContext将滤镜中的图片渲染出来

    CIContext *context = [CIContext contextWithOptions:nil];
    
    CGImageRef cgImage = [context createCGImage:outImage fromRect:[outImage extent]];

3.导出图片

    UIImage *showImage = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);

4.加载图片

   _image.image = showImage;

 

 如果要使用组合滤镜

在步骤1中设置组合滤镜,只需要将上一个滤镜的输出变为下一个滤镜的输入就行了

   
//
第一个滤镜
    CIFilter *filterOne = [CIFilter filterWithName:
@"
CIPixellate
"];
    [filterOne setValue:ciImage forKey:kCIInputImageKey];
    [filterOne setDefaults];
    CIImage *outImage = [filterOne valueForKey:kCIOutputImageKey];
    
//
第二个滤镜
    CIFilter *filterTwo = [CIFilter filterWithName:
@"
CIHueAdjust
"];
    [filterTwo setValue:outImage forKey:kCIInputImageKey];
    [filterTwo setDefaults];
    [filterTwo setValue:@(
1.f) forKey:kCIInputAngleKey];
    CIImage *outputImage = [filterTwo valueForKey:kCIOutputImageKey];

 记住渲染的时候,步骤2,要将最后输出的CIImage传入

 

    CIContext *context = [CIContext contextWithOptions:nil];
    
    CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outImage extent]];

转载于:https://www.cnblogs.com/hxwj/p/4663225.html

你可能感兴趣的文章
Weex开发系列(一):初识Weex
查看>>
开源 UI 库中,唯一同时实现了大表格虚拟化和树表格的 Table 组件
查看>>
找到思聪王
查看>>
[译] 学习 Spring Security(五):重发验证邮件
查看>>
快速的React Native开发方法
查看>>
rabbitmq中文教程python版 - 工作队列
查看>>
SpringBoot 1024行代码 - Eureka Server
查看>>
服务器时区问题
查看>>
JAVA反射技术应用-ReflectUtil
查看>>
removeGeneratedClassFiles Failed
查看>>
nagios安装全攻略
查看>>
Perl进阶知识点(2)
查看>>
Android adb.exe 启动失败
查看>>
我的友情链接
查看>>
使用JavaMail完成邮件的编写
查看>>
Xcode8修改或者新建的XIB文件 xcode7上报错问题
查看>>
MSSQL获取昨天,本周,本月。。。
查看>>
记录:我的大学的最后时光(大三下学期 _11
查看>>
标签使用 struts2
查看>>
windows下如何查看80端口被哪个服务占用了
查看>>