1

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

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

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

任何想法?

4

1 回答 1

4

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 编码的示例。

于 2020-03-23T16:53:05.570 回答