如何在图像上执行快速像素化滤镜?

Geo*_*rge 3 iphone image-processing ios

我的像素化图像处理算法有点问题.

我将图像从头开始加载到类型数组中.unsigned char* 之后,在需要时,我修改此数据并且必须更新图像.此更新需要很长时间.这就是我这样做的方式:

CGDataProviderRef dataProvider = CGProviderCrateWithData(.....);
CGImageRef cgImage = CGImageCreate(....);
[imageView setImage:[UIImage imageWithCGImage:cgImage]]];
Run Code Online (Sandbox Code Playgroud)

一切正常,但处理大图像的速度很慢.我尝试在后台线程上运行它,但这没有帮助.

所以基本上,这需要太长时间.有谁知道如何改进它?

Bra*_*son 16

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

为此,我为iOS创建了一个名为GPUImage的开源框架,这使得进行这种加速图像处理变得相对简单.它确实需要OpenGL ES 2.0支持,但过去几年销售的每台iOS设备都有这个(统计数据显示该领域97%的iOS设备都有).

作为该框架的一部分,我捆绑的初始过滤器之一是像素化过滤器.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 );
 }
Run Code Online (Sandbox Code Playgroud)

在我的基准测试中,像这样的基于GPU的过滤器比iOS上的图像和视频的等效CPU绑定处理例程快6-24倍.上面链接的框架应该很容易合并到一个应用程序中,并且源代码可以自由地供您自定义,无论您认为合适.