0

我正在尝试获取一个不断更新的可写位图并将其渲染为图像,但是只有图像的顶部显示,中间和底部 2/3 是黑色的。我认为这可能与 PixelFormat 有关,因为 writeablebitmap 是 bgr24 而图像是 rgb24。这就是我目前正在做的事情。

int bufferSize = videoRenderer.VideoWidth * videoRenderer.VideoHeight;
byte[] frameBuffer = new byte[bufferSize];
Marshal.Copy(videoRenderer.Bitmap.BackBuffer, frameBuffer, 0, bufferSize);

using (Bitmap frame = new Bitmap(videoRenderer.VideoWidth, videoRenderer.VideoHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb))
{
    System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, videoRenderer.VideoWidth, videoRenderer.VideoHeight);
    BitmapData bmpData = frame.LockBits(rect, ImageLockMode.ReadWrite, frame.PixelFormat);
    Marshal.Copy(frameBuffer, 0, bmpData.Scan0, bufferSize);
    frame.UnlockBits(bmpData);
    IntPtr hBitmap = frame.GetHbitmap();
    source = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
    DeleteObject(hBitmap);
}

有什么东西看起来很糟糕,还是很可能是像素格式。如果是像素格式,如何通过 c# 中的每个像素来交换蓝色和红色?

4

1 回答 1

2

在这种情况下,它不能只是像素格式(它不会导致 1/3 的图像被渲染而其余的为黑色)。BGR24 和 RGB24 的区别只是颜色交换。

在您的情况下,这可能与位图和视频源之间的步幅不同有关。

至于从 BGR24 到 RGB24 的转换,您可以通过锁定可写位图并循环遍历每个像素并交换组件来手动完成,但这不会有良好的性能。

更好的方法是使用FormatConvertedBitmap类。

于 2013-10-18T15:00:30.407 回答