我们应该使用哪一个CGImageAlphaInfo?
Quartz 2D编程指南定义了各种alpha存储模式的可用性:
我们应该使用哪些RGB上下文, 为什么 ?
对于不透明的上下文, kCGImageAlphaPremultipliedFirst
或kCGImageAlphaPremultipliedLast
?
对于不透明的上下文, kCGImageAlphaNoneSkipFirst
或kCGImageAlphaNoneSkipLast
?
价值的select是否影响绩效?
通常,我看到kCGImageAlphaPremultipliedFirst
用于不透明,而kCGImageAlphaNoneSkipFirst
用于不透明的上下文。 有些人表示这些performance更好,但我还没有看到有关这方面的任何确凿的证据或文件。
快速的GitHubsearch显示,开发者倾向于通过kCGImageAlphaPremultipliedFirst
在kCGImageAlphaPremultipliedLast
和kCGImageAlphaNoneSkipLast
上执行kCGImageAlphaNoneSkipFirst
。 可悲的是,这仅仅是一个轶事证据。
苹果工程师在WWDC 2014确认我们应该使用kCGImageAlphaPremultipliedFirst
或kCGImageAlphaNoneSkipFirst
,并且确实会影响性能。
最普遍使用的是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
和它的伟大工程。