我们应该使用哪个CGImageAlphaInfo?

时间:2014-05-18 15:26:16

标签: ios macos performance core-graphics alpha-transparency

Quartz 2D programming guide定义了各种alpha存储模式的可用性:

enter image description here

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

对于非不透明的上下文,kCGImageAlphaPremultipliedFirstkCGImageAlphaPremultipliedLast

对于不透明的上下文,kCGImageAlphaNoneSkipFirstkCGImageAlphaNoneSkipLast

价值的选择会影响效果吗?

通常,我会看到kCGImageAlphaPremultipliedFirst表示非透明,kCGImageAlphaNoneSkipFirst表示不透明的上下文。有些人说这些表现更好,但我没有看到任何关于此的确凿证据或文件。

快速GitHub搜索显示开发人员优先于kCGImageAlphaPremultipliedFirstkCGImageAlphaPremultipliedLast优先于kCGImageAlphaNoneSkipLastkCGImageAlphaNoneSkipFirst优先于{{1}}。可悲的是,这只不过是轶事证据。

4 个答案:

答案 0 :(得分:7)

2014年WWDC的Apple工程师证实,我们应该使用kCGImageAlphaPremultipliedFirstkCGImageAlphaNoneSkipFirst,并确实会影响效果。

答案 1 :(得分:3)

最普遍使用的是RGBA格式(真彩色格式),其中Alpha字节位于描述像素的最后一个字节。 - kCGImageAlphaPremultipliedLast(32位)。并非所有设备都普遍支持所有格式。只是一个观察,但我从网上下载的所有png和jpeg图像都是RGBA(或者当我将PNG转换为UIImage时变成了那个) - 我从来没有虽然我知道它是可能的,但是在野外遇到了ARGB格式的文件。

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

答案 2 :(得分:0)

为获得最佳性能,每行和数据的字节数应与16个字节的倍数对齐。

每个组件的

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

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

每行

个字节:((每个组件的比特数*组件数+ 7个)/ 8)*宽度

来自CGBitmapContext.h:

  

像素的每个分量的位数由      ' bitsPerComponent&#39 ;.每个像素的字节数等于      '(bitsPerComponent *组件数+ 7)/ 8'。位图的每一行      由bytesPerRow' bytes, which must be at least width *字节组成      每像素'字节;另外,`bytesPerRow'必须是整数倍      每像素的字节数。

一旦你得到了你想要的像素格式和色彩空间的每行字节数,如果它可以被16整除,你应该处于良好的状态。如果你没有正确对齐,Quartz会为你执行一些优化,这会产生开销。对于额外的点,您还可以尝试优化每行的字节数,使其适合您要定位的架构上的L2缓存行。

Quartz 2D Programming Guide以及CGImage的文档都详细介绍了这一点。还有question可能是相关的。

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

答案 3 :(得分:0)

我正在使用kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big,效果很好。