WPF 图像在顶部仅显示 1/3

本文关键字:显示 图像 顶部 WPF | 更新日期: 2023-09-27 18:35:53

我正在尝试获取一个可写位图,该位图不断更新并将其渲染为图像,但仅显示图像的顶部,中间和底部的2/3是黑色的。我认为这可能与PixelFormat有关,因为可写位图是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# 中遍历每个像素以交换蓝色和红色?

WPF 图像在顶部仅显示 1/3

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

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

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

更好的方法是使用 FormatConvertedBitmap 类。