Ios 我们应该使用哪种CGImageAlphaInfo?

Ios 我们应该使用哪种CGImageAlphaInfo?,ios,macos,performance,core-graphics,alpha-transparency,Ios,Macos,Performance,Core Graphics,Alpha Transparency,定义了各种alpha存储模式的可用性: 我们应该在RGB上下文中使用哪些,以及为什么 对于非不透明上下文,kgimagealphapremultipliedfirst或kgimagealphapremultipliedflast 对于不透明的上下文,kgimagealphanoneskipfirst或kgimagealphanoneskiplast 价值选择是否会影响绩效? 通常,对于非不透明的上下文,我会看到kgimagealphanoneskipffirst,对于不透明的上下文,我会看到k

定义了各种alpha存储模式的可用性:

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

对于非不透明上下文,
kgimagealphapremultipliedfirst
kgimagealphapremultipliedflast

对于不透明的上下文,
kgimagealphanoneskipfirst
kgimagealphanoneskiplast

价值选择是否会影响绩效?

通常,对于非不透明的上下文,我会看到
kgimagealphanoneskipffirst
,对于不透明的上下文,我会看到
kgimagealphanoneskipffirst
。有些人说这些性能更好,但我没有看到任何关于这方面的确凿证据或文件


快速的GitHub搜索显示,开发者喜欢
kGimageAlphaNoneSkipFirst
而不是
kGimageAlphaPremultipledLast
kGimageAlphaNoneSkiplast
而不是
kGimageAlphaNoneSkipfirst
。遗憾的是,这只不过是轶事证据。

最普遍使用的是RGBA格式(真彩色格式),其中Alpha字节位于描述像素的最后一个字节处。-KCGIMAGEAlphaPremultipledLast(32位)。并非所有设备都支持所有格式。只是观察一下,但我从web下载的所有处理过的png和jpeg图像都是RGBA(或者在我将png转换为UIImage时变成RGBA)-我从未在野外遇到过ARGB格式的文件,尽管我知道这是可能的


不同的格式会影响图像的文件大小和颜色质量(如果您不知道的话)以及图像质量,8位格式是黑白(灰度)的。这里可以找到所有这些格式的讨论:

为了获得最佳性能,您的每行字节数和数据应以16字节的倍数对齐

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

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

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

从CGBitmapContext.h:

像素的每个分量的位数由 “bitsPerComponent”。每个像素的字节数等于 “(bitsPerComponent*组件数量+7)/8”。位图的每一行 由
bytesPerRow'字节组成,必须至少为
width*字节
每像素字节数;此外,`bytesPerRow'必须是整数倍
每像素的字节数

一旦你得到了每行的字节数,并给出了你想要的像素格式和颜色空间,如果它可以被16整除,你的状态应该很好。如果没有正确对齐,Quartz将为您执行其中一些优化,这将产生开销。对于额外的点,您还可以尝试优化每行字节数,以适合目标体系结构上的二级缓存线

本手册以及的文档中详细介绍了这一点。还有一个可能是相关的


总之,最好在仪器中尝试不同的东西和配置。

由2014年WWDC上的一位苹果工程师确认,我们应该首先使用
kGimageAlphaPremultipledFirst
kGimageAlphaNoneSkipFirst
,它确实会影响性能。

我使用的是
kgimageAlphaPremultipledLast | kCGBitmapByteOrder32Big
,效果非常好

我敢打赌,根据可用的GPU硬件,“最佳”选项是不同的。由于我个人无法访问苹果在过去几年中提供的所有50种不同的GPU,因此我无法帮助您获得关于什么是最好的GPU的任何数据。编写一个应用程序,对其性能进行台架测试,并分析每个方法的精确颜色输出,然后在任何可用硬件上运行。各种选项定义了像素数据的计算和内部表示方式。。。例如,当从原始像素数据构建图像时(在c阵列中馈送),如果您选择了错误的alpha表示,则会产生巨大的差异。@AbhiBeckert这也是我的直觉,但我很高兴能对此进行确认或达成共识。我敢打赌,大多数开发人员只要复制
CGBitmapContextCreate
代码,如果他们使用的是正确的位图信息,就不会进行太多操作。@Volker使位图信息与原始数据格式匹配是有意义的,但是位图信息是否也会影响绘图性能?也许创建时的增益(可以在后台完成)在绘制时丢失(主线程)。我猜这将影响性能和准确性。视频卡,尤其是消费级视频卡,并不总是输出准确的颜色。这就是它们比在CPU上执行相同操作快得多的原因之一。它们只需要足够好,用户就不会注意到任何错误。如果你在意,那么你需要测试它。另外一件事——如果你使用核心图像过滤器——你会发现很多过滤器,特别是CIColorMatrix,都希望使用RGBA(真彩色)格式,不是你不能使用其他格式,而是你需要先转换它们……你好,保罗。ARGB通常用于iOS资产,尽管我不知道确切的原因。我认为你的回答应该是一个评论,因为它更多的是对颜色格式的解释,而不是试图回答我的问题。事实上,你对核心图像过滤器的评论比你的实际回答更符合问题。UIColor通常是RGBA,除了UIColor黑色或白色是单调的。我有一个处理大量图像的应用程序,大多数功能都需要RGBA。在那个大应用程序里。我从不需要处理任何ARBG对象。无论如何,我提到这篇文章是因为真彩色32位RGBA是公认的,并且是photoshop和其他常用图像软件的典型输出,使用RGBA可以确保与大量o