GPUImage

概念:GPUImage是基于GUP图像和视频处理的开源iOS框架,支持多种图片处理滤镜,基于GPU的图像加速,所以支持照相机、摄像机的实时滤镜处理。

首先了解GPUImage的几个基本的概念:

- input 输入源
- ouput 输出源
- filter 滤镜

处理流程:GPUImageFilter是GPUImage里面重要的一个类,GPUImageFilter和响应链的其他元素实现了GPUImageInput协议,他们都可以提供纹理参与响应链,或者从响应链的前面接收并处理纹理。响应链的下一个对象是target,响应链可能有多个分支(添加多个targets)。

数据源需要实现GPUImageOutput接口,而后续各个环节(包括最后处理输出结果)的对象都要实现GPUImageInput接口。每个处理环节都是从上一个环节获取图像数据,进行处理后再将结果传递给下一个。下游的处理对象称为上一步的target。使用addTarget:方法为处理链路添加每个环节的对象。例如以下链条:
数据源:例如GPUImageVideoCamera或者GPUImageMovie,或GPUImageStillCamera,或GPUImagePicture

->各类filter

->GPUImageView

         GPUImage_第1张图片
如果需要将结果输出到文件,只要把上述流程中最末的GPUImageView改为一个GPUImageMovieWriter即可。

以上提到了输入源,输出源涉及到了另外一个比较重要的类:GPUImageFramebuffer,管理纹理缓存格式、帧缓存。

GPUImage是基于OpenGL ES的封装。图像在OpenGL ES中的表示是纹理,会在片元着色器里面进行像素级别的处理。
假设我们自定义一个OpenGL ES程序来处理图片,那么会有以下几个步骤:

1、初始化OpenGL ES环境,编译、链接顶点着色器和片元着色器;
2、缓存顶点、纹理坐标数据,传送图像数据到GPU;
3、绘制图元到特定的帧缓存;
4、在帧缓存取出绘制的图像。

GPUImageFilter 负责的是第一、二、三步。
GPUImageFramebuffer 负责是第四步。

案例1: 使用褐色滤镜(GPUImageSepiaFilter)对图片进行渲染

       渲染前:

  GPUImage_第2张图片      

渲染后:

 GPUImage_第3张图片

核心代码:

#import 
#import 

@interface ViewController ()
@property (nonatomic , strong) UIImageView* mImageView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImage *image = [UIImage imageNamed:@"face"];
    ///初始化滤镜
    GPUImageFilter *filter = [[GPUImageSepiaFilter alloc] init];
    ///设置要渲染的区域
    [filter forceProcessingAtSize: image.size];
    ///usingNextFrameForImageCapture代表着输出的结果会被用于获取图像
    [filter useNextFrameForImageCapture];
    ///获取数据源
    GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage: image];
    ///添加滤镜
    [stillImageSource addTarget:filter];
    ///开始渲染
    [stillImageSource processImage];
    ///从帧缓存里获取渲染后的图片
    UIImage *newImage = [filter imageFromCurrentFramebuffer];
    //加载出来
    UIImageView *imageView = [[UIImageView alloc] initWithImage:newImage];
    imageView.frame = self.view.bounds;
//    imageView.contentMode = UIViewContentModeScaleAspectFill;
    [self.view addSubview:imageView];
}

@end

 

你可能感兴趣的:(iOS)