vImage_Buffer 仅描述像素数据的矩形数组。数据的类型(unorm8、float 等)是从对其进行操作的函数的名称中推断出来的。这一切都应该是相当清楚的。
从 vImage 的角度来看,频道顺序就是你所说的。对于大多数 vImage 函数,通道顺序无关紧要,因为所有通道都被视为相同。它们可能被命名为 _ARGB8888,但实际上,它们是 _XXXX8888。对于其他 vImage 函数(例如 PremultiplyData),只有一个通道被区别对待。在这种情况下,仅重要的是 alpha 通道出现在函数名称所描述的第一个或最后一个通道中。其他通道的顺序无关紧要,因为它们的处理方式相同。对于您正在谈论的特定功能,您的工作是了解红色、绿色和蓝色通道的顺序并相应地调整系数矩阵的顺序。
数据中的通道顺序可能首先由生成图像数据的任何内容设置。通常是 CoreGraphics / ImageIO。在那种情况下——它有点复杂——颜色通道顺序与 CGImageRef 颜色空间中的颜色顺序相匹配。基于 CGImage 位图信息,alpha 出现在第一个或最后一个(如果存在),其中一部分是 CGImageAlphaInfo。作为最后的复杂因素,整个事物可能会受到 16 位或 32 位字节序变换的影响。如果通道的大小小于字节序变换量(16 位或 32 位),则通道相对于彼此的顺序已根据字节序变换交换。到目前为止,最常见的情况是 BGRA unorm8 数据,它被编码为 ARGB 8 位数据,并在其上标记了 32 位小端变换。然而,由于 32 位端序变换,可能会获得每通道 16 位灰度 alpha 数据,其中 GA 顺序转置,这将同时相对于彼此交换 G 和 A,并将 16 位样本转换为 16-有点小端。(请注意,这在自然界中可能永远不会发生,因为您可以更清楚地将其分类为 alpha,首先使用 16 位小端变换。不过,编码是合法的。)
vImage_Utilities.h C 头文件中有一些示例(不确定 swift 版本)显示了常见 CG 编码的示例。