Brad Larson
http://www.sunsetlakesoftware.com
contact@sunsetlakesoftware.com
GPUImage 2 是 GPUImage 框架的第二代产品,该框架是一个开源项目,用于在 Mac、iOS 以及现在的 Linux 上执行 GPU 加速的图像和视频处理。 最初的 GPUImage 框架是用 Objective-C 编写的,目标是 Mac 和 iOS,但这个最新版本完全用 Swift 编写,并且还可以面向 Linux 和未来支持 Swift 代码的平台。
该框架的目标是尽可能轻松地设置并执行针对图像或视频源的实时视频处理或机器视觉。 通过依靠 GPU 来运行这些操作,与受 CPU 限制的代码相比,可以实现 100 倍或更高的性能提升。 这在移动或嵌入式设备中尤其明显。 在 iPhone 4S 上,该框架可以轻松地以超过 60 FPS 的速度处理 1080p 视频。 在 Raspberry Pi 3 上,它可以以超过 20 FPS 的速度对实时 720p 视频执行 Sobel 边缘检测。
BSD 风格,完整许可证位于框架中的 License.txt 文件中。
目前,GPUImage 使用 Lode Vandevenne 的 LodePNG 在 Linux 上进行 PNG 输出,以及 Paul Hudson 的 SwiftGD 进行图像加载。 lodepng 在 zlib 许可证下发布,而 SwiftGD 在 MIT 许可证下发布。
该框架依赖于处理管道的概念,其中图像源针对图像消费者,依此类推,直到图像输出到屏幕、图像文件、原始数据或录制的电影。 摄像头、电影、静态图像和原始数据都可以作为此管道的输入。 可以通过一系列较小的操作的组合来构建任意复杂的处理操作。
这是一个面向对象的框架,其中类封装了输入、处理操作和输出。 处理操作使用 Open GL (ES) 顶点和片段着色器在 GPU 上执行其图像操作。
以下显示了在常见应用程序中使用该框架的示例。
要将 GPUImage 框架添加到您的 Mac 或 iOS 应用程序,可以将 GPUImage.xcodeproj 项目拖到应用程序的项目中,或者通过“文件 | 添加文件到...”添加它。
之后,转到项目的“构建阶段”,并将 GPUImage_iOS 或 GPUImage_macOS 添加为“目标依赖项”。 将其添加到“链接二进制文件与库”阶段。 添加一个新的“拷贝文件”构建阶段,将其目标设置为“Frameworks”,并将上面的 GPUImage.framework(适用于 Mac)或下面的 GPUImage.framework(适用于 iOS)添加到其中。 最后一步将确保框架部署在您的应用程序捆绑包中。
在引用 GPUImage 类的任何 Swift 文件中,只需添加
import GPUImage
您应该可以开始了。
请注意,您可能需要构建您的项目一次,以解析和构建 GPUImage 框架,以便 Xcode 停止警告您有关框架及其类丢失的信息。
此项目支持 Swift Package Manager,因此您应该能够像下面这样在 Package.swift 文件中将其添加为依赖项
.package(url: "https://github.com/BradLarson/GPUImage2.git", from: "0.0.1"),
以及一个
import GPUImage
在您的应用程序代码中。
在编译框架之前,您需要在您的系统上启动并运行 Swift。 对于桌面 Ubuntu 安装,您可以按照 Apple 在 他们的下载页面上的指南进行操作。
在 Swift 之后,您需要安装 Video4Linux 以访问标准 USB 网络摄像头作为输入
sudo apt-get install libv4l-dev
在 Raspberry Pi 上,您需要确保安装了 Broadcom Videocore 标头和库才能访问 GPU
sudo apt-get install libraspberrypi-dev
对于桌面 Linux 和其他 OpenGL 设备(Jetson 系列),您需要确保安装了 GLUT 和 OpenGL 标头。 该框架当前使用 GLUT 进行输出。 GLUT 可以在 Raspberry Pi 上通过新的实验性 OpenGL 支持来使用,但我发现它比使用 OpenGL ES API 和 Pi 附带的 Videocore 接口慢得多。 此外,如果您启用 OpenGL 支持,您目前将无法使用 Videocore 接口。
设置好所有这些后,您可以使用
swift build
在主 GPUImage 目录中构建框架,或者在 examples/Linux-OpenGL/SimpleVideoFilter 目录中执行相同的操作。 这将构建一个示例应用程序,该应用程序从 USB 摄像头过滤实时视频并将结果实时显示到屏幕上。 应用程序本身将包含在 .build 目录及其特定于平台的子目录中。 查找 SimpleVideoFilter 二进制文件并运行它。
要过滤来自 Mac 或 iOS 摄像头的实时视频,您可以编写如下代码
do {
camera = try Camera(sessionPreset:AVCaptureSessionPreset640x480)
filter = SaturationAdjustment()
camera --> filter --> renderView
camera.startCapture()
} catch {
fatalError("Could not initialize rendering pipeline: \(error)")
}
其中 renderView 是您放置在视图层次结构中的某个位置的 RenderView 的实例。 上面实例化了一个 640x480 摄像头实例,创建了一个饱和度滤镜,并将摄像头帧定向到通过饱和度滤镜进行处理,然后显示到屏幕上。 startCapture() 启动摄像头捕获过程。
--> 运算符将图像源链接到图像消费者,并且其中许多可以在同一行中链接。
功能尚未完成。
(当前在 Linux 上不可用。)
要从实时视频中捕获静止图像,您需要设置一个回调,以便在处理的下一个视频帧上执行。 最简单的方法是使用便利扩展来捕获、编码并将文件保存到磁盘
filter.saveNextFrameToURL(url, format:.PNG)
在底层,这会创建一个 PictureOutput 实例,将其作为目标附加到您的滤镜,将 PictureOutput 的 encodedImageFormat 设置为 PNG 文件,并将 encodedImageAvailableCallback 设置为一个闭包,该闭包接收过滤后的图像的数据并将其保存到 URL。
您可以手动设置此设置以获取编码的图像数据(作为 NSData)
let pictureOutput = PictureOutput()
pictureOutput.encodedImageFormat = .JPEG
pictureOutput.encodedImageAvailableCallback = {imageData in
// Do something with the NSData
}
filter --> pictureOutput
您还可以通过设置 imageAvailableCallback 以平台原生格式(NSImage、UIImage)获取过滤后的图像
let pictureOutput = PictureOutput()
pictureOutput.encodedImageFormat = .JPEG
pictureOutput.imageAvailableCallback = {image in
// Do something with the image
}
filter --> pictureOutput
(当前在 Linux 上不可用。)
有几种不同的方法来处理图像过滤。 最简单的方法是 UIImage 或 NSImage 的便利扩展,它允许您过滤该图像并返回 UIImage 或 NSImage
let testImage = UIImage(named:"WID-small.jpg")!
let toonFilter = SmoothToonFilter()
let filteredImage = testImage.filterWithOperation(toonFilter)
对于更复杂的管道
let testImage = UIImage(named:"WID-small.jpg")!
let toonFilter = SmoothToonFilter()
let luminanceFilter = Luminance()
let filteredImage = testImage.filterWithPipeline{input, output in
input --> toonFilter --> luminanceFilter --> output
}
一个警告:如果您想在屏幕上显示图像或重复过滤图像,请不要使用这些方法。 来回 Core Graphics 会增加很多开销。 相反,我建议手动设置管道并将其定向到 RenderView 以进行显示,以便将所有内容保留在 GPU 上。
这两种便利方法都包装了多个操作。 要将图片输入到滤镜管道中,您可以实例化一个 PictureInput。 要从管道中捕获图片,您可以使用 PictureOutput。 要手动设置图像处理,您可以使用如下所示的内容
let toonFilter = SmoothToonFilter()
let testImage = UIImage(named:"WID-small.jpg")!
let pictureInput = PictureInput(image:testImage)
let pictureOutput = PictureOutput()
pictureOutput.imageAvailableCallback = {image in
// Do something with image
}
pictureInput --> toonFilter --> pictureOutput
pictureInput.processImage(synchronously:true)
在上面的代码中,imageAvailableCallback 将在 processImage() 行立即触发。 如果您希望异步完成图像处理,请在上面的代码中省略 synchronously 参数。
要过滤现有的电影文件,您可以编写如下代码
do {
let bundleURL = Bundle.main.resourceURL!
let movieURL = URL(string:"sample_iPod.m4v", relativeTo:bundleURL)!
movie = try MovieInput(url:movieURL, playAtActualSpeed:true)
filter = SaturationAdjustment()
movie --> filter --> renderView
movie.start()
} catch {
fatalError("Could not initialize rendering pipeline: \(error)")
}
其中 renderView 是您放置在视图层次结构中的某个位置的 RenderView 的实例。 上面从应用程序的捆绑包中加载名为 "sample_iPod.m4v" 的电影,创建一个饱和度滤镜,并将电影帧定向到通过饱和度滤镜进行处理,然后显示到屏幕上。 start() 启动电影播放。
该框架使用一系列协议来定义可以输出要处理的图像、接收图像进行处理或同时执行这两者的类型。 这些分别是 ImageSource、ImageConsumer 和 ImageProcessingOperation 协议。 任何类型都可以遵守这些协议,但通常使用类。
许多常见的滤镜和其他图像处理操作可以描述为 BasicOperation 类的子类。 BasicOperation 提供了从一个或多个输入中获取图像帧、使用指定的着色器程序从这些输入渲染矩形图像(四边形)并将该图像提供给其所有目标所需的许多内部代码。 BasicOperation 的变体(例如 TextureSamplingOperation 或 TwoStageOperation)为着色器程序提供了某些类型的操作可能需要的其他信息。
要构建一个简单的一输入滤镜,您甚至可能不需要创建自己的子类。 您所需要做的就是在实例化 BasicOperation 时提供一个片段着色器和所需的输入数量
let myFilter = BasicOperation(fragmentShaderFile:MyFilterFragmentShaderURL, numberOfInputs:1)
着色器程序由匹配的顶点和片段着色器组成,这些着色器被编译并链接在一起形成一个程序。 默认情况下,该框架使用一系列基于输入图像数量的库存顶点着色器来输入到操作中。 通常,您只需要提供用于执行过滤或其他处理的自定义片段着色器。
GPUImage 使用的片段着色器如下所示
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform lowp float gamma;
void main()
{
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
gl_FragColor = vec4(pow(textureColor.rgb, vec3(gamma)), textureColor.w);
}
纹理坐标的命名约定是 textureCoordinate、textureCoordinate2 等作为 varyings 从顶点着色器提供。 inputImageTexture、inputImageTexture2 等是表示传递到着色器程序的每个图像的纹理。 可以定义 Uniforms 来控制您正在运行的任何着色器的属性。 您需要提供两个片段着色器,一个用于具有精度限定符的 OpenGL ES,另一个用于没有精度限定符的 OpenGL。
在框架内部,一个自定义脚本将这些着色器文件转换为内联字符串常量,以便将它们与编译后的框架捆绑在一起。 如果你向框架添加新的操作,你需要运行
./ShaderConverter.sh *
在 Operations/Shaders 目录下,以更新这些内联常量。
如果你希望将一系列操作分组为一个单元来传递,你可以创建一个 OperationGroup 的新实例。OperationGroup 提供了一个 configureGroup 属性,该属性接受一个闭包,该闭包指定应如何配置组
let boxBlur = BoxBlur()
let contrast = ContrastAdjustment()
let myGroup = OperationGroup()
myGroup.configureGroup{input, output in
input --> self.boxBlur --> self.contrast --> output
}
传入 OperationGroup 的帧由上述闭包中的输入表示,而从整个组输出的帧由输出表示。 设置完成后,上面的 myGroup 将像任何其他操作一样显示,即使它由多个子操作组成。 然后,可以将此组像单个操作一样传递或使用。
GPUImage 可以分别通过使用 TextureOutput 和 TextureInput 类从 OpenGL (ES) 导出和导入纹理。 这使你可以从渲染到具有绑定纹理的帧缓冲区对象的 OpenGL 场景录制电影,或过滤视频或图像,然后将其作为纹理馈送到 OpenGL 中以在场景中显示。
这种方法的一个注意事项是,这些过程中使用的纹理必须通过共享组或类似的东西在 GPUImage 的 OpenGL (ES) 上下文与任何其他上下文之间共享。
该框架使用几种平台无关的类型来表示常用值。 通常,浮点输入以 Floats 的形式接收。 大小使用 Size 类型指定(通过使用宽度和高度初始化来构造)。 颜色通过 Color 类型处理,你需要为红色、绿色、蓝色以及可选的 alpha 分量提供归一化到 1.0 的颜色值。
可以在 2-D 和 3-D 坐标中提供位置。 如果仅通过指定 X 和 Y 值来创建 Position,它将被处理为 2-D 点。 如果还提供了可选的 Z 坐标,它将被视为 3-D 点。
矩阵有 Matrix3x3 和 Matrix4x4 两种类型。 这些矩阵可以使用浮点数的行优先数组构建,或者(在 Mac 和 iOS 上)可以从 CATransform3D 或 CGAffineTransform 结构初始化。
目前,框架中内置了 100 多个操作,分为以下几类
SolidColorGenerator:这会输出具有纯色的生成图像。 你需要在初始化时定义图像大小。
CircleGenerator:这会输出一个圆的生成图像,用于遮罩。 renderCircleOfRadius() 方法允许你指定半径、中心、圆的颜色和背景颜色。
CrosshairGenerator:这会输出一个十字线的生成图像,用于遮罩。 renderCrosshairs() 接收一系列归一化坐标,并在这些坐标处绘制十字线。
BrightnessAdjustment:调整图像的亮度
ExposureAdjustment:调整图像的曝光
ContrastAdjustment:调整图像的对比度
SaturationAdjustment:调整图像的饱和度
GammaAdjustment:调整图像的 gamma 值
LevelsAdjustment:类似于 Photoshop 的色阶调整。 minimum、middle、maximum、minOutput 和 maxOutput 参数是范围 [0, 1] 中的浮点数。 如果你有 Photoshop 中范围 [0, 255] 中的参数,则必须首先将它们转换为 [0, 1]。 gamma/mid 参数是一个 >= 0 的浮点数。这与 Photoshop 中的值匹配。 如果你想将色阶应用于 RGB 以及单个通道,你需要使用此滤镜两次 - 第一次用于单个通道,然后用于所有通道。
ColorMatrixFilter:通过将矩阵应用于图像颜色来转换图像的颜色
RGBAdjustment:调整图像的各个 RGB 通道
HueAdjustment:调整图像的色调
WhiteBalance:调整图像的白平衡。
HighlightsAndShadows:调整图像的阴影和高光
LookupFilter:使用 RGB 颜色查找图像来重新映射图像中的颜色。 首先,使用你最喜欢的照片编辑应用程序将滤镜应用于 framework/Operations/LookupImages 中的 lookup.png。 为了使其正常工作,每个像素的颜色不得依赖于其他像素(例如,模糊不起作用)。 如果你需要更复杂的滤镜,你可以创建所需数量的查找表。 准备就绪后,使用你的新 lookup.png 文件作为 PictureInput 的基础,你为 lookupImage 属性提供该 PictureInput。
AmatorkaFilter:基于 Amatorka 的 Photoshop 动作的照片滤镜:http://amatorka.deviantart.com/art/Amatorka-Action-2-121069631。 如果你想使用此效果,你必须将 GPUImage framework/Operations/LookupImages 文件夹中的 lookup_amatorka.png 添加到你的应用程序包中。
MissEtikateFilter:基于 Miss Etikate 的 Photoshop 动作的照片滤镜:http://miss-etikate.deviantart.com/art/Photoshop-Action-15-120151961。 如果你想使用此效果,你必须将 GPUImage framework/Operations/LookupImages 文件夹中的 lookup_miss_etikate.png 添加到你的应用程序包中。
SoftElegance:另一个基于查找的颜色重新映射滤镜。 如果你想使用此效果,你必须将 GPUImage framework/Operations/LookupImages 文件夹中的 lookup_soft_elegance_1.png 和 lookup_soft_elegance_2.png 添加到你的应用程序包中。
ColorInversion:反转图像的颜色
Luminance:将图像简化为仅其亮度(灰度)。
MonochromeFilter:根据每个像素的亮度将图像转换为单色版本
FalseColor:使用图像的亮度在两种用户指定的颜色之间混合
Haze:用于添加或移除雾度(类似于紫外线滤镜)
SepiaToneFilter:简单的棕褐色调滤镜
OpacityAdjustment:调整传入图像的 alpha 通道
LuminanceThreshold:亮度高于阈值的像素将显示为白色,而低于阈值的像素将显示为黑色
AdaptiveThreshold:确定像素周围的局部亮度,然后如果像素低于该局部亮度则将像素变为黑色,如果高于该局部亮度则将像素变为白色。 这对于在不同的光照条件下挑选出文本非常有用。
AverageLuminanceThreshold:这应用阈值运算,其中阈值根据场景的平均亮度不断调整。
AverageColorExtractor (平均颜色提取器): 该滤镜处理输入图像,并通过平均图像中每个像素的RGBA分量来确定场景的平均颜色。它使用一种降采样过程,在GPU上逐步缩小源图像,然后在CPU上进行简短的平均计算。这个滤镜的输出本身没有意义,但你需要设置 `colorAverageProcessingFinishedBlock` 属性为一个block,该block接收四个颜色分量和一个帧时间,并对它们进行处理。
AverageLuminanceExtractor (平均亮度提取器): 类似于 AverageColorExtractor,该滤镜将图像简化为其平均亮度。你需要设置 `luminosityProcessingFinishedBlock` 来处理此滤镜的输出,该输出仅返回一个亮度值和一个帧时间。
ChromaKeying (色键): 对于图像中给定的颜色,将 alpha 通道设置为 0。这类似于 ChromaKeyBlend,只是它不是混合第二张图像来匹配颜色,而是不接收第二张图像,而只是使给定的颜色透明。
Vibrance (自然饱和度): 调整图像的自然饱和度
HighlightShadowTint (高光阴影着色): 允许您使用颜色和强度独立地为图像的阴影和高光着色
{1.0f, 0.0f, 0.0f, 1.0f}
(红色)。{0.0f, 0.0f, 1.0f, 1.0f}
(蓝色)。TransformOperation (变换操作): 这将任意 2-D 或 3-D 变换应用于图像
Crop (裁剪): 这将图像裁剪到特定区域,然后仅将该区域传递到滤镜中的下一阶段
LanczosResampling (兰索斯重采样): 这允许您使用兰索斯重采样来上采样或下采样图像,这导致比标准线性或三线性插值明显更好的质量。 只需使用 overriddenOutputSize 属性来设置滤镜的目标输出分辨率,图像将被重采样为该新尺寸。
Sharpen (锐化): 锐化图像
UnsharpMask (USM锐化): 应用 USM锐化
GaussianBlur (高斯模糊): 一个硬件优化的、可变半径的高斯模糊
BoxBlur (盒状模糊): 一个硬件优化的、可变半径的盒状模糊
SingleComponentGaussianBlur (单分量高斯模糊): 高斯模糊的修改版本,仅对红色分量进行操作
iOSBlur (iOS模糊): 尝试复制 iOS 7 中控制中心等位置使用的背景模糊。
MedianFilter (中值滤波器): 取三个颜色分量在 3x3 区域上的中值
BilateralBlur (双边模糊): 一种双边模糊,它尝试模糊相似的颜色值,同时保留清晰的边缘
TiltShift (倾斜偏移): 模拟的倾斜偏移镜头效果
Convolution3x3 (3x3卷积): 对图像运行 3x3 卷积核
SobelEdgeDetection (Sobel边缘检测): Sobel 边缘检测,边缘以白色突出显示
PrewittEdgeDetection (Prewitt边缘检测): Prewitt 边缘检测,边缘以白色突出显示
ThresholdSobelEdgeDetection (阈值Sobel边缘检测): 执行 Sobel 边缘检测,但应用阈值而不是给出渐进强度值
Histogram (直方图): 这会分析传入的图像并创建一个输出直方图,其中包含每个颜色值出现的频率。 此滤镜的输出是一个 3 像素高、256 像素宽的图像,其中中心(垂直)像素包含与各种颜色值出现频率相对应的像素。 每个颜色值占据 256 个宽度位置中的一个,从左侧的 0 到右侧的 255。 可以为单个颜色通道(.Red、.Green、.Blue)、图像的亮度 (.Luminance) 或同时为所有三个颜色通道 (.RGB) 生成此直方图。
HistogramDisplay (直方图显示): 这是一个特殊的滤镜,因为它主要用于与直方图一起使用。 它生成由直方图生成的颜色直方图的输出表示,但它可以重新用于显示其他类型的值。 它接收图像并查看中心(垂直)像素。 然后,它在输出纹理中以单独的彩色图形绘制 RGB 分量的数值。 您可能需要强制为此滤镜设置大小才能使其输出可见。
HistogramEqualization (直方图均衡化): 这会获取图像,分析其直方图,并根据该直方图均衡化传出的图像。
CannyEdgeDetection (Canny边缘检测): 这使用完整的 Canny 过程来突出显示一像素宽的边缘
HarrisCornerDetector (Harris角点检测器): 对输入图像运行 Harris 角点检测算法,并生成一个图像,其中这些角点作为白色像素,其他所有内容为黑色。 可以设置 cornersDetectedCallback,并且您将获得一个角点数组(在归一化的 0..1 位置中),用于您想要执行的任何其他操作。
NobleCornerDetector (Noble角点检测器): 在 Harris 角点检测器上运行 Noble 变体。 它的行为与上述 Harris 检测器描述的行为相同。
ShiTomasiCornerDetector (Shi-Tomasi角点检测器): 运行 Shi-Tomasi 特征检测器。 它的行为与上述 Harris 检测器描述的行为相同。
Dilation (膨胀): 这会执行图像膨胀操作,其中矩形邻域中颜色通道的最大强度用于此像素的强度。 要采样的矩形区域的半径在初始化时指定,范围为 1-4 像素。 这适用于灰度图像,它会扩展明亮区域。
Erosion (腐蚀): 这会执行图像腐蚀操作,其中矩形邻域中颜色通道的最小强度用于此像素的强度。 要采样的矩形区域的半径在初始化时指定,范围为 1-4 像素。 这适用于灰度图像,它会扩展黑暗区域。
OpeningFilter(开运算滤镜): 对图像的颜色通道进行腐蚀操作,然后使用相同的半径进行膨胀操作。 半径在初始化时设置,范围为 1-4 像素。 此滤镜会滤除较小的明亮区域。
ClosingFilter(闭运算滤镜): 对图像的颜色通道进行膨胀操作,然后使用相同的半径进行腐蚀操作。 半径在初始化时设置,范围为 1-4 像素。 此滤镜会滤除较小的黑暗区域。
LocalBinaryPattern(局部二值模式): 将中心像素的红色通道强度与其周围 8 个像素的红色通道强度进行比较,并将比较结果编码为一个位串,该位串成为该像素的强度值。 最低有效位是右上方的比较结果,按逆时针方向旋转,直到右侧的比较结果成为最高有效位。
ColorLocalBinaryPattern(彩色局部二值模式): 将中心像素的所有颜色通道强度与其周围 8 个像素的所有颜色通道强度进行比较,并将比较结果编码为一个位串,该位串成为每个颜色通道的强度值。 最低有效位是右上方的比较结果,按逆时针方向旋转,直到右侧的比较结果成为最高有效位。
LowPassFilter(低通滤波器): 将低通滤波器应用于传入的视频帧。 这基本上是对先前帧的加权滚动平均值与当前传入的帧进行累加。 这可用于对视频进行降噪、添加运动模糊或创建高通滤波器。
HighPassFilter(高通滤波器): 将高通滤波器应用于传入的视频帧。 这是低通滤波器的逆运算,显示当前帧与先前帧的加权滚动平均值之间的差异。 这对于运动检测最有用。
MotionDetector(运动检测器): 这是一个基于高通滤波器的运动检测器。 您设置 motionDetectedCallback,并且对于每个传入的帧,它都会为您提供场景中任何检测到的运动的质心(在归一化的 X,Y 坐标中)以及场景的运动强度。
MotionBlur(运动模糊): 对图像应用方向性运动模糊
ZoomBlur(缩放模糊): 对图像应用方向性运动模糊
ColourFASTFeatureDetection(彩色 FAST 特征检测): 提取图像的 ColourFAST 特征描述符
ChromaKeyBlend(色键混合): 有选择地将第一张图像中的某种颜色替换为第二张图像
DissolveBlend(溶解混合): 对两张图像应用溶解混合
MultiplyBlend(正片叠底混合): 对两张图像应用正片叠底混合
AddBlend(相加混合): 对两张图像应用相加混合
SubtractBlend(相减混合): 对两张图像应用相减混合
DivideBlend(相除混合): 对两张图像应用相除混合
OverlayBlend(叠加混合): 对两张图像应用叠加混合
DarkenBlend(变暗混合): 通过取图像之间每个颜色分量的最小值来混合两张图像
LightenBlend(变亮混合): 通过取图像之间每个颜色分量的最大值来混合两张图像
ColorBurnBlend(颜色加深混合): 对两张图像应用颜色加深混合
ColorDodgeBlend(颜色减淡混合): 对两张图像应用颜色减淡混合
ScreenBlend(滤色混合): 对两张图像应用滤色混合
ExclusionBlend(排除混合): 对两张图像应用排除混合
DifferenceBlend(差值混合): 对两张图像应用差值混合
HardLightBlend(强光混合): 对两张图像应用强光混合
SoftLightBlend(柔光混合): 对两张图像应用柔光混合
AlphaBlend(Alpha 混合): 基于第二张图像的 Alpha 通道将第二张图像混合到第一张图像之上
SourceOverBlend(源覆盖混合): 对两张图像应用源覆盖混合
ColorBurnBlend(颜色加深混合): 对两张图像应用颜色加深混合
ColorDodgeBlend(颜色减淡混合): 对两张图像应用颜色减淡混合
NormalBlend(正常混合): 对两张图像应用正常混合
ColorBlend(颜色混合): 对两张图像应用颜色混合
HueBlend(色调混合): 对两张图像应用色调混合
SaturationBlend(饱和度混合): 对两张图像应用饱和度混合
LuminosityBlend(亮度混合): 对两张图像应用亮度混合
LinearBurnBlend(线性加深混合): 对两张图像应用线性加深混合
Pixellate(像素化): 对图像或视频应用像素化效果
PolarPixellate(极坐标像素化): 基于极坐标而不是笛卡尔坐标,对图像或视频应用像素化效果
PolkaDot(波点): 将图像分解为规则网格内的彩色点
Halftone(半色调): 对图像应用半色调效果,如新闻打印
Crosshatch(交叉阴影): 这会将图像转换为黑白交叉阴影图案
SketchFilter(素描滤镜): 将视频转换为看起来像素描。 这只是颜色反转的 Sobel 边缘检测滤波器
ThresholdSketchFilter(阈值素描滤镜): 与素描滤镜相同,只是边缘被阈值化而不是灰度化
ToonFilter(卡通滤镜): 这使用 Sobel 边缘检测在对象周围放置黑色边框,然后量化图像中存在的颜色,从而为图像赋予卡通般的质量。
SmoothToonFilter(平滑卡通滤镜): 这使用与卡通滤镜类似的过程,只是在卡通效果之前使用高斯模糊来平滑噪声。
EmbossFilter(浮雕滤镜): 对图像应用浮雕效果
Posterize(海报化): 这将颜色动态范围减少到指定的步数,从而导致图像的卡通般的简单阴影。
SwirlDistortion(漩涡扭曲): 在图像上创建漩涡扭曲
BulgeDistortion(凸起扭曲): 在图像上创建凸起扭曲
PinchDistortion(收缩扭曲): 创建图像的收缩扭曲
StretchDistortion(拉伸扭曲): 创建图像的拉伸扭曲
SphereRefraction(球体折射): 模拟通过玻璃球的折射
GlassSphereRefraction(玻璃球折射): 与球体折射相同,只是图像不会反转,并且玻璃边缘有一些磨砂效果
Vignette(晕影): 执行晕影效果,使图像在边缘淡出
KuwaharaFilter(Kuwahara 滤镜): Kuwahara 图像抽象,源自 Kyprianidis 等人在 GPU Pro 集合中的出版物“GPU 上的各向异性 Kuwahara 滤波”。 这会产生类似油画的图像,但计算量非常大,因此在 iPad 2 上渲染一帧可能需要几秒钟。 这可能最适合用于静止图像。
KuwaharaRadius3Filter(Kuwahara 半径 3 滤镜): Kuwahara 滤镜的修改版本,经过优化,仅在半径为 3 像素的范围内工作
CGAColorspace(CGA 色彩空间): 模拟 CGA 显示器的色彩空间
Solarize(曝光过度): 应用曝光过度效果