【问题标题】:Drawing to a Windows device context (hWnd/hDC) from WPF MediaPlayer/DrawingVisual or convert to System.Drawing.Graphics从 WPF MediaPlayer/DrawingVisual 绘制到 Windows 设备上下文 (hWnd/hDC) 或转换为 System.Drawing.Graphics
【发布时间】:2020-01-16 06:56:00
【问题描述】:

我需要将视频绘制到另一个窗口,我可以在其中使用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 有任何视频渲染类,所以我打算使用System.Windows.Media.MediaPlayer。然而,我能做的最好的就是把它送到RenderTargetBitmap。有一种方法可以使用编码器渲染到位图文件,然后将其解码为System.Drawing.Image,但我认为它会太慢。

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

  • WPF DrawingVisual 可以在 hDC 上绘图吗?

  • DrawingVisual 能否以某种方式在 Graphics 上绘制?

  • DrawingVisual/MediaPlayer/VideoDrawing获取System.Drawing.Bitmap的快捷方式?

【问题讨论】:

    标签: c# wpf bitmap render system.drawing


    【解决方案1】:

    我正在使用位图数据复制 (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);
    

    【讨论】:

      猜你喜欢
      • 2011-04-02
      • 2011-01-11
      • 1970-01-01
      • 2011-09-08
      • 2017-07-08
      • 2015-06-01
      • 2013-06-13
      • 2013-05-04
      • 2013-08-01
      相关资源
      最近更新 更多