1

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

我正在使用 C# .NET 4.5 32bit 并且数据位于具有相同大小的字节数组中。

现在我正在遍历数组源并将BGR值分配到目标数组中的适当位置,但这需要太长时间(对于 1.3 百万像素的图像需要 180 毫秒)。运行代码的处理器可以访问 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
}

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

4

2 回答 2

1

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

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

于 2014-12-12T07:50:10.507 回答
0

Basler 公司为其相机提供了一个 SDK,称为 Basler Pylon,可在 Windows 和 Linux 中运行。
此 SDK 具有适用于 C++、C# 等的 API。
它有一个图像转换类PixelDataConverter,这似乎是你所需要的。

于 2017-03-07T16:47:42.150 回答