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

时间:2013-01-18 03:36:31

标签: iphone ios objective-c gpuimage

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的正确代码?

1 个答案:

答案 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];

这会将生成的直方图可视化叠加在传入的摄像机视频之上。