有什么方法可以从 swift 中的 vImage_Buffer 获取像素格式信息吗?

is there any way to get pixel format information from vImage_Buffer in swift?

我正在使用 vImage_Buffer 进行灰度转换等图像处理。 当我将图像转换为灰度时,我需要知道源图像的像素格式,以便我可以为每种颜色应用不同的系数。

换句话说,在苹果的这个example中,我需要将0.2126乘以红色,0.7152乘以绿色,0.0722乘以蓝色以获得像素的灰度值。

但问题是,我不知道如何从现有 vImage_Buffer 获取像素格式(ARGB?RGBA?BGRA?...)。 即使 document 说 vImage_Buffer 也没有描述它自己的像素格式。

有什么想法吗?

vImage_Buffer只描述了像素数据的矩形阵列。数据的类型(unorm8、float 等)是从对其进行操作的函数的名称中推断出来的。这些都应该很清楚了。

从vImage的角度来看,通道顺序就是你说的。对于大多数 vImage 函数,通道顺序无关紧要,因为所有通道都被同等对待。它们可能被命名为 _ARGB8888,但实际上它们是 _XXXX8888。对于其他 vImage 函数,(例如 PremultiplyData)只有一个通道被区别对待。在这种情况下,唯一重要的是 alpha 通道出现在函数名称所描述的第一个或最后一个通道中。其他通道的顺序无关紧要,因为它们的处理方式相同。对于您正在谈论的特定功能,您的工作是了解红色、绿色和蓝色通道的顺序并相应地调整系数矩阵的顺序。

您的数据中的通道顺序可能首先由生成您的图像数据的任何内容设置。通常是 CoreGraphics / ImageIO。在那种情况下——有点复杂——颜色通道顺序与 CGImageRef 颜色空间中的颜色顺序相匹配。 alpha 根据 CGImage 位图信息(其中一部分是 CGImageAlphaInfo)出现在第一个或最后一个(如果存在)。作为最后的并发症,整个事情可能会受到 16 位或 32 位字节序转换的影响。如果通道的大小小于字节序变换量程(16 位或 32 位),则通道相对于另一个的顺序已根据字节序变换进行了交换。迄今为止最常见的情况是 BGRA unorm8 数据,它被编码为 ARGB 8 位数据,并在其上标记了 32 位小端转换。然而,由于 32 位字节序变换,可能会得到每通道 16 位灰度 alpha 数据,GA 顺序转置,这将同时交换 G 和 A 相对于彼此并将 16 位样本转换为16 位小字节序。 (请注意,这在自然界中可能永远不会发生,因为您可以使用 16 位小端转换更清楚地将其分类为 alpha 优先。不过编码是合法的。)

vImage_Utilities.h C 头文件(不确定 swift 版本)中有一些示例显示了常见的 CG 编码示例。