2

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

我可以对位图或 PictureBox 做些什么来让红色和蓝色出现在适当的位置?

4

1 回答 1

4

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

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将数据复制到其中并在操作后返回位图。Using是处理位图数据的最快选项(比或LockBits快得多)。GetPixelSetPixel

循环迭代器 ( i += 3) 取决于PixelFormat位图的 。在这里我假设它是PixelFormat.Format24bppRgb。因为Format32bppArgb它会i += 4

于 2013-10-04T19:54:43.170 回答