我想用 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);
}
}
这为我保存了完整的画布