0

常に更新して画像にレンダリングする writeablebitmap を取得しようとしていますが、画像の上部のみが表示され、中央と下部の 2/3 は黒です。writeablebitmap は bgr24 で、画像は rgb24 であるため、PixelFormat と関係があると思います。これが私が現在行っていることです。

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);
}

何かがひどく間違っているように見えますか、それともピクセルフォーマットである可能性が最も高いですか. また、pixelformat の場合、C# で各ピクセルをどのように処理して、青と赤を入れ替えますか?

4

1 に答える 1

2

この場合、単なるピクセル形式ではありません (画像の 1/3 がレンダリングされ、残りが黒くなることはありません)。BGR24 と RGB24 の違いは、色の入れ替えだけです。

あなたの場合、おそらくビットマップとビデオソースの間のストライドの違いに関係しています。

また、BGR24 から RGB24 への変換に関しては、書き込み可能なビットマップをロックし、各ピクセルをループしてコンポーネントを交換することで手動で行うことができますが、パフォーマンスは向上しません。

FormatConvertedBitmapクラスを使用する方がはるかに優れた方法です。

于 2013-10-18T15:00:30.407 に答える