我们应该使用哪一个CGImageAlphaInfo?

Quartz 2D编程指南定义了各种alpha存储模式的可用性:

在这里输入图像说明

我们应该使用哪些RGB上下文, 为什么

对于不透明的上下文, kCGImageAlphaPremultipliedFirstkCGImageAlphaPremultipliedLast

对于不透明的上下文, kCGImageAlphaNoneSkipFirstkCGImageAlphaNoneSkipLast

价值的select是否影响绩效?

通常,我看到kCGImageAlphaPremultipliedFirst用于不透明,而kCGImageAlphaNoneSkipFirst用于不透明的上下文。 有些人表示这些performance更好,但我还没有看到有关这方面的任何确凿的证据或文件。

快速的GitHubsearch显示,开发者倾向于通过kCGImageAlphaPremultipliedFirstkCGImageAlphaPremultipliedLastkCGImageAlphaNoneSkipLast上执行kCGImageAlphaNoneSkipFirst 。 可悲的是,这仅仅是一个轶事证据。

苹果工程师在WWDC 2014确认我们应该使用kCGImageAlphaPremultipliedFirstkCGImageAlphaNoneSkipFirst ,并且确实会影响性能。

最普遍使用的是RGBA格式(真彩色格式),其中Alpha字节位于描述像素的最后一个字节处。 – kCGImageAlphaPremultipliedLast(32位)。 不是所有的格式都支持所有设备通用。只是一个观察,但我所处理的所有PNG和JPEG图像从网上下载都是RGBA(或转换成当我将PNG转换为UIImage) – 我从来没有碰到过一个ARGB格式的文件,尽pipe我知道这是可能的。

不同的格式会影响图像的文件大小和颜色质量(如果您不知道的话)和图像质量,8位格式是黑白的(灰度),所有这些的讨论可以在这里find: http ://en.wikipedia.org/wiki/Color_depth

为了获得最佳性能,每行和数据的字节数应该alignment到16个字节的倍数。

每个组件的位数:每个颜色组件使用的位数。 对于16位RGBA,16/4组件= 4。

每像素位数:至less每个组件的位数*组件数量

(每个组件的位数*组件的数量+7)/ 8)*宽度

从CGBitmapContext.h:

像素的每个分量的位数由“bitsPerComponent”指定。 每个像素的字节数等于'(bitsPerComponent *组件数+7)/ 8'。 位图的每一行由bytesPerRow' bytes, which must be at least组成, bytesPerRow' bytes, which must be at least为每个像素的宽度*字节; 另外,`bytesPerRow'必须是每个像素字节数的整数倍。

一旦给出了你想要的像素格式和色彩空间的每行字节数,如果它可以被16整除,你应该保持良好状态。 如果你没有正确的alignment,Quartz将会为你执行一些优化,这会招致开销。 对于额外的点,您还可以尝试优化每行的字节数以适应您所针对的体系结构的二级caching行。

在“ Quartz 2D编程指南 ”以及CGImage的文档中有很好的介绍 。 还有一个可能相关的问题 。

所有这一切,最好是在乐器中尝试不同的事物和个人资料。

我正在使用kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big和它的伟大工程。