在https://github.com/luisespinoza/LEColorPicker项目上工作,我试图使用项目GPUImage(https://github.com/BradLarson/GPUImage)从任意输入UIImage生成直方图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导致每个输入图像只有一条黑线。
那么,如何使用iOS GPUImage生成直方图UIImage的正确代码?
答案 0 :(得分:6)
您可以查看FilterShowcase示例,了解它在实践中应该如何工作。
GPUImageHistogramFilter接收图像并输出256x3图像,该图像对直方图进行编码(因为帧缓冲结构中不允许1像素高度,所以它的高度为3像素)。 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];
这会将生成的直方图可视化叠加在传入的摄像机视频之上。