【问题标题】:is there any way to get pixel format information from vImage_Buffer in swift?有什么方法可以快速从 vImage_Buffer 获取像素格式信息?
【发布时间】:2020-03-11 06:11:06
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: ios swift macos accelerate-framework vimage


    【解决方案1】:

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

    【讨论】:

    • vImage 不会改变通道的顺序,除非这是操作的逻辑结果。例如,您可以使用矩阵乘法函数和 1 和 0 的非对角矩阵来交换一些通道。 Permute 函数还将交换一些通道。所有这些都是您要求的操作。
    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 2013-03-26
    • 1970-01-01
    • 2016-07-06
    • 2019-10-06
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多