更快地将 BGR 打包转换为 RGB 平面像素格式

本文关键字:转换 RGB 平面 格式 像素 BGR 包转换 | 更新日期: 2023-09-27 18:34:00

从SDK中,我获得了打包了像素格式BGR的图像,即 BGRBGRBGR .对于另一个应用程序,我需要将此格式转换为 RGB 平面RRRGGGBBB .

我使用的是 C# .NET 4.5 32 位,数据位于大小相同的字节数组中。

现在我正在遍历数组源并将BGR值分配给目标数组中的适当位置,但这需要太长时间(180 像素的图像为 1,3 毫秒)。运行代码的处理器可以访问 MMX、SSE、SSE2、SSE3、SSSE3。

有没有办法加快转换速度?

编辑:这是我正在使用的转换:

// the array with the BGRBGRBGR pixel data
byte[] source;
// the array with the RRRGGGBBB pixel data
byte[] result;
// the amount of pixels in one channel, width*height
int imageSize;
for (int i = 0; i < source.Length; i += 3)
{
    result[i/3] = source[i + 2]; // R
    result[i/3 + imageSize] = source[i + 1]; // G
    result[i/3 + imageSize * 2] = source[i]; // B
}

编辑:我尝试将对源数组的访问拆分为三个循环,每个通道一个,但它并没有真正帮助。所以我愿意接受建议。

for (int i = 0; i < source.Length; i += 3)
{
    result[i/3] = source[i + 2]; // R
}
for (int i = 0; i < source.Length; i += 3)
{
    result[i/3 + imageSize] = source[i + 1]; // G
}
for (int i = 0; i < source.Length; i += 3)
{
    result[i/3 + imageSize * 2] = source[i]; // B
}

颠簸,因为这个问题仍然没有答案。任何建议都非常感谢!

更快地将 BGR 打包转换为 RGB 平面像素格式

您可以尝试使用 SSE3 的 PSHUFB - 打包随机字节指令。确保您使用的是对齐的内存读/写。你将不得不做一些棘手的事情来处理每个XMMWORD大小块中最后一个悬空的B值。 可能很难做到正确,但应该是一个巨大的加速。 您也可以查找库代码。我猜你需要创建一个 C 或 C++ DLL 并使用 P/Invoke,但也许有一种方法可以使用我不知道的 C# 中的 SSE 指令。

编辑 - 这个问题针对一个稍微不同的问题,ARGB 到 BGR,但使用的技术与您需要的技术相似。

Basler公司有一个SDK,名为Basler Pylon,可以在Windows和Linux上运行。
此 SDK 具有适用于 C++、C# 等的 API。
它有一个图像转换类PixelDataConverter,这似乎是您所需要的。