将 BGR 位图转换为 RGB

本文关键字:RGB 转换 位图 BGR | 更新日期: 2023-09-27 18:33:53

我正在从网络摄像头的缓冲区获取位图。 当我将这些分配给图片框时,红色和蓝色是相反的。

我可以对位图或图片框执行哪些操作才能将红色和蓝色放在正确的位置?

将 BGR 位图转换为 RGB

以下代码执行所需的转换:

public static void RGBtoBGR(Bitmap bmp)
{
    BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
                                   ImageLockMode.ReadWrite, bmp.PixelFormat);
    int length = Math.Abs(data.Stride) * bmp.Height;
    unsafe
    {
        byte* rgbValues = (byte*)data.Scan0.ToPointer();
        for (int i = 0; i < length; i += 3)
        {
            byte dummy = rgbValues[i];
            rgbValues[i] = rgbValues[i + 2];
            rgbValues[i + 2] = dummy;
        }
    }
    bmp.UnlockBits(data);
}

LockBits将位图锁定在内存中,以便您可以直接访问和更改内容。如果您不希望具有不安全的上下文,则可以创建一个字节数组,并使用Marshal.Copy将数据复制到其中,并在操作后返回到位图。使用 LockBits 是操作位图数据的最快选项(比 GetPixelSetPixel 快得多)。

循环迭代器(i += 3)取决于位图的PixelFormat。在这里,我假设它是PixelFormat.Format24bppRgb.对于Format32bppArgb来说,这将是i += 4.