我正在尝试使用一个不断更新的writeablebitmap并将其渲染到一个Image中,但只显示图像的顶部,而中间和底部的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#中的每个像素交换蓝色和红色?
答案 0 :(得分:2)
在这种情况下,它不能只是像素格式(它不会导致渲染1/3的图像而其余部分为黑色)。 BGR24和RGB24之间的差异只是颜色交换。
在你的情况下,它可能与位图和视频源之间的差距有关。
就从BGR24转换为RGB24而言,您可以通过锁定可写位图并在每个像素上循环并交换组件来手动完成,但这不会有良好的性能。
更好的方法是使用FormatConvertedBitmap类。