从 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
,但我认为这太慢了。
所以这些都可以解决我的问题,如果有可能请告诉我:
WPF DrawingVisual
可以在 hDC 上绘图吗?
DrawingVisual 能否以某种方式在 Graphics
上绘制?
从DrawingVisual
/MediaPlayer
/VideoDrawing
?
获取System.Drawing.Bitmap
的快速方法
我正在使用位图数据复制 (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);
我需要将视频绘制到另一个 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
,但我认为这太慢了。
所以这些都可以解决我的问题,如果有可能请告诉我:
WPF
DrawingVisual
可以在 hDC 上绘图吗?DrawingVisual 能否以某种方式在
Graphics
上绘制?从
DrawingVisual
/MediaPlayer
/VideoDrawing
? 获取
System.Drawing.Bitmap
的快速方法
我正在使用位图数据复制 (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);