将画布保存到png C#wpf

将画布保存到png C#wpf,c#,wpf,png,rendertargetbitmap,C#,Wpf,Png,Rendertargetbitmap,因此,我试图在WPF C#中拍摄画布的快照,以便将其保存为png。图像目前保存不正确,因为它包括左页边距和上页边距 这就是我所拥有的: 为画布的大小创建一个矩形。如果canvas.Margin.Left和Top设置为0,则保存的图像大小正确,但偏移仍然存在,因此会切割底部和右侧边缘。设置Margin.Left和Top仍然会导致出现偏移,但整个图像会被保存,但其大小(Margin.Left+ActualWidth)不正确,而不仅仅是ActualWidth Rect rect = new Rect(

因此,我试图在WPF C#中拍摄画布的快照,以便将其保存为png。图像目前保存不正确,因为它包括左页边距和上页边距

这就是我所拥有的:

为画布的大小创建一个矩形。如果canvas.Margin.Left和Top设置为0,则保存的图像大小正确,但偏移仍然存在,因此会切割底部和右侧边缘。设置Margin.Left和Top仍然会导致出现偏移,但整个图像会被保存,但其大小(Margin.Left+ActualWidth)不正确,而不仅仅是ActualWidth

Rect rect = new Rect(canvas.Margin.Left, canvas.Margin.Top, canvas.ActualWidth, canvas.ActualHeight);

double dpi = 96d;

RenderTargetBitmap rtb = new RenderTargetBitmap((int)rect.Right, (int)rect.Bottom, dpi, dpi, System.Windows.Media.PixelFormats.Default);

rtb.Render(canvas);

BitmapEncoder pngEncoder = new PngBitmapEncoder();
pngEncoder.Frames.Add(BitmapFrame.Create(rtb));

try
{
    System.IO.MemoryStream ms = new System.IO.MemoryStream();

    pngEncoder.Save(ms);
    ms.Close();

    System.IO.File.WriteAllBytes(filename, ms.ToArray());
}
catch (Exception err)
{
    MessageBox.Show(err.ToString(), "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}

用这些管路更换前四个管路

Rect bounds = VisualTreeHelper.GetDescendantBounds(canvas);
double dpi = 96d;

RenderTargetBitmap rtb = new RenderTargetBitmap((int)bounds.Width, (int)bounds.Height, dpi, dpi, System.Windows.Media.PixelFormats.Default);

DrawingVisual dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
    VisualBrush vb = new VisualBrush(canvas);
    dc.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
}

rtb.Render(dv);

我已经阅读了这篇文章(以获取更多解释),并且能够保存画布而不留边距。

为什么要创建MemoryStream?创建FileStream并直接保存编码器。如果存在可见画布区域之外的元素: