为啥使用“RenderTargetBitmap”类会使 GDI 句柄数增加?
Posted
技术标签:
【中文标题】为啥使用“RenderTargetBitmap”类会使 GDI 句柄数增加?【英文标题】:Why the use of 'RenderTargetBitmap' class makes GDI handle count increase?为什么使用“RenderTargetBitmap”类会使 GDI 句柄数增加? 【发布时间】:2019-10-28 03:17:54 【问题描述】:我的理解
1) 'System.Windows.Media' 中的类使用 directx 进行渲染。 它不会使用 GDI+。 2) 只有 'System.Drawing' 中的类使用 GDI+ 进行绘图。(这会导致 GDI 句柄数增加。)
问题
但是当我使用“System.Windows.Media.Imaging.RenderTargetBitmap”渲染位图时,GDI 计数似乎增加了。
为什么会这样?
(由于我需要将这些图像放在一个按钮上,而这个按钮是网格控件的单元格模板的一部分,所以我想减少 GDI 的使用。)
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
// Create Rectangle
Rect rect = new Rect(new System.Windows.Point(0, 0), new System.Windows.Point(100, 100));
// Draw Rectangle
System.Windows.Media.Pen pen = new System.Windows.Media.Pen();
pen.Brush = Brushes.Black;
pen.Thickness = 5;
drawingContext.DrawRectangle(Brushes.Black, pen, rect);
drawingContext.Close();
RenderTargetBitmap bmp = new RenderTargetBitmap(100, 100, 96.0, 96.0, PixelFormats.Pbgra32);
//Render DrawingVisual
bmp.Render(drawingVisual);
【问题讨论】:
因为它将视觉对象转换为位图,而位图需要一个 GDI 句柄。 @Clemens 是的,这是我的理解。 不确定那里到底发生了什么。你见过这个吗? ***.com/q/9034362/1136211 @Clemens 是的,但不知道为什么它需要 GDI 句柄进行绘图:( 【参考方案1】:环顾网络和一些分析,似乎RenderTargetBitmap没有利用硬件渲染(Direct X)。它仍然使用 GDI+ 离线渲染位图。
这可能是对 WPF 渲染的普遍理解的一个例外。 但令我惊讶的是,MSDN 没有提供任何关于此的线索。
【讨论】:
以上是关于为啥使用“RenderTargetBitmap”类会使 GDI 句柄数增加?的主要内容,如果未能解决你的问题,请参考以下文章
WPF Canvas转换为位图 (RenderTargetBitmap)