从 WPF MediaPlayer/DrawingVisual 绘制到 Windows 设备上下文 (hWnd/hDC) 或转换为 System.Drawing.Graphics

Drawing to a Windows device context (hWnd/hDC) from WPF MediaPlayer/DrawingVisual or convert to System.Drawing.Graphics

我需要将视频绘制到另一个 window,在那里我可以使用 GetDCEx 获取设备上下文 hDC。我已经可以使用 System.Drawing.Graphics:

实现绘图
g = Graphics.FromHdc(hdc);
// Now I need to get the video frame/bitmap here
g.DrawImage(frameBitmap, 0, 0);

但是我认为System.Drawing没有任何视频渲染的class,所以我打算使用System.Windows.Media.MediaPlayer。但是,我能做的最好的事情就是达到 RenderTargetBitmap。有一种方法可以使用编码器渲染到位图文件,然后将其解码为 System.Drawing.Image,但我认为这太慢了。

所以这些都可以解决我的问题,如果有可能请告诉我:

我正在使用位图数据复制 (LockBits),速度足够快。感谢 this answer.

    public Bitmap Render()
    {
        var bitmapRender = this.CreateRenderTargetBitmap();

        using (var drawingContext = this.drawingVisual.RenderOpen())
        {
            drawingContext.DrawVideo(this.MediaPlayer, this.drawingRect);
            drawingContext.Close();
        }   

        bitmapRender.Render(this.drawingVisual);

        var result = new Bitmap(this.Width, this.Height, DrawingPixelFormat);
        var bitmapData = result.LockBits(
            this.renderRect, 
            System.Drawing.Imaging.ImageLockMode.WriteOnly, 
            DrawingPixelFormat);

        bitmapRender.CopyPixels(
            Int32Rect.Empty,
            bitmapData.Scan0,
            bitmapData.Stride * bitmapData.Height,
            bitmapData.Stride);

        result.UnlockBits(bitmapData);

        return result;
    }

    RenderTargetBitmap CreateRenderTargetBitmap() => new RenderTargetBitmap(
            this.Width, this.Height,
            this.Dpi, this.Dpi,
            WpfPixelFormat);