我正在从一个网络摄像头上得到一个缓冲区的位图。当我把这些分配给一个PictureBox时,红色和蓝色是相反的。
我能对位图或PictureBox做些什么才能把红色和蓝色放在合适的位置?
发布于 2013-10-04 19:54:43
以下代码执行所需的转换:
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是操作位图数据的最快选项(比GetPixel或SetPixel快得多)。
循环迭代器(i += 3)依赖于位图的PixelFormat。这里我假设它是PixelFormat.Format24bppRgb。对于Format32bppArgb来说,这将是i += 4。
https://stackoverflow.com/questions/19187737
复制相似问题