Существует несколько вопросов/ответов о том, как получить пиксельный цвет изображения для данной точки. Тем не менее, все эти ответы очень медленные (100-500 мс) для больших изображений (например, даже 1000 х 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
, который я создаю:
Теперь этот метод в некоторых неофициальных тестах работает лучше, но он все еще не так быстр, я хочу, чтобы это было. Кто-нибудь знает о более быстром способе получения базовых данных пикселей?