Настройка производительности iOS :самый быстрый способ получить цвет пикселя для больших изображений

Есть ряд вопросов/ответов относительно того, как получить цвет пикселя изображения для заданной точки. Однако все эти ответы действительно медленные (100 -500 мс )для больших изображений (даже таких маленьких, как 1000 x 1300, например ).

Большинство примеров кода используют контекст изображения. Все они требуют времени, когда происходит фактическое рисование.:

CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage)

Изучение этого в «Инструментах» показывает, что рисование выполняется путем копирования данных из исходного изображения.:

enter image description here

Я даже пробовал другие способы получения данных, надеясь, что получение самих байтов на самом деле окажется гораздо более эффективным.

NSInteger pointX = trunc(point.x);
NSInteger pointY = trunc(point.y);
CGImageRef cgImage = CGImageCreateWithImageInRect(self.CGImage, 
                           CGRectMake(pointX * self.scale, 
                                      pointY * self.scale, 
                                      1.0f, 
                                      1.0f));

CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef data = CGDataProviderCopyData(provider);

CGImageRelease(cgImage);

UInt8* buffer = (UInt8*)CFDataGetBytePtr(data);

CGFloat red   = (float)buffer[0] / 255.0f;
CGFloat green = (float)buffer[1] / 255.0f;
CGFloat blue  = (float)buffer[2] / 255.0f;
CGFloat alpha = (float)buffer[3] / 255.0f;

CFRelease(data);

UIColor *pixelColor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];

return pixelColor;

Этот метод требует времени на копирование данных:

CFDataRef data = CGDataProviderCopyData(provider);

Похоже, что он тоже считывает данные с диска, а не CGImageэкземпляр, который я создаю:

enter image description here

Теперь, этот метод, в каком-то неофициальном тестировании работает лучше, но все еще не так быстро, как хотелось бы. Кто-нибудь знает еще более быстрый способ получения базовых данных пикселей???

11
задан Wayne Hartman 1 May 2012 в 22:31
поделиться