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

时间:2014-12-12 07:32:02

标签: c# image-processing intrinsics pixelformat

从SDK中我获得了包含像素格式BGR的图像,即BGRBGRBGR。对于其他应用程序,我需要将此格式转换为RGB平面RRRGGGBBB

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

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

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

2 个答案:

答案 0 :(得分:0)

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

编辑 - this question是一个略有不同的问题,ARGB到BGR,但所使用的技术与您需要的技术类似。

答案 1 :(得分:0)

Basler公司为他们的相机提供了一个名为Basler Pylon的SDK,可以在Windows和Linux中使用 此SDK包含用于C ++,C#等的API 它有一个图像转换类PixelDataConverter,这似乎是你需要的。