【问题标题】: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);

【问题讨论】:

    标签: c# wpf bitmap controls render


    【解决方案1】:

    由于控件没有父容器,您需要调用MeasureArrange 才能进行正确的布局。由于布局是异步完成的(参见MeasureArrange 中的备注),您可能还需要调用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,则可以将其用于 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 里面包含了一些项目。只要项目不在位图黑色矩形中呈现在屏幕上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2012-06-06
    • 1970-01-01
    相关资源
    最近更新 更多