/MetalImage

Metal 处理图像框架

Primary LanguageObjective-C

MetalImage Library

OverView

This library is highly inspired by famous library GPUImage && Colleague's OpenglESImage

一个基于苹果 Metal 搭建的图片处理库.用于实时镜头滤镜处理,图片效果处理等.

Usage

Base Filter

GPUImage 使用方法类似,基于滤镜链形式实现效果.

MIFilter *filter = [[MIFilter alloc]init];

//或者

MIFilter *filter = [[MIFilter alloc] initWithContentSize:Size];

MIFilter 是最基本的滤镜基类,使用者可以根据基类滤镜扩展所需要的自定义滤镜(库中包含了几个滤镜Filter可供使用).

ContentSize 与 OutputFrame

OutputFrameContentSize 的概念来源于上一级滤镜纹理大小与下一级滤镜画布大小,然后计算出 相对的顶点坐标 , 如上一级输出纹理(如摄像头),输出纹理比下一级初始化的画布要大,那么就将上一级纹理按比例缩小绘制到下一级画布大小上,可以通过调节 OutputFramexy 坐标计算 相对顶点坐标.默认是(0,0);意思就是以下一级画布左上角点开始绘制,相对比例画上去. 若 MIFilter 不指定 ContentSize 初始化, 则默认的画布大小(ContentSize) 为上一级纹理输出的大小.

Filter Chain

滤镜链使用与 GPUImage 相似

MIFilter *filterOne = [[MIFilter alloc]init];

MIFilter *filterTwo= [[MIFilter alloc]init];

[filterOne addConsumer:filterTwo];

Shader

MetalShader 语言与 OpenGLES 不一样,他是基于类 C++ 语言。 由于不是图像处理领域方面,库中很多算法都是参考网上,不做更多深究。

Shader 使用起来也是非常方便,只需要新建 Shader 的文件 xxx.metal , 在里面编写图像处理算法.新建一个继承与 MIFilter 的滤镜类,重写里面读取 Shader 方法:

+ (NSString *)vertexShaderFunction {
    static NSString *vFunction = @"此处写着色器中Vertex的Function名字";
    return vFunction;
}

+ (NSString *)fragmentShaderFunction {
    static NSString *fFunction = @"此处写着色器中Fragment的Function名字";
    return fFunction;
}

然后重写 - (void)setVertexFragmentBufferOrTexture:(id<MTLRenderCommandEncoder>)commandEncoder 方法,可自定义滤镜传入参数.

ToDo

  1. 添加更多滤镜效果
  2. 添加图片读取处理功能
  3. 添加视频录制写入功能
  4. 添加Demo