真正的区别是:
[GPUImageFilter imageFromCurrentlyProcessedOutputWithOrientation]
和[GPUImageFilter imageByFilteringImage:]
..。除了imageByFilteringImage需要一个NSImage *
速度有什么不同吗?使用imageByFilterImage是否允许您将过滤器设置为可以重用的“管道”或类似的东西?或者,您需要使用来处理BlendFilters (这需要多个图像输入)?
我的理解是,如果您使用imageFromCurrentlyProcessedOutputWithOrientation,,您需要在每次处理新图像时创建一个新的过滤器。这是正确的吗?
发布于 2013-07-31 15:41:39
开放源码库的优点之一是我们可以查看这些方法背后的代码。它比过去要复杂一些,因为它已经扩展到了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之前无法处理任何其他内容。如果创建手动筛选链,则可以决定不使用此调用。
https://stackoverflow.com/questions/17959328
复制相似问题