关于如何获取给定点的图像像素颜色有许多问题/答案。但是,对于大图像(例如,即使小到 1000 x 1300),所有这些答案都非常慢(100-500 毫秒)。
那里的大多数代码示例都绘制到图像上下文。当实际抽签发生时,所有这些都需要时间:
CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage)
在 Instruments 中检查这一点会发现,绘制是通过从源图像中复制数据来完成的:
我什至尝试了另一种获取数据的方法,希望获取字节本身实际上会更有效。
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
我正在创建的实例:
现在,这种方法在一些非正式的测试中确实表现得更好,但它仍然没有我想要的那么快。 有谁知道获取底层像素数据的更快方法???