从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
}
颠簸,因为问题仍然没有答案。任何建议都非常感谢!
答案 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
,这似乎是你需要的。