【发布时间】:2016-05-03 07:35:00
【问题描述】:
我需要将从相机接收到的位图复制到 BitmapSource 中,以便在 WPF 应用程序中显示它。图像以负步幅到达 PixelFormat.Format24bppRgb。我通过以下代码得到了这个工作
//NOTE: image is in PixelFormat.Format24bppRgb
var bitmap = imageBuffer.Bitmap;
Image = new WriteableBitmap(bitmap.Width, bitmap.Height, 96, 96, PixelFormats.Rgb24, null);
var bitmapData = bitmap.LockBits(
new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat);
var rowSize = bitmapData.Stride < 0 ? -bitmapData.Stride : bitmapData.Stride;
var bitmapPtr = bitmapData.Scan0;
var bitmapLine = new Int32Rect(0, 0, bitmap.Width, 1);
for (int line = 0; line < bitmap.Height; line++)
{
Image.WritePixels(bitmapLine, bitmapPtr, rowSize, rowSize, 0, line);
bitmapPtr += bitmapData.Stride;
}
bitmap.UnlockBits(bitmapData);
我遇到的问题是蓝色和红色通道似乎被交换了。我可以通过将 BitmapSource 创建为 Bgr24 来解决该问题,但由于在应用程序中我还需要在转换之前进行一些图像处理,因此我更喜欢在此之前以正确的格式保存内容。我在转换中做错了什么还是这是一些 GDI 特性?
请注意,如果我将相机位图直接应用到 WinForms 图片框,图像将正确显示。此外,WriteableBitmap 只是为了代码简洁而重新创建。
【问题讨论】:
-
如果你接收到的图像格式是RGB,但是stride是负数,那么图像格式是BGR,因为它正在被向后读取。
-
位图应该总是这样吗?如果是这样,我会接受它作为答案。
-
是的,这是正常的,负步幅意味着它是自下而上而不是自上而下的图像,通常 Graphics 的绘制操作会为您处理这些事情,但 Image 类 WritePixels 不会允许指定负步幅,因此必须反转像素格式(BGR)
标签: c# wpf bitmap bitmapsource