【问题标题】:How to combine multiple System.Windows.Media.DrawingVisual object into one image in WPF?如何在 WPF 中将多个 System.Windows.Media.DrawingVisual 对象组合成一个图像?
【发布时间】:2015-12-23 14:01:24
【问题描述】:

我有多个返回 System.Windows.Media.DrawingVisual 对象的函数。我需要将所有 DrawingVisual 对象组合成一张图像。

private System.Windows.Media.DrawingVisual Shape1()
{
    DrawingVisual dv = new DrawingVisual();
    using (DrawingContext dc = dv.RenderOpen())
    {
        ////--- draw shapes on 'dc'
    }
    return dv;
}

private System.Windows.Media.DrawingVisual Shape2()
{
    DrawingVisual dv = new DrawingVisual();
    using (DrawingContext dc = dv.RenderOpen())
    {
        ////--- draw shapes on 'dc'
    }
    return dv;
}

在我的函数中,我需要组合返回的对象,如下所示

private void Combine()
{
    System.Windows.Media.DrawingVisual s1 = Shape1();
    System.Windows.Media.DrawingVisual s2 = Shape2();

    //--- here i need to draw the s1 & s2 into an image and display on screen.
}

另一种方法是,将所有 DrawingVisuals 保存到单独的 BitmapSource 对象中,然后再创建一个 DrawingVisual 并在其上绘制所有位图图像。但它的方式非常复杂。有没有更好的方法呢?

【问题讨论】:

  • 你一定要使用DrawingVisual吗?更好的方法可能是让您的方法返回GeometryDrawing 对象(甚至只是从Geometry 派生的对象)。可以使用DrawingGroup 组合GeometryDrawing 对象,然后可以将其设置为DrawingBrushDrawing 属性,进而可以与其他WPF 画笔一样使用。
  • 组合是什么意思?
  • 将它们添加到 ContainerVisual(或另一个 DrawingVisual)的 Children 集合中。如果需要位图,请使用 RenderTargetBitmap 来呈现 ContainerVisual。否则,创建一个在屏幕上呈现 ContainerVisual 的 Visual 宿主控件。
  • 你的最终目标是什么?一个包含所有形状的视觉对象?尤其是渲染了这些形状的位图?或者将这些视觉效果放在 Canvas 中是否足以满足您的目的(在屏幕上显示为单独的对象但看起来像一个)?

标签: c# wpf system.windows.media


【解决方案1】:

重构(提取方法)

在“dc”上绘制形状

部分形状返回方法到Action<DrawingContext>

然后使用 一个鞋底 DrawingContext 调用所有这些操作,如下所示。生成一个ImageSource 分配给您的Image 控件。

public static BitmapSource CreateBitmap(int width, int height, double dpi,
    IEnumerable<Action<DrawingContext>> renderActions)
{
    DrawingVisual drawingVisual = new DrawingVisual();

    using (DrawingContext drawingContext = drawingVisual.RenderOpen())
    {
        foreach (var render in renderActions)
            render(drawingContext);
    }

    RenderTargetBitmap bitmap = new RenderTargetBitmap(
        width, height, dpi, dpi, PixelFormats.Default);

    bitmap.Render(drawingVisual);

    return bitmap;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2014-01-05
    • 2017-07-23
    相关资源
    最近更新 更多