我的像素化图像处理算法有一些问题。

我从一开始就将图像加载到unsigned char*类型的数组中
之后,需要时,我可以修改此数据并必须更新映像。
此更新花费的时间太长。这就是我的做法:

CGDataProviderRef dataProvider = CGProviderCrateWithData(.....);
CGImageRef cgImage = CGImageCreate(....);
[imageView setImage:[UIImage imageWithCGImage:cgImage]]];

一切正常,但是处理大图像非常慢。我尝试在后台线程上运行它,但这没有帮助。

因此,基本上,这需要太长时间。有谁知道如何改进它?

最佳答案

正如其他人所建议的那样,您需要将这项工作从CPU转移到GPU,以便在这些移动设备上获得任何形式的处理性能。

为此,我创建了an open source framework for iOS called GPUImage,使这种加速图像处理相对简单。它确实需要OpenGL ES 2.0支持,但是最近几年售出的每台iOS设备都具有此功能(统计数据表明,该领域的所有iOS设备中大约有97%是这样做的)。

作为该框架的一部分,我捆绑的初始过滤器之一是像素化过滤器。 SimpleVideoFilter示例应用程序显示了如何使用此功能,并带有控制已处理图像中像素宽度的滑块:

此过滤器是带有以下GLSL代码的片段着色器的结果:

 varying highp vec2 textureCoordinate;
 uniform sampler2D inputImageTexture;
 uniform highp fractionalWidthOfPixel;

 void main()
 {
    highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel);

    highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor);
    gl_FragColor = texture2D(inputImageTexture, samplePos );
 }

在我的基准测试中,此类基于GPU的过滤器的性能比iOS上用于图像和视频的等效CPU绑定处理例程快6到24倍。上面链接的框架应该相当容易地集成到应用程序中,并且您可以随意选择源代码来自定义。

07-28 02:20
查看更多