将控件绘制到内存(位图)

本文关键字:位图 内存 控件 绘制 | 更新日期: 2023-09-27 17:59:57

是否可以在不在屏幕上绘制的情况下将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);

将控件绘制到内存(位图)

由于控件没有父容器,您需要调用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;
}

如果您已经设置了元素的WidthHeight,则可以将其用于大小参数:

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));