1

我想用 WPF 开发一个 .NET 应用程序。

最后应该有一个 Viewbox 或类似的东西,这个 Viewbox 应该包含一个画布,在这个画布中可能有各种各样的东西,比如填充的矩形、椭圆等(比如绘图应用程序,例如油漆)。

现在我想实现将 Canvas 的内容保存到 PNG 的功能。我尝试将 Canvas 渲染到 RenderTargetBitmap 然后保存它。

这里的问题是我无法设置特定的坐标,我唯一可以设置的是 RenderTargetBitmap 的大小(画布宽度和高度),但它会从我的画布的 (0|0) 开始渲染大小元素从其他地方开始。有什么工作可以解决吗?

下一个问题是,应该可以将图片添加为根画布的子元素,但我怎么能关心质量以及 Viewbox 中的所有内容都已打印?

非常感谢!



- - - 编辑 - - -

我想我有一个解决方案:

void SaveUsingEncoder(Canvas myCanvas, string fileName)
    {
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        RenderTargetBitmap bitmap = new RenderTargetBitmap(
            (int)myCanvas.ActualWidth,
            (int)myCanvas.ActualHeight,
            96,
            96,
            PixelFormats.Pbgra32);

        Rect bounds = VisualTreeHelper.GetDescendantBounds(myCanvas);
        Console.WriteLine(bounds.X + "|" + bounds.Y + "  " + bounds.Width + "|" + bounds.Height);
        DrawingVisual dv = new DrawingVisual();
        using (DrawingContext ctx = dv.RenderOpen())
        {
            VisualBrush vb = new VisualBrush(myCanvas);
            ctx.DrawRectangle(vb, null, new Rect(bounds.Location, bounds.Size));
        }
        bitmap.Render(dv);
        BitmapFrame frame = BitmapFrame.Create(bitmap);
        encoder.Frames.Add(frame);
        using (var stream = File.Create(fileName))
        {
            encoder.Save(stream);
        }
    }

这为我保存了完整的画布

4

1 回答 1

0

在特定位置 -

我认为在你的情况下使用边距。

于 2013-04-26T06:43:53.417 回答