Quartz 2D programming guide定义了各种alpha存储模式的可用性:
我们应该将哪些用于RGB上下文,为什么?
对于非不透明的上下文,kCGImageAlphaPremultipliedFirst
或kCGImageAlphaPremultipliedLast
?
对于不透明的上下文,kCGImageAlphaNoneSkipFirst
或kCGImageAlphaNoneSkipLast
?
价值的选择会影响效果吗?
通常,我会看到kCGImageAlphaPremultipliedFirst
表示非透明,kCGImageAlphaNoneSkipFirst
表示不透明的上下文。有些人说这些表现更好,但我没有看到任何关于此的确凿证据或文件。
快速GitHub搜索显示开发人员优先于kCGImageAlphaPremultipliedFirst
而kCGImageAlphaPremultipliedLast
优先于kCGImageAlphaNoneSkipLast
。kCGImageAlphaNoneSkipFirst
优先于{{1}}。可悲的是,这只不过是轶事证据。
答案 0 :(得分:7)
2014年WWDC的Apple工程师证实,我们应该使用kCGImageAlphaPremultipliedFirst
或kCGImageAlphaNoneSkipFirst
,并确实会影响效果。
答案 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
,效果很好。