Есть ряд вопросов/ответов относительно того, как получить цвет пикселя изображения для заданной точки. Однако все эти ответы действительно медленные (100 -500 мс )для больших изображений (даже таких маленьких, как 1000 x 1300, например ).
Большинство примеров кода используют контекст изображения. Все они требуют времени, когда происходит фактическое рисование.:
CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage)
Изучение этого в «Инструментах» показывает, что рисование выполняется путем копирования данных из исходного изображения.:
Я даже пробовал другие способы получения данных, надеясь, что получение самих байтов на самом деле окажется гораздо более эффективным.
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
экземпляр, который я создаю:
Теперь, этот метод, в каком-то неофициальном тестировании работает лучше, но все еще не так быстро, как хотелось бы. Кто-нибудь знает еще более быстрый способ получения базовых данных пикселей???