将控件绘制到内存(位图)
Posted
技术标签:
【中文标题】将控件绘制到内存(位图)【英文标题】:Drawing control to memory (Bitmap) 【发布时间】:2013-02-03 20:19:15 【问题描述】:是否可以在根本不在屏幕上绘制的情况下将 wpf 控件绘制到内存(位图)? 我找到了一个如何保存到位图的示例,但它仅在屏幕中绘制了窗口时才有效。
BitmapImage bitmap = new BitmapImage();
RenderTargetBitmap renderTarget =
new RenderTargetBitmap((int)canvaspad.Width,
(int)canvaspad.Height,
96,
96,
System.Windows.Media.PixelFormats.Default);
renderTarget.Render(canvaspad);
【问题讨论】:
【参考方案1】:由于控件没有父容器,您需要调用Measure 和Arrange 才能进行正确的布局。由于布局是异步完成的(参见Measure 和Arrange 中的备注),您可能还需要调用UpdateLayout 来强制立即更新布局。
public BitmapSource RenderToBitmap(UIElement element, Size size)
element.Measure(size);
element.Arrange(new Rect(size));
element.UpdateLayout();
var bitmap = new RenderTargetBitmap(
(int)size.Width, (int)size.Height, 96, 96, PixelFormats.Default);
bitmap.Render(element);
return bitmap;
如果您已经设置了元素的 Width
和 Height
,则可以将其用于 size 参数:
var grid = new Grid
Width = 200,
Height = 200,
Background = Brushes.Yellow
;
grid.Children.Add(
new Ellipse
Width = 100,
Height = 100,
Fill = Brushes.Blue
);
var bitmap = RenderElement(grid, new Size(grid.Width, grid.Height));
【讨论】:
这个方案不行!至少在我的 Grid Control 里面包含了一些项目。只要项目不在位图黑色矩形中呈现在屏幕上。以上是关于将控件绘制到内存(位图)的主要内容,如果未能解决你的问题,请参考以下文章
emWin6.x的2D图形库之绘制流位图(QSPI Flash内存映射方案)