我的像素化图像处理算法有一些问题。
我从一开始就将图像加载到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倍。上面链接的框架应该相当容易地集成到应用程序中,并且您可以随意选择源代码来自定义。