1

两者之间的真正区别是什么:

[GPUImageFilter imageFromCurrentlyProcessedOutputWithOrientation]

[GPUImageFilter imageByFilteringImage:]

... 除了 imageByFilteringImage 需要 NSImage *?

速度有区别吗?使用 imageByFilterImage 是否允许您将过滤器设置为可以重复使用的“管道”或类似的东西?还是您需要使用 imageFromCurrentlyProcessedOutputWithOrientation 来处理 BlendFilters(它需要多个图像输入)?

我的理解是,如果你使用 imageFromCurrentlyProcessedOutputWithOrientation,每次要处理新图像时都需要创建一个新的过滤器。这个对吗?

4

1 回答 1

4

开源库的好处之一是我们可以查看这些方法背后的代码。它比以前复杂一点,因为它已被扩展以涵盖 CGImageRefs 被用作基础的一般情况,但这里是核心-imageByFilteringImage:

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter];

[self prepareForImageCapture];

[stillImageSource addTarget:(id<GPUImageInput>)self];
[stillImageSource processImage];

CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:orientation];

[stillImageSource removeTarget:(id<GPUImageInput>)self];
return processedImage;

-imageByFilteringImage:在其中有效地使用-imageFromCurrentlyProcessedOutputWithOrientation:(实际上是它的 CGImage 变体)。

它的作用是接收您的 UIImage 或 NSImage(iOS 或 Mac),从中创建一个临时 GPUImagePicture 实例,从该实例构建一个过滤器链到您当前的过滤器,设置它以使用更快的图像捕获-prepareForImageCapture,处理图像,和最后通过-newCGImageFromCurrentlyProcessedOutputWithOrientation:.

如您所见,这只不过是一种方便的方法。事实上,如果重复使用它可能会对性能产生不利影响,因为每次都创建一个新的 GPUImagePicture 实例(它必须在创建时将 UIImage 作为纹理上传)的开销。

如果您想要简单的一次性处理,-imageByFilteringImage:那很好。但是,一般来说,如果您想以多种方式处理同一张图像,或者如果您想进行任何类型的混合或实时预览,您将需要创建自己的过滤器链来执行比单个过滤器更复杂的操作。效果。

-prepareForImageCapture也有一些副作用。虽然它通过在过滤器的输出纹理和本地像素缓冲区之间创建内存映射大大减少了内存使用并提高了图像提取速度,但该映射将过滤器锁定为在提取的 UIImage 被释放之前无法处理任何其他内容。如果您创建手动过滤器链,您可以决定不使用此调用。

于 2013-07-31T15:41:39.593 回答