如何使用iOS GPUImage生成直方图?

在https://github.com/luisespinoza/LolorPicker项目上工作,我想使用项目GPUImage(https://github.com/BradLarson/GPUImage)从任意inputUIImage生成直方图UIImage。

我正在使用的当前代码如下所示:

- (NSDictionary*)dictionaryWithColorsPickedFromImage:(UIImage *)image { GPUImageFilter *filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRGB]; UIImage *filteredImage = [filter imageByFilteringImage:image]; [UIImagePNGRepresentation(filteredImage) writeToFile:@"/Users/Luis/histogram.png" atomically:YES]; return nil; } 

问题是,histogram.png导致每个input图像只有一条黑线。

那么,如何使用iOS GPUImage生成直方图UIImage?

你可以看一下FilterShowcase的例子,看看在实际中这是如何工作的。

GPUImageHistogramFilter获取图像并输出一个256×3的图像,对直方图进行编码(由于帧缓冲区结构中不允许有1个像素的高度,因此高度为3像素)。 R,G和B值被存储在它们各自的颜色通道内,该图像的中心位于1像素高的中央条纹内。

为了可视化这个,你需要使用一个GPUImageHistogramGenerator,并把GPUImageHistogramFilter的输出提供给它。 GPUImageHistogramGenerator将直方图input的可视化表示形成为图像。 您需要使用-forceProcessingAtSize:设置GPUImageHistogramGenerator的输出图像的大小,因为它默认情况下没有设置大小。

另外一个小心的是,你需要在你的input图像和GPUImageHistogramFilter之间有一个虚拟的filter。 GPUImageHistogramFilter目前依赖于glReadPixels() ,它只适用于渲染的内容,而不是直接上传的图像或video帧。

在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]; 

这将生成的直方图可视化覆盖在传入的摄像机video之上。