概述
GPUImage 框架是一个 BSD 许可的 iOS 库,可让您将 GPU 加速滤镜和其他效果应用于图像、实时摄像机视频和电影。与 Core Image(iOS 5.0 的一部分)相比,GPUImage 允许您编写自己的自定义过滤器,支持部署到 iOS 4.0,并且具有更简单的界面。但是,它目前缺少 Core Image 的一些更高级的功能,例如面部检测。
对于处理图像或实时视频帧等大规模并行操作,GPU 比 CPU 具有一些显着的性能优势。在 iPhone 4 上,一个简单的图像过滤器在 GPU 上的执行速度比等效的基于 CPU 的过滤器快 100 倍以上。
但是,在 GPU 上运行自定义滤镜需要大量代码来为这些滤镜设置和维护 OpenGL ES 2.0 渲染目标。我创建了一个示例项目来执行此操作:
www.sunsetlakesoftware.com/2010/10/22/…
并发现在其创建过程中我必须编写大量样板代码。因此,我将这个框架放在一起,它封装了您在处理图像和视频时会遇到的许多常见任务,并使您无需关心 OpenGL ES 2.0 基础。
在处理视频时,此框架优于 Core Image,在 iPhone 4 上仅需 2.5 毫秒即可从相机上传帧、应用伽玛过滤器并显示,而使用 Core Image 进行相同操作需要 106 毫秒。基于 CPU 的处理需要 460 毫秒,使得 GPUImage 在此硬件上的此操作比 Core Image 快 40 倍,比 CPU 绑定处理快 184 倍。在 iPhone 4S 上,对于这种情况,GPUImage 仅比 Core Image 快 4 倍,比 CPU 绑定处理快 102 倍。然而,对于更大半径的高斯模糊等更复杂的操作,Core Image 目前优于 GPUImage。
执照
BSD 风格,在 License.txt 中具有框架可用的完整许可证。
技术要求
- OpenGL ES 2.0:使用它的应用程序将无法在原始 iPhone、iPhone 3G 以及第一代和第二代 iPod touch 上运行
- iOS 4.1 作为部署目标(4.0 没有一些电影阅读所需的扩展)。如果您希望在拍摄静态照片时显示实时视频预览,则需要 iOS 4.3 作为部署目标。
- iOS 5.0 SDK构建
- 设备必须有摄像头才能使用摄像头相关功能(很明显)
- 该框架使用自动引用计数 (ARC),但如果添加为子项目,则应该支持同时使用 ARC 和手动引用计数的项目,如下所述。对于针对 iOS 4.x 的手动引用计数应用程序,您需要将 -fobjc-arc 添加到应用程序项目的其他链接器标志中。
通用架构
GPUImage 使用 OpenGL ES 2.0 着色器来执行图像和视频操作,这比在 CPU 绑定例程中执行的速度快得多。但是,它在简化的 Objective-C 接口中隐藏了与 OpenGL ES API 交互的复杂性。此接口允许您定义图像和视频的输入源,在链中附加过滤器,并将处理后的图像或视频发送到屏幕、UIImage 或磁盘上的电影。
图像或视频帧从源对象上传,源对象是 GPUImageOutput 的子类。其中包括 GPUImageVideoCamera(用于来自 iOS 相机的实时视频)、GPUImageStillCamera(用于使用相机拍照)、GPUImagePicture(用于静止图像)和 GPUImageMovie(用于电影)。源对象将静态图像帧作为纹理上传到 OpenGL ES,然后将这些纹理传递给处理链中的下一个对象。
过滤器和链中的其他后续元素符合 GPUImageInput 协议,这使它们可以从链中的前一个链接获取提供或处理的纹理,并对其进行处理。链下一级的对象被视为目标,并且可以通过将多个目标添加到单个输出或过滤器来分支处理。
例如,从摄像头获取实时视频、将视频转换为棕褐色调、然后在屏幕上显示视频的应用程序会建立一个如下所示的链:
GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView
将静态库添加到您的 iOS 项目
注意:如果你想在 Swift 项目中使用它,你需要使用“将它添加为框架”部分中的步骤而不是下面的步骤。Swift 需要第三方代码的模块。
一旦您拥有框架的最新源代码,将它添加到您的应用程序中就相当简单了。首先将 GPUImage.xcodeproj 文件拖到应用程序的 Xcode 项目中,以将框架嵌入到项目中。接下来,转到应用程序的目标并将 GPUImage 添加为目标依赖项。最后,您需要将 libGPUImage.a 库从 GPUImage 框架的 Products 文件夹拖到应用程序目标中的 Link Binary With Libraries 构建阶段。
GPUImage 需要一些其他框架链接到您的应用程序中,因此您需要将以下内容作为链接库添加到您的应用程序目标中:
- 核心媒体
- 核心视频
- OpenGLES
- AV基金会
- 石英芯
您还需要找到框架标头,因此在项目的构建设置中将标头搜索路径设置为从应用程序到 GPUImage 源目录中的框架/子目录的相对路径。使此标头搜索路径递归。
要在您的应用程序中使用 GPUImage 类,只需使用以下内容包含核心框架标头:
#import "GPUImage.h"
请注意:如果您在尝试使用 Interface Builder 构建界面时遇到“Unknown class GPUImageView in Interface Builder”之类的错误,您可能需要在项目的构建设置中将 -ObjC 添加到其他链接器标志中。
此外,如果您需要将此部署到 iOS 4.x,似乎当前版本的 Xcode (4.3) 要求您在最终应用程序中弱链接 Core Video 框架,否则您会看到崩溃并显示消息“找不到符号: _CVOpenGLESTextureCacheCreate”,当您创建存档以上传到 App Store 或进行临时分发时。为此,转到项目的构建阶段选项卡,展开链接二进制文件与库组,然后在列表中找到 CoreVideo.framework。将列表最右侧的设置从必需更改为可选。
此外,这是一个支持 ARC 的框架,因此如果您想在针对 iOS 4.x 的手动引用计数应用程序中使用它,您还需要将 -fobjc-arc 添加到您的其他链接器标志中。
在命令行构建静态库
如果您不想将该项目作为依赖项包含在应用程序的 Xcode 项目中,您可以为 iOS 模拟器或设备构建一个通用静态库。为此,请build.sh在命令行运行。生成的库和头文件将位于build/Release-iphone. 您还可以通过更改中的IOSSDK_VER变量来更改 iOS SDK 的build.sh版本(所有可用版本都可以使用 找到xcodebuild -showsdks)。
将其作为框架(模块)添加到您的 Mac 或 iOS 项目中
Xcode 6 和 iOS 8 支持使用完整框架,Mac 也是如此,这简化了将其添加到您的应用程序的过程。要将此添加到您的应用程序,我建议将 .xcodeproj 项目文件拖到您的应用程序项目中(就像在静态库目标中一样)。
对于您的应用程序,转到其目标构建设置并选择构建阶段选项卡。在 Target Dependencies 分组下,在 iOS 上添加 GPUImageFramework(不是构建静态库的 GPUImage)或在 Mac 上添加 GPUImage。在 Link Binary With Libraries 部分下,添加 GPUImage.framework。
这应该会导致 GPUImage 构建为一个框架。在 Xcode 6 下,这也将构建为一个模块,这将允许您在 Swift 项目中使用它。如上设置时,您应该只需要使用
import GPUImage
把它拉进去。
然后,您需要添加一个新的 Copy Files 构建阶段,将 Destination 设置为 Frameworks,并将 GPUImage.framework 构建产品添加到其中。这将允许框架与您的应用程序捆绑在一起(否则,您将在执行时看到神秘的“dyld:库未加载:@rpath/GPUImage.framework/GPUImage”错误)。
文档
文档是使用 appledoc 从标题注释生成的。要构建文档,请切换到 Xcode 中的“文档”方案。您应该确保“APPLEDOC_PATH”(用户定义的构建设置)指向 appledoc 二进制文件,可在Github上或通过Homebrew获得。它还将构建并安装一个 .docset 文件,您可以使用您喜欢的文档工具查看该文件。
执行常见任务
过滤直播视频
要过滤来自 iOS 设备相机的实时视频,您可以使用如下代码:
GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"];
GPUImageView *filteredVideoView = [[GPUImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, viewWidth, viewHeight)];
// Add the view somewhere so it's visible
[videoCamera addTarget:customFilter];
[customFilter addTarget:filteredVideoView];
[videoCamera startCameraCapture];
这将设置来自 iOS 设备后置摄像头的视频源,使用尝试以 640x480 分辨率捕获的预设。此视频是在界面处于纵向模式时捕获的,其中横向左安装的相机需要在显示前旋转其视频帧。然后使用文件 CustomShader.fsh 中的代码将自定义过滤器设置为来自摄像机的视频帧的目标。这些过滤后的视频帧最终在 UIView 子类的帮助下显示在屏幕上,该子类可以呈现从此管道生成的过滤后的 OpenGL ES 纹理。
GPUImageView 的填充模式可以通过设置其 fillMode 属性来更改,因此如果源视频的纵横比与视图的纵横比不同,视频将被拉伸、以黑条居中或缩放以填充。
对于混合滤镜和其他接受多个图像的滤镜,您可以创建多个输出并添加一个滤镜作为这两个输出的目标。添加输出作为目标的顺序将影响输入图像混合或以其他方式处理的顺序。
此外,如果您希望启用麦克风音频捕获以录制到电影中,您需要将相机的 audioEncodingTarget 设置为您的电影编写器,如下所示:
videoCamera.audioEncodingTarget = movieWriter;
拍摄和过滤静态照片
要捕获和过滤静态照片,您可以使用类似于过滤视频的过程。您使用的是 GPUImageStillCamera,而不是 GPUImageVideoCamera:
stillCamera = [[GPUImageStillCamera alloc] init];
stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
filter = [[GPUImageGammaFilter alloc] init];
[stillCamera addTarget:filter];
GPUImageView *filterView = (GPUImageView *)self.view;
[filter addTarget:filterView];
[stillCamera startCameraCapture];
这将为您提供静态相机预览视频的实时过滤提要。请注意,此预览视频仅在 iOS 4.3 及更高版本上提供,因此如果您希望拥有此功能,则可能需要将其设置为部署目标。
一旦您想要拍摄照片,您可以使用如下所示的回调块:
[stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){
NSData *dataForJPEGFile = UIImageJPEGRepresentation(processedImage, 0.8);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSError *error2 = nil;
if (![dataForJPEGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2])
{
return;
}
}];
上面的代码捕获一张全尺寸照片,该照片由预览视图中使用的相同滤镜链处理,并将该照片以 JPEG 格式保存到磁盘的应用程序文档目录中。
请注意,由于纹理大小限制,该框架目前无法在旧设备(iPhone 4S、iPad 2 或 Retina iPad 之前的设备)上处理大于 2048 像素宽或高的图像。这意味着 iPhone 4 的相机输出比这更大的静态照片,将无法拍摄这样的照片。正在实施一种平铺机制来解决这个问题。所有其他设备都应该能够使用此方法捕获和过滤照片。
处理静止图像
有几种方法可以处理静止图像并创建结果。执行此操作的第一种方法是创建静止图像源对象并手动创建过滤器链:
UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init];
[stillImageSource addTarget:stillImageFilter];
[stillImageFilter useNextFrameForImageCapture];
[stillImageSource processImage];
UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer];
请注意,对于从过滤器手动捕获图像,您需要设置 -useNextFrameForImageCapture 以告知过滤器您稍后需要从中捕获图像。默认情况下,GPUImage 在过滤器中重复使用帧缓冲区以节省内存,因此如果您需要保留过滤器的帧缓冲区以进行手动图像捕获,则需要提前告知它。
对于您希望应用于图像的单个过滤器,您可以简单地执行以下操作:
GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init];
UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage];
编写自定义过滤器
与 iOS 上的 Core Image(自 iOS 5.0 起)相比,此框架的一个显着优势是能够编写您自己的自定义图像和视频处理过滤器。这些滤镜作为 OpenGL ES 2.0 片段着色器提供,以类 C 的 OpenGL 着色语言编写。
自定义过滤器使用如下代码初始化
GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"];
其中用于片段着色器的扩展名是 .fsh。此外,如果您不想在应用程序包中发布片段着色器,则可以使用 -initWithFragmentShaderFromString: 初始化程序将片段着色器作为字符串提供。
片段着色器对要在该过滤阶段渲染的每个像素执行计算。他们使用 OpenGL 着色语言 (GLSL) 来执行此操作,这是一种类 C 语言,添加了特定于 2-D 和 3-D 图形的内容。片段着色器的一个示例是以下棕褐色调过滤器:
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
void main()
{
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
lowp vec4 outputColor;
outputColor.r = (textureColor.r * 0.393) + (textureColor.g * 0.769) + (textureColor.b * 0.189);
outputColor.g = (textureColor.r * 0.349) + (textureColor.g * 0.686) + (textureColor.b * 0.168);
outputColor.b = (textureColor.r * 0.272) + (textureColor.g * 0.534) + (textureColor.b * 0.131);
outputColor.a = 1.0;
gl_FragColor = outputColor;
}
对于在 GPUImage 框架内可用的图像过滤器,前两行采用 textureCoordinate varying(对于纹理中的当前坐标,归一化为 1.0)和 inputImageTexture uniform(对于实际输入图像帧纹理)是必需的.
着色器的其余部分在传入的纹理中抓取该位置的像素颜色,以产生棕褐色调的方式对其进行操作,并将该像素颜色写出以用于下一阶段的处理管道。
将片段着色器添加到 Xcode 项目时需要注意的一件事是 Xcode 认为它们是源代码文件。要解决此问题,您需要手动将着色器从编译源构建阶段移动到复制捆绑资源阶段,以便将着色器包含在您的应用程序捆绑包中。
过滤和重新编码电影
电影可以通过 GPUImageMovie 类加载到框架中,进行过滤,然后使用 GPUImageMovieWriter 写出。GPUImageMovieWriter 的速度也足以从 iPhone 4 的摄像头以 640x480 实时录制视频,因此可以将直接过滤的视频源输入其中。目前,GPUImageMovieWriter 的速度足以在 iPhone 4 上以高达 20 FPS 的速度录制实时 720p 视频,在 iPhone 4S(以及新 iPad)上以 30 FPS 的速度录制 720p 和 1080p 视频。
下面是一个示例,说明如何加载示例影片,将其通过像素化过滤器,然后将结果作为 480 x 640 h.264 影片记录到磁盘:
movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];
pixellateFilter = [[GPUImagePixellateFilter alloc] init];
[movieFile addTarget:pixellateFilter];
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
unlink([pathToMovie UTF8String]);
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];
[pixellateFilter addTarget:movieWriter];
movieWriter.shouldPassthroughAudio = YES;
movieFile.audioEncodingTarget = movieWriter;
[movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];
[movieWriter startRecording];
[movieFile startProcessing];
录制完成后,您需要从过滤器链中删除电影录制器并使用如下代码关闭录制:
[pixellateFilter removeTarget:movieWriter];
[movieWriter finishRecording];
电影在完成之前无法使用,因此如果在此之前中断,录制将丢失。
与 OpenGL ES 交互
GPUImage 可以分别通过使用其 GPUImageTextureOutput 和 GPUImageTextureInput 类从 OpenGL ES 导出和导入纹理。这使您可以从 OpenGL ES 场景录制影片,该影片被渲染到具有绑定纹理的帧缓冲区对象,或者过滤视频或图像,然后将它们作为要在场景中显示的纹理送入 OpenGL ES。
这种方法的一个警告是,这些过程中使用的纹理必须通过共享组或类似的东西在 GPUImage 的 OpenGL ES 上下文和任何其他上下文之间共享。
内置过滤器
目前内置了125个过滤器,分为以下几类:
颜色调整
-
GPUImageBrightnessFilter : 调整图像的亮度
- brightness:调整后的亮度(-1.0 - 1.0,默认为 0.0)
-
GPUImageExposureFilter : 调整图像的曝光
- exposure:调整后的曝光(-10.0 - 10.0,默认为 0.0)
-
GPUImageContrastFilter : 调整图像的对比度
- contrast:调整后的对比度(0.0 - 4.0,默认为 1.0)
-
GPUImageSaturationFilter:调整图像的饱和度
- 饱和度:应用于图像的饱和度或去饱和度(0.0 - 2.0,默认值为 1.0)
-
GPUImageGammaFilter:调整图像的伽玛
- gamma:要应用的 gamma 调整(0.0 - 3.0,默认值为 1.0)
-
GPUImageLevelsFilter:类似 Photoshop 的级别调整。min、max、minOut 和 maxOut 参数是 [0, 1] 范围内的浮点数。如果 Photoshop 的参数在 [0, 255] 范围内,则必须先将它们转换为 [0, 1]。gamma/mid 参数是一个 >= 0 的浮点数。这与来自 Photoshop 的值相匹配。如果您想将级别应用到 RGB 以及单个通道,您需要使用此过滤器两次 - 首先是单个通道,然后是所有通道。
-
GPUImageColorMatrixFilter:通过对图像应用矩阵来转换图像的颜色
- colorMatrix:一个 4x4 矩阵,用于转换图像中的每种颜色
- intensity:新变换的颜色替换每个像素的原始颜色的程度
-
GPUImageRGBFilter:调整图像的各个 RGB 通道
- red:每个颜色通道乘以的归一化值。范围从 0.0 开始,默认值为 1.0。
- 绿色:
- 蓝色:
-
GPUImageHueFilter:调整图像的色调
- 色调:色调角度,以度为单位。默认90度
-
GPUImageVibranceFilter:调整图像的振动
- vibrance:要应用的 vibrance 调整,使用 0.0 作为默认值,建议的最小值/最大值分别约为 -1.2 和 1.2。
-
GPUImageWhiteBalanceFilter:调整图像的白平衡。
- temperature:调整图像的温度,以ºK为单位。值 4000 非常凉爽,7000 非常温暖。默认值为 5000。请注意,4000 到 5000 之间的比例在视觉上几乎与 5000 到 7000 之间的比例一样重要。
- tint:调整图像的色调。值 -200非常绿,200非常粉红色。默认值为 0。
-
GPUImageToneCurveFilter:根据每个颜色通道的样条曲线调整图像的颜色。
- 红色控制点:
- 绿色控制点:
- 蓝色控制点:
- rgbCompositeControlPoints:色调曲线采用一系列控制点,这些控制点为每个颜色分量或合成中的所有三个分量定义样条曲线。它们在 NSArray 中存储为 NSValue-wrapped CGPoints,具有从 0 - 1 的标准化 X 和 Y 坐标。默认值为 (0,0)、(0.5,0.5)、(1,1)。
-
GPUImageHighlightShadowFilter:调整图像的阴影和高光
- shadows:增加以减轻阴影,从 0.0 到 1.0,默认值为 0.0。
- highlights:从 1.0 到 0.0 减少以加深高光,默认值为 1.0。
-
GPUImageHighlightShadowTintFilter:允许您使用颜色和强度独立地为图像的阴影和高光着色
- shadowTintColor:阴影色调 RGB 颜色 (GPUVector4)。默认值:(
{1.0f, 0.0f, 0.0f, 1.0f}红色)。 - highlightTintColor:突出显示色调 RGB 颜色 (GPUVector4)。默认值:(
{0.0f, 0.0f, 1.0f, 1.0f}蓝色)。 - shadowTintIntensity:阴影色调强度,从 0.0 到 1.0。默认值:0.0
- highlightTintIntensity:突出显示色调强度,从 0.0 到 1.0,默认值为 0.0。
- shadowTintColor:阴影色调 RGB 颜色 (GPUVector4)。默认值:(
-
GPUImageLookupFilter:使用 RGB 颜色查找图像重新映射图像中的颜色。首先,使用您最喜欢的照片编辑应用程序对来自 GPUImage/framework/Resources 的 lookup.png 应用过滤器。为了使其正常工作,每个像素颜色不得依赖于其他像素(例如,模糊将不起作用)。如果您需要更复杂的过滤器,您可以根据需要创建尽可能多的查找表。准备就绪后,使用新的 lookup.png 文件作为 GPUImageLookupFilter 的第二个输入。
-
GPUImageAmatorkaFilter:基于 Amatorka 的 Photoshop 动作的照片滤镜:http: //amatorka.deviantart.com/art/Amatorka-Action-2-121069631。如果您想使用此效果,您必须将 GPUImage Resources 文件夹中的 lookup_amatorka.png 添加到您的应用程序包中。
-
GPUImageMissEtikateFilter:基于 Miss Etikate 的 Photoshop 动作的照片滤镜:http: //miss-etikate.deviantart.com/art/Photoshop-Action-15-120151961。如果您想使用此效果,您必须将 GPUImage Resources 文件夹中的 lookup_miss_etikate.png 添加到您的应用程序包中。
-
GPUImageSoftEleganceFilter:另一个基于查找的颜色重映射过滤器。如果您想使用此效果,您必须将 GPUImage Resources 文件夹中的 lookup_soft_elegance_1.png 和 lookup_soft_elegance_2.png 添加到您的应用程序包中。
-
GPUImageSkinToneFilter:一种肤色调整滤镜,可影响独特的浅肤色范围,并相应地调整粉红色/绿色或粉红色/橙色范围。默认值针对白种人皮肤,但可以根据需要进行调整。
- skinToneAdjust:调整肤色的量。默认值:0.0,建议的最小值/最大值:分别为 -0.3 和 0.3。
- skinHue:要检测的肤色。默认值:0.05(白种人至微红皮肤)。
- skinHueThreshold:肤色的变化量。默认值:40.0。
- maxHueShift:允许的最大色调偏移量。默认值:0.25。
- maxSaturationShift = 要移动的最大饱和度(使用橙色时)。默认值:0.4。
- upperSkinToneColor =
GPUImageSkinToneUpperColorGreen或GPUImageSkinToneUpperColorOrange
-
GPUImageColorInvertFilter:反转图像的颜色
-
GPUImageGrayscaleFilter:将图像转换为灰度(饱和度过滤器的实现速度稍快,但无法改变颜色贡献)
-
GPUImageMonochromeFilter:根据每个像素的亮度将图像转换为单色版本
- intensity : 特定颜色替代正常图像颜色的程度(0.0 - 1.0,默认为 1.0)
- color:用作效果基础的颜色,默认值为 (0.6, 0.45, 0.3, 1.0)。
-
GPUImageFalseColorFilter:使用图像的亮度在两种用户指定的颜色之间进行混合
- firstColor:第一种和第二种颜色分别指定用什么颜色替换图像的暗区和亮区。默认值是 (0.0, 0.0, 0.5) 和 (1.0, 0.0, 0.0)。
- 第二颜色:
-
GPUImageHazeFilter:用于添加或去除雾度(类似于 UV 过滤器)
- distance : 应用颜色的强度。默认值 0。最佳值介于 -.3 和 .3 之间。
- 斜率:颜色变化量。默认值 0。最佳值介于 -.3 和 .3 之间。
-
GPUImageSepiaFilter : 简单的棕褐色调滤镜
- intensity:棕褐色调替换正常图像颜色的程度(0.0 - 1.0,默认值为 1.0)
-
GPUImageOpacityFilter:调整传入图像的 alpha 通道
- 不透明度:将每个像素的传入 alpha 通道乘以的值(0.0 - 1.0,默认值为 1.0)
-
GPUImageSolidColorGenerator:这会输出具有纯色的生成图像。您需要使用 -forceProcessingAtSize 定义图像大小:
- color:用于填充图像的颜色,采用四分量格式。
-
GPUImageLuminanceThresholdFilter:亮度高于阈值的像素将显示为白色,低于阈值的像素将显示为黑色
- threshold : 亮度阈值,从0.0到1.0,默认为0.5
-
GPUImageAdaptiveThresholdFilter:确定像素周围的局部亮度,如果低于该局部亮度则将像素变为黑色,如果高于该亮度则将像素变为白色。这对于在不同光照条件下挑选文本很有用。
- blurRadiusInPixels:背景平均模糊半径的乘数(以像素为单位),默认值为 4。
-
GPUImageAverageLuminanceThresholdFilter:这应用了阈值操作,其中阈值根据场景的平均亮度不断调整。
- thresholdMultiplier:这是一个因子,平均亮度将乘以该因子以达到要使用的最终阈值。默认情况下,这是 1.0。
-
GPUImageHistogramFilter: This analyzes the incoming image and creates an output histogram with the frequency at which each color value occurs. The output of this filter is a 3-pixel-high, 256-pixel-wide image with the center (vertical) pixels containing pixels that correspond to the frequency at which various color values occurred. Each color value occupies one of the 256 width positions, from 0 on the left to 255 on the right. This histogram can be generated for individual color channels (kGPUImageHistogramRed, kGPUImageHistogramGreen, kGPUImageHistogramBlue), the luminance of the image (kGPUImageHistogramLuminance), or for all three color channels at once (kGPUImageHistogramRGB).
- downsamplingFactor:这不是对每个像素进行采样,而是指示对图像的哪一部分进行采样。默认情况下,这是 16,最小值为 1。这是防止直方图饱和所必需的,直方图在过载之前只能为每个颜色值记录 256 个像素。
-
GPUImageHistogramGenerator:这是一个特殊的过滤器,因为它主要用于与 GPUImageHistogramFilter 一起使用。它生成由 GPUImageHistogramFilter 生成的颜色直方图的输出表示,但它可以重新用于显示其他类型的值。它接收图像并查看中心(垂直)像素。然后它在输出纹理的单独彩色图表中绘制 RGB 分量的数值。您可能需要为此过滤器强制调整大小以使其输出可见。
-
GPUImageAverageColor:这会处理输入图像并通过平均图像中每个像素的 RGBA 分量来确定场景的平均颜色。缩减过程用于在 GPU 上逐步对源图像进行下采样,然后在 CPU 上进行短暂的平均计算。此过滤器的输出没有意义,但您需要将 colorAverageProcessingFinishedBlock 属性设置为一个块,该块接收四个颜色分量和一个帧时间并对它们执行某些操作。
-
GPUImageLuminosity:与 GPUImageAverageColor 一样,这会将图像降低到其平均亮度。您需要设置 luminosityProcessingFinishedBlock 来处理这个过滤器的输出,它只返回一个亮度值和一个帧时间。
-
GPUImageChromaKeyFilter:对于图像中的给定颜色,将 alpha 通道设置为 0。这类似于 GPUImageChromaKeyBlendFilter,只是不是混合第二张图像以获得匹配的颜色,它不会接收第二张图像,只是将给定的颜色透明。
- thresholdSensitivity:颜色匹配需要与要替换的目标颜色有多接近(默认为 0.4)
- smoothing:颜色匹配的平滑度(默认为 0.1)
图像处理
-
GPUImageTransformFilter:这对图像应用任意 2-D 或 3-D 转换
- affineTransform:这需要一个 CGAffineTransform 来调整二维图像
- transform3D:这需要一个 CATransform3D 来操作 3-D 图像
- ignoreAspectRatio:默认情况下,变换图像的纵横比保持不变,但可以将其设置为 YES 以使变换与纵横比无关
-
GPUImageCropFilter:将图像裁剪到特定区域,然后仅将该区域传递到过滤器的下一个阶段
- cropRegion:要从图像中裁剪的矩形区域,标准化为 0.0 - 1.0 之间的坐标。(0.0, 0.0) 位置在图像的左上角。
-
GPUImageLanczosResamplingFilter:这使您可以使用 Lanczos 重采样对图像进行上采样或下采样,从而产生比标准线性或三线性插值明显更好的质量。只需使用 -forceProcessingAtSize: 设置过滤器的目标输出分辨率,图像将根据新尺寸重新采样。
-
GPUImageSharpenFilter:锐化图像
- 清晰度:要应用的清晰度调整(-4.0 - 4.0,默认值为 0.0)
-
GPUImageUnsharpMaskFilter:应用反锐化蒙版
- blurRadiusInPixels:底层高斯模糊的模糊半径。默认值为 4.0。
- intensity : 锐化的强度,从 0.0 开始,默认为 1.0
-
GPUImageGaussianBlurFilter:硬件优化的可变半径高斯模糊
- texelSpacingMultiplier:纹素之间间距的乘数,范围从 0.0 开始,默认值为 1.0。调整此项可能会略微增加模糊强度,但会在结果中引入伪影。强烈建议先使用其他参数,然后再接触这个参数。
- blurRadiusInPixels:用于模糊的半径(以像素为单位),默认值为 2.0。这会调整高斯分布函数中的 sigma 变量。
- 模糊半径作为图像宽度的分数:
- blurRadiusAsFractionOfImageHeight:设置这些属性将允许模糊半径随图像大小缩放
- blurPasses:顺序模糊传入图像的次数。通过的次数越多,过滤器越慢。
-
GPUImageBoxBlurFilter:硬件优化的可变半径框模糊
- texelSpacingMultiplier:纹素之间间距的乘数,范围从 0.0 开始,默认值为 1.0。调整此项可能会略微增加模糊强度,但会在结果中引入伪影。强烈建议先使用其他参数,然后再接触这个参数。
- blurRadiusInPixels:用于模糊的半径(以像素为单位),默认值为 2.0。这会调整高斯分布函数中的 sigma 变量。
- 模糊半径作为图像宽度的分数:
- blurRadiusAsFractionOfImageHeight:设置这些属性将允许模糊半径随图像大小缩放
- blurPasses:顺序模糊传入图像的次数。通过的次数越多,过滤器越慢。
-
GPUImageSingleComponentGaussianBlurFilter:对 GPUImageGaussianBlurFilter 的修改,仅对红色分量进行操作
- texelSpacingMultiplier:纹素之间间距的乘数,范围从 0.0 开始,默认值为 1.0。调整此项可能会略微增加模糊强度,但会在结果中引入伪影。强烈建议先使用其他参数,然后再接触这个参数。
- blurRadiusInPixels:用于模糊的半径(以像素为单位),默认值为 2.0。这会调整高斯分布函数中的 sigma 变量。
- 模糊半径作为图像宽度的分数:
- blurRadiusAsFractionOfImageHeight:设置这些属性将允许模糊半径随图像大小缩放
- blurPasses:顺序模糊传入图像的次数。通过的次数越多,过滤器越慢。
-
GPUImageGaussianSelectiveBlurFilter:将焦点保留在圆形区域内的高斯模糊
- blurRadiusInPixels:用于模糊的半径(以像素为单位),默认值为 5.0。这会调整高斯分布函数中的 sigma 变量。
- excludeCircleRadius:从模糊中排除的圆形区域的半径
- excludeCirclePoint:从模糊中排除的圆形区域的中心
- excludeBlurSize : 模糊部分和清晰圆圈之间的区域大小
- aspectRatio:图像的纵横比,用于调整对焦区域的圆度。默认情况下,这与图像纵横比匹配,但您可以覆盖该值。
-
GPUImageGaussianBlurPositionFilter : GPUImageGaussianSelectiveBlurFilter 的逆函数,仅在特定圆圈内应用模糊
- blurSize:模糊大小的乘数,范围从 0.0 到 up,默认值为 1.0
- blurCenter : 模糊中心,默认为 0.5, 0.5
- blurRadius : 模糊的半径,默认为 1.0
-
GPUImageiOSBlurFilter:尝试在控制中心等位置复制 iOS 7 上使用的背景模糊。
- blurRadiusInPixels:用于模糊的半径(以像素为单位),默认值为 12.0。这会调整高斯分布函数中的 sigma 变量。
- 饱和度:饱和度范围从 0.0(完全去饱和)到 2.0(最大饱和度),0.8 为正常水平
- 下采样:下采样的程度,然后对输入图像进行上采样以最小化高斯模糊内的计算,默认值为 4.0。
-
GPUImageMedianFilter:在 3x3 区域上取三个颜色分量的中值
-
GPUImageBilateralFilter:双边模糊,它试图模糊相似的颜色值,同时保留锐利的边缘
- texelSpacingMultiplier : 纹素读取间距的倍数,范围从 0.0 到上,默认为 4.0
- distanceNormalizationFactor:中心颜色和样本颜色之间距离的归一化因子,默认值为 8.0。
-
GPUImageTiltShiftFilter:模拟倾斜移位镜头效果
- blurRadiusInPixels:底层模糊的半径,以像素为单位。默认情况下为 7.0。
- topFocusLevel : 对焦区域顶部在图像中的归一化位置,该值应低于 bottomFocusLevel,默认 0.4
- bottomFocusLevel : 对焦区域底部在图像中的归一化位置,该值应高于 topFocusLevel,默认 0.6
- focusFallOffRate:图像远离对焦区域变得模糊的速率,默认 0.2
-
GPUImage3x3ConvolutionFilter:对图像运行 3x3 卷积核
- convolutionKernel:卷积核是一个 3x3 值矩阵,应用于像素及其周围的 8 个像素。矩阵按行优先顺序指定,左上角的像素为 one.one,右下角的像素为 three.three。如果矩阵中的值加起来不等于 1.0,图像可能会变亮或变暗。
-
GPUImageSobelEdgeDetectionFilter:索贝尔边缘检测,边缘以白色突出显示
- 纹素宽度:
- texelHeight:这些参数影响检测到的边缘的可见性
- edgeStrength:调整过滤器的动态范围。较高的值会导致更强的边缘,但会使强度色彩空间饱和。默认值为 1.0。
-
GPUImagePrewittEdgeDetectionFilter : Prewitt 边缘检测,边缘以白色突出显示
- 纹素宽度:
- texelHeight:这些参数影响检测到的边缘的可见性
- edgeStrength:调整过滤器的动态范围。较高的值会导致更强的边缘,但会使强度色彩空间饱和。默认值为 1.0。
-
GPUImageThresholdEdgeDetectionFilter:执行 Sobel 边缘检测,但应用阈值而不是提供渐变强度值
- 纹素宽度:
- texelHeight:这些参数影响检测到的边缘的可见性
- edgeStrength:调整过滤器的动态范围。较高的值会导致更强的边缘,但会使强度色彩空间饱和。默认值为 1.0。
- threshold:任何高于此阈值的边缘都将是黑色的,任何低于该阈值的边缘都是白色的。范围从 0.0 到 1.0,默认值为 0.8
-
GPUImageCannyEdgeDetectionFilter:这使用完整的 Canny 过程来突出显示一个像素宽的边缘
- 纹素宽度:
- texelHeight:这些参数影响检测到的边缘的可见性
- blurRadiusInPixels:高斯模糊的基础模糊半径。默认值为 2.0。
- blurTexelSpacingMultiplier:底层模糊纹素间距乘数。默认值为 1.0。
- upperThreshold:任何梯度幅度高于此阈值的边缘都将通过并显示在最终结果中。默认值为 0.4。
- lowerThreshold:梯度幅值低于此阈值的任何边缘都将失败并从最终结果中删除。默认值为 0.1。
-
GPUImageHarrisCornerDetectionFilter:在输入图像上运行 Harris 角点检测算法,并生成一个图像,其中这些角点为白色像素,其他所有像素为黑色。可以设置 cornersDetectedBlock,您将在该回调中获得一个角列表(在标准化的 0..1 X,Y 坐标中),用于您想要执行的任何其他操作。
- blurRadiusInPixels:底层高斯模糊的半径。默认值为 2.0。
- sensitivity:一个内部比例因子,用于调整过滤器中生成的转角图的动态范围。默认值为 5.0。
- threshold:点被检测为角点的阈值。这可能会根据尺寸、照明条件和 iOS 设备相机类型而有很大差异,因此可能需要进行一些试验才能适合您的情况。默认值为 0.20。
-
GPUImageNobleCornerDetectionFilter:在 Harris 角检测器上运行 Noble 变体。它的行为与上述 Harris 检测器相同。
- blurRadiusInPixels:底层高斯模糊的半径。默认值为 2.0。
- sensitivity:一个内部比例因子,用于调整过滤器中生成的转角图的动态范围。默认值为 5.0。
- threshold:点被检测为角点的阈值。这可能会根据尺寸、照明条件和 iOS 设备相机类型而有很大差异,因此可能需要进行一些试验才能适合您的情况。默认值为 0.2。
-
GPUImageShiTomasiCornerDetectionFilter:运行 Shi-Tomasi 特征检测器。它的行为与上述 Harris 检测器相同。
- blurRadiusInPixels:底层高斯模糊的半径。默认值为 2.0。
- sensitivity:一个内部比例因子,用于调整过滤器中生成的转角图的动态范围。默认值为 1.5。
- threshold:点被检测为角点的阈值。这可能会根据尺寸、照明条件和 iOS 设备相机类型而有很大差异,因此可能需要进行一些试验才能适合您的情况。默认值为 0.2。
-
GPUImageNonMaximumSuppressionFilter:目前仅用作 Harris 角点检测过滤器的一部分,这将对每个像素周围的 1 像素框进行采样,并确定中心像素的红色通道是否是该区域的最大值。如果是,它会留下来。如果不是,则将所有颜色分量设置为 0。
-
GPUImageXYDerivativeFilter:Harris 角点检测过滤器中的一个内部组件,计算该像素左右像素的平方差、该像素上下像素的平方差,以及这两个差的乘积。
-
GPUImageCrosshairGenerator:这会在图像上绘制一系列十字准线,最常用于识别机器视觉特征。它不像其他滤镜那样接收标准图像,而是接收其 -renderCrosshairsFromArray:count: 方法中的一系列点,该方法执行实际绘图。您将需要强制此过滤器以您需要的特定输出大小呈现。
- crosshairWidth:要在屏幕上绘制的十字准线的宽度(以像素为单位)。
-
GPUImageDilationFilter:这执行图像膨胀操作,其中矩形邻域中红色通道的最大强度用于该像素的强度。要采样的矩形区域的半径在初始化时指定,范围为 1-4 像素。这是为了与灰度图像一起使用,它扩展了明亮的区域。
-
GPUImageRGBDilationFilter:这与 GPUImageDilationFilter 相同,只是它作用于所有颜色通道,而不仅仅是红色通道。
-
GPUImageErosionFilter:这执行图像侵蚀操作,其中矩形邻域中红色通道的最小强度用于该像素的强度。要采样的矩形区域的半径在初始化时指定,范围为 1-4 像素。这是为了与灰度图像一起使用,它扩展了黑暗区域。
-
GPUImageRGBErosionFilter:这与 GPUImageErosionFilter 相同,只是它作用于所有颜色通道,而不仅仅是红色通道。
-
GPUImageOpeningFilter:这对图像的红色通道执行腐蚀,然后是相同半径的膨胀。半径在初始化时设置,范围为 1-4 像素。这会过滤掉较小的明亮区域。
-
GPUImageRGBOpeningFilter:这与 GPUImageOpeningFilter 相同,除了它作用于所有颜色通道,而不仅仅是红色通道。
-
GPUImageClosingFilter:这对图像的红色通道执行膨胀,然后是相同半径的腐蚀。半径在初始化时设置,范围为 1-4 像素。这会过滤掉较小的暗区。
-
GPUImageRGBClosingFilter:这与 GPUImageClosingFilter 相同,只是它作用于所有颜色通道,而不仅仅是红色通道。
-
GPUImageLocalBinaryPatternFilter:这对周围 8 个像素的红色通道与中心像素的红色通道的强度进行比较,将比较结果编码为成为该像素强度的位串。最不重要的位是右上角的比较,逆时针旋转到最右边的比较结束。
-
GPUImageLowPassFilter:这对传入的视频帧应用低通滤波器。这基本上是累积先前帧与当前帧的加权滚动平均值。这可用于视频降噪、添加运动模糊或用于创建高通滤波器。
- filterStrength:这控制了以前累积的帧与当前帧混合的程度。范围从 0.0 到 1.0,默认值为 0.5。
-
GPUImageHighPassFilter:这对传入的视频帧应用高通滤波器。这是低通滤波器的逆过程,显示当前帧与之前帧的加权滚动平均值之间的差异。这对于运动检测最有用。
- filterStrength:这控制了先前累积帧混合的程度,然后从当前帧中减去。范围从 0.0 到 1.0,默认值为 0.5。
-
GPUImageMotionDetector:这是一个基于高通滤波器的运动检测器。您设置 motionDetectionBlock 并在每个传入帧上为您提供场景中任何检测到的运动的质心(在标准化的 X、Y 坐标中)以及场景的运动强度。
- lowPassFilterStrength:它控制在幕后使用的低通滤波器的强度,以建立与传入帧进行比较的基线。范围从 0.0 到 1.0,默认值为 0.5。
-
GPUImageHoughTransformLineDetector:使用 Hough 变换到平行坐标空间来检测图像中的线。这种方法完全基于 PC 线过程,该过程由布尔诺科技大学的 Graph@FIT 研究小组开发,并在他们的出版物中进行了描述:M. Dubská、J. Havel 和 A. Herout。使用平行坐标和 OpenGL 实时检测线。SCCG 2011 会议记录,布拉迪斯拉发,SK,p. 7 ( medusa.fit.vutbr.cz/public/data… ) 和 M. Dubská, J . 哈维尔和A.赫鲁特。PClines - 使用平行坐标的线检测。2011 年 IEEE 计算机视觉和模式识别会议 (CVPR),p. 1489- 1494 (medusa.fit.vutbr.cz/public/data…).
- edgeThreshold:一个阈值,对于该阈值,点被检测为属于用于确定线的边缘。默认值为 0.9。
- lineDetectionThreshold:检测到局部最大值属于平行坐标空间中的一条线的阈值。默认值为 0.20。
- linesDetectedBlock:此块在检测线时调用,通常在每个处理过的帧上调用。包含 m、b 对 (y=mx+b) 中的归一化斜率和截距的 AC 数组被传入,以及检测到的行数计数和视频帧的当前时间戳。
-
GPUImageLineGenerator:生成可以覆盖场景的线条的辅助类。可以使用 -setLineColorRed:green:blue 调整这些线条的颜色:
- lineWidth:线条的宽度,以像素为单位,默认为 1.0。
-
GPUImageMotionBlurFilter:对图像应用定向运动模糊
- blurSize:模糊大小的乘数,范围从 0.0 到 up,默认值为 1.0
- blurAngle:模糊的角度方向,以度为单位。默认为 0 度。
-
GPUImageZoomBlurFilter:对图像应用定向运动模糊
- blurSize:模糊大小的乘数,范围从 0.0 到 up,默认值为 1.0
- blurCenter:模糊的归一化中心。(0.5, 0.5) 默认
混合模式
-
GPUImageChromaKeyBlendFilter:有选择地用第二张图像替换第一张图像中的颜色
- thresholdSensitivity:颜色匹配需要与要替换的目标颜色有多接近(默认为 0.4)
- smoothing:颜色匹配的平滑度(默认为 0.1)
-
GPUImageDissolveBlendFilter:应用两个图像的溶解混合
- mix:第二个图像覆盖第一个图像的程度(0.0 - 1.0,默认为 0.5)
-
GPUImageMultiplyBlendFilter:应用两个图像的乘法混合
-
GPUImageAddBlendFilter:应用两个图像的加法混合
-
GPUImageSubtractBlendFilter:应用两个图像的减法混合
-
GPUImageDivideBlendFilter:应用两个图像的分割混合
-
GPUImageOverlayBlendFilter:应用两个图像的叠加混合
-
GPUImageDarkenBlendFilter:通过取图像之间每个颜色分量的最小值来混合两个图像
-
GPUImageLightenBlendFilter:通过取图像之间每个颜色分量的最大值来混合两个图像
-
GPUImageColorBurnBlendFilter:应用两个图像的颜色加深混合
-
GPUImageColorDodgeBlendFilter:应用两个图像的颜色减淡混合
-
GPUImageScreenBlendFilter:应用两个图像的屏幕混合
-
GPUImageExclusionBlendFilter:应用两个图像的排除混合
-
GPUImageDifferenceBlendFilter:应用两个图像的差异混合
-
GPUImageHardLightBlendFilter:应用两个图像的强光混合
-
GPUImageSoftLightBlendFilter:应用两个图像的柔光混合
-
GPUImageAlphaBlendFilter:根据第二个的 alpha 通道将第二个图像混合到第一个图像上
- mix:第二个图像覆盖第一个图像的程度(0.0 - 1.0,默认值为 1.0)
-
GPUImageSourceOverBlendFilter:在两个图像的混合上应用源
-
GPUImageColorBurnBlendFilter:应用两个图像的颜色加深混合
-
GPUImageColorDodgeBlendFilter:应用两个图像的颜色减淡混合
-
GPUImageNormalBlendFilter:应用两个图像的正常混合
-
GPUImageColorBlendFilter:应用两个图像的颜色混合
-
GPUImageHueBlendFilter:应用两个图像的色调混合
-
GPUImageSaturationBlendFilter:应用两个图像的饱和度混合
-
GPUImageLuminosityBlendFilter:应用两个图像的光度混合
-
GPUImageLinearBurnBlendFilter:应用两个图像的线性加深混合
-
GPUImagePoissonBlendFilter:应用两个图像的泊松混合
- mix:混合范围从 0.0(仅图像 1)到 1.0(仅图像 2 渐变),1.0 为正常级别
- numIterations:传播梯度的次数。如果您想接近收敛,可以将其调到 100 甚至 1000。是的,这会很慢。
-
GPUImageMaskFilter:使用另一个图像遮盖一个图像
视觉效果
-
GPUImagePixellateFilter:对图像或视频应用像素化效果
- fractionalWidthOfAPixel:像素有多大,作为图像宽度和高度的分数(0.0 - 1.0,默认 0.05)
-
GPUImagePolarPixellateFilter:基于极坐标而不是笛卡尔坐标对图像或视频应用像素化效果
- center : 应用像素化的中心,默认为 (0.5, 0.5)
- pixelSize:分数像素大小,分为宽度和高度分量。默认值为 (0.05, 0.05)
-
GPUImagePolkaDotFilter:将图像分解为规则网格内的彩色点
- fractionalWidthOfAPixel:点有多大,作为图像宽度和高度的一部分(0.0 - 1.0,默认 0.05)
- dotScaling:每个网格空间被点占用的比例,从 0.0 到 1.0,默认值为 0.9。
-
GPUImageHalftoneFilter:对图像应用半色调效果,如新闻印刷
- fractionalWidthOfAPixel:半色调点有多大,作为图像宽度和高度的分数(0.0 - 1.0,默认 0.05)
-
GPUImageCrosshatchFilter:这会将图像转换为黑白交叉影线图案
- crossHatchSpacing:用作剖面线间距的图像的小数宽度。默认值为 0.03。
- lineWidth:交叉影线的相对宽度。默认值为 0.003。
-
GPUImageSketchFilter:将视频转换为草图。这只是颜色反转的 Sobel 边缘检测滤波器
- 纹素宽度:
- texelHeight:这些参数影响检测到的边缘的可见性
- edgeStrength:调整过滤器的动态范围。较高的值会导致更强的边缘,但会使强度色彩空间饱和。默认值为 1.0。
-
GPUImageThresholdSketchFilter : 和素描滤镜一样,只是对边缘进行阈值处理,而不是灰度化
- 纹素宽度:
- texelHeight:这些参数影响检测到的边缘的可见性
- edgeStrength:调整过滤器的动态范围。较高的值会导致更强的边缘,但会使强度色彩空间饱和。默认值为 1.0。
- threshold:任何高于此阈值的边缘都将是黑色的,任何低于该阈值的边缘都是白色的。范围从 0.0 到 1.0,默认值为 0.8
-
GPUImageToonFilter:这使用 Sobel 边缘检测在对象周围放置黑色边框,然后它量化图像中存在的颜色以赋予图像类似卡通的质量。
- 纹素宽度:
- texelHeight:这些参数影响检测到的边缘的可见性
- threshold:边缘检测的灵敏度,值越小越灵敏。范围从 0.0 到 1.0,默认值为 0.2
- quantizationLevels:最终图像中要表示的颜色级别数。默认值为 10.0
-
GPUImageSmoothToonFilter:这使用与 GPUImageToonFilter 类似的过程,只是它在卡通效果之前使用高斯模糊来平滑噪声。
- 纹素宽度:
- texelHeight:这些参数影响检测到的边缘的可见性
- blurRadiusInPixels:底层高斯模糊的半径。默认值为 2.0。
- threshold:边缘检测的灵敏度,值越小越灵敏。范围从 0.0 到 1.0,默认值为 0.2
- quantizationLevels:最终图像中要表示的颜色级别数。默认值为 10.0
-
GPUImageEmbossFilter:对图像应用浮雕效果
- intensity : 压花的强度,从 0.0 到 4.0,1.0 为正常水平
-
GPUImagePosterizeFilter:这会将颜色动态范围减少到指定的步数,从而使图像具有卡通般的简单阴影。
- colorLevels:将图像空间缩小到的颜色级别数。范围从 1 到 256,默认值为 10。
-
GPUImageSwirlFilter:在图像上创建漩涡失真
- radius:从中心开始应用扭曲的半径,默认值为 0.5
- center:图像的中心(在 0 - 1.0 的标准化坐标中)围绕其旋转,默认值为 (0.5, 0.5)
- angle:应用于图像的扭曲量,默认值为 1.0
-
GPUImageBulgeDistortionFilter:在图像上创建凸起失真
- radius:从中心开始应用扭曲的半径,默认值为 0.25
- center:图像的中心(在 0 - 1.0 的规范化坐标中)围绕其扭曲,默认值为 (0.5, 0.5)
- scale:要应用的失真量,从 -1.0 到 1.0,默认值为 0.5
-
GPUImagePinchDistortionFilter:创建图像的收缩失真
- radius:从中心开始应用扭曲的半径,默认值为 1.0
- center:图像的中心(在 0 - 1.0 的规范化坐标中)围绕其扭曲,默认值为 (0.5, 0.5)
- scale:要应用的失真量,从 -2.0 到 2.0,默认值为 1.0
-
GPUImageStretchDistortionFilter:创建图像的拉伸失真
- center:图像的中心(在 0 - 1.0 的规范化坐标中)围绕其扭曲,默认值为 (0.5, 0.5)
-
GPUImageSphereRefractionFilter:模拟通过玻璃球体的折射
- center:应用扭曲的中心,默认值为 (0.5, 0.5)
- radius:扭曲的半径,范围从0.0到1.0,默认为0.25
- refractiveIndex:球体的折射率,默认值为 0.71
-
GPUImageGlassSphereFilter : 与 GPUImageSphereRefractionFilter 相同,只是图像没有反转,玻璃边缘有一点点磨砂
- center:应用扭曲的中心,默认值为 (0.5, 0.5)
- radius:扭曲的半径,范围从0.0到1.0,默认为0.25
- refractiveIndex:球体的折射率,默认值为 0.71
-
GPUImageVignetteFilter:执行渐晕效果,在边缘淡出图像
- vignetteCenter : tex 坐标 (CGPoint) 中小插图的中心,默认值为 0.5, 0.5
- vignetteColor:用于小插图的颜色(GPUVector3),默认为黑色
- vignetteStart:距离晕影效果开始的中心的归一化距离,默认值为 0.5
- vignetteEnd:与晕影效果结束的中心的归一化距离,默认值为 0.75
-
GPUImageKuwaharaFilter:Kuwahara 图像抽象,取自 Kyprianidis 等人的作品。阿尔。在 GPU Pro 系列中的出版物“GPU 上的各向异性 Kuwahara 过滤”中。这会生成类似油画的图像,但计算量极大,因此在 iPad 2 上渲染帧可能需要几秒钟。这可能最适合静态图像。
- radius:在整数中,指定在应用过滤器时要测试的中心像素的像素数,默认值为 4。更高的值创建更抽象的图像,但以更长的处理时间为代价。
-
GPUImageKuwaharaRadius3Filter:Kuwahara 过滤器的修改版本,经过优化以仅在三个像素的半径范围内工作
-
GPUImagePerlinNoiseFilter:生成充满 Perlin 噪声的图像
- 颜色开始:
- colorFinish:正在生成的噪声的颜色范围
- scale:生成的噪声的缩放比例
-
GPUImageCGAColorspaceFilter : 模拟 CGA 显示器的色彩空间
-
GPUImageMosaicFilter:此过滤器采用输入图块集,图块的亮度必须上升。它会查看输入图像,并根据输入图块的亮度用输入图块替换每个显示图块。这个想法是复制在其他应用程序中看到的 ASCII 视频过滤器,但 tileset 可以是任何东西。
- 输入图块大小:
- 瓷砖数:
- 显示图块大小:
- 上色:
-
GPUImageJFAVoronoiFilter:生成 Voronoi 映射,供后期使用。
- sizeInPixels:单个元素的大小
-
GPUImageVoronoiConsumerFilter:接受 Voronoi 地图,并使用它来过滤传入的图像。
- sizeInPixels:单个元素的大小
如上所述,您还可以使用类似 C 的 OpenGL 着色语言轻松编写自己的自定义滤镜。
示例应用程序
几个示例应用程序与框架源捆绑在一起。大多数都与 iPhone 和 iPad 级设备兼容。它们试图展示框架的各个方面,并且应该在框架开发期间用作 API 的最佳示例。这些包括:
简单图像过滤器
捆绑的 JPEG 图像在启动时加载到应用程序中,对其应用过滤器,并将结果呈现到屏幕上。此外,此示例还展示了两种获取图像、过滤图像并将其保存到磁盘的方法。
简单视频过滤器
Pixellate 过滤器应用于实时视频流,带有 UISlider 控件,可让您调整实时视频的像素大小。
简单视频文件过滤器
从磁盘加载电影文件,对其应用反锐化蒙版过滤器,并将过滤结果重新编码为另一部电影。
多视图过滤器示例
从单个摄像机源中,四个视图填充了应用于摄像机的实时过滤器。一个只是直接的摄像机视频,一个是预编程的棕褐色调,两个是基于着色器程序的自定义滤镜。
过滤器展示柜
这演示了 GPUImage 提供的每个过滤器。
基准套件
这用于通过针对 CPU 绑定例程和 Core Image 进行测试来测试整个框架的性能。涉及静止图像和视频的基准测试针对这三者运行,结果显示在应用程序中。
立方体示例
这演示了 GPUImage 与 OpenGL ES 渲染交互的能力。从相机捕获帧,对其应用棕褐色滤镜,然后将它们送入纹理以应用于可以用手指旋转的立方体的表面。这个立方体又被渲染到一个纹理支持的帧缓冲区对象,并且该纹理被反馈到 GPUImage 以在渲染到屏幕之前对其应用像素化过滤器。
换句话说,这个应用程序的路径是相机 -> 棕褐色调滤镜 -> 立方体 -> 像素化滤镜 -> 显示。
颜色对象跟踪
来自www.sunsetlakesoftware.com/2010/10/22/…的我的 ColorTracking 示例版本移植到使用 GPUImage,这个应用程序使用场景中的颜色来从实时摄像头源中跟踪对象。您可以在四种视图之间切换,包括原始摄像头源、像素与白色颜色阈值匹配的摄像头源、位置被编码为通过阈值测试的像素内的颜色的处理视频,以及最后的实时视频源跟踪所选颜色的点。轻敲屏幕会改变要跟踪的颜色,以匹配您手指下像素的颜色。在屏幕上点击并拖动可或多或少地调整颜色阈值。这在第二个颜色阈值视图上最为明显。
目前,最后一步的所有颜色平均处理都是在 CPU 上完成的,所以这部分非常慢。