您可以查看 FilterShowcase 示例以了解这在实践中应该如何工作。
GPUImageHistogramFilter 接收图像并输出对直方图进行编码的 256x3 图像(它的高度为 3 像素,因为帧缓冲区构造中不允许 1 像素的高度)。R、G 和 B 值存储在该图像中心的 1 像素高的中央条纹中各自的颜色通道中。
要对此进行可视化,您需要使用 GPUImageHistogramGenerator,并将 GPUImageHistogramFilter 的输出输入其中。GPUImageHistogramGenerator 将直方图输入创建为图像的视觉表示。您确实需要使用-forceProcessingAtSize:
设置 GPUImageHistogramGenerator 输出图像的大小,因为默认情况下它没有设置大小。
另一个注意事项是,您需要在输入图像和 GPUImageHistogramFilter 之间设置某种虚拟过滤器。GPUImageHistogramFilter 目前依赖glReadPixels()
且仅适用于渲染内容,不适用于直接上传的图像或视频帧。
FilterShowcase 中为此使用的代码如下:
filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRGB];
GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init];
[videoCamera addTarget:gammaFilter];
[gammaFilter addTarget:filter];
GPUImageHistogramGenerator *histogramGraph = [[GPUImageHistogramGenerator alloc] init];
[histogramGraph forceProcessingAtSize:CGSizeMake(256.0, 330.0)];
[filter addTarget:histogramGraph];
GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
blendFilter.mix = 0.75;
[blendFilter forceProcessingAtSize:CGSizeMake(256.0, 330.0)];
[videoCamera addTarget:blendFilter];
[histogramGraph addTarget:blendFilter];
[blendFilter addTarget:filterView];
这会将生成的直方图可视化覆盖在传入的摄像机视频之上。