有一些关于如何获取给定点的图像像素颜色的问题/答案。然而,所有这些答案都对于大型图像(即使是1000 x 1300这么小)都非常缓慢(100-500ms)。
大多数代码示例都会绘制到图像上下文中。当实际绘制发生时,所有这些方法都需要时间:
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
实例:
现在,在一些非正式测试中,此方法的性能表现要比我想象的要好,但仍然不够快。 有人知道更快获取底层像素数据的方法吗?