1

我正在尝试对像素进行迭代以在不使用 OpenGL 的情况下更改 UIImage 的 RGBA 值。我尝试使用以下代码测试迭代性能,但非常不高兴。似乎我每秒只能进行几千次迭代。对于具有数十万像素的 UIImage,这将花费太长时间......有人对如何提高性能或此类操作通常需要多长时间有任何建议吗?

-(UIImage*)modifyPixels:(UIImage*)originalImage
{
    NSData* pixelData = (NSData*)CGDataProviderCopyData(CGImageGetDataProvider(originalImage.CGImage));
    void* pixelBytes = [pixelData bytes];

    // Take away the red pixel, assuming 32-bit RGBA
    for(int i = 0; i < [pixelData length]; i += 4) {
        NSLog(@" %ith iteration (%i / %i / %i / %i)", i, pixelData[i], pixelData[i+1], pixelData[i+2], pixelData[i+3]);
    }

    //NSData* newPixelData = [NSData dataWithBytes:pixelBytes length:[pixelData length]];
    //UIImage* newImage = [UIImage imageWithData:newPixelData]; 

    return originalImage;    
}
4

3 回答 3

5

不要[pixelData length]在循环中调用。编译器无法知道此消息的结果是常量,因此它将调用该方法。

于 2009-08-30T02:43:57.323 回答
4

您的 NSLog 语句将大大减慢图像迭代过程。一个好的测试是反转图像而不是注销像素数据。同样计算每次迭代的数据长度也会减慢速度。将长度缓存在局部变量中并改用它。

于 2009-08-30T02:36:32.407 回答
0

您的代码的基本问题是您将像素视为 4 字节元素。作为第一步,您需要做的是将一个 4 字节的块读取为 1 个字。使用 uint32_t 类型,然后一次将 1 个字读入寄存器。这导致内存读取操作减少 4 倍,然后每个像素存储在 1 个 32 位寄存器中。每个字包含 RGBA,每个分量占用 32 位字的 8 位。然后,您需要使用位移操作来操作组件。这是一篇博文,向您展示了如何使用 iOS 原生 BGRA 格式像素pixel_binary_layout. 无论您的像素逻辑做什么,您都需要将结果写出来,然后检查这些结果以确保一切都按预期工作。在 ARM 芯片上读取和写入整个字的速度比读取字节数的 4 倍要快得多,因此您应该会看到很大的改进。

于 2013-08-22T07:50:32.750 回答