Сохранение холста в png C# wpf

поэтому я пытаюсь сделать снимок моего холста в WPF C#, чтобы я мог сохранить его как png. Изображение сохраняется неправильно в настоящее время, так как оно включает левое и верхнее поля.

вот что у меня есть:

создайте прямоугольник для размера холста. если холст.Маржа.Левый и верхний установлены в 0, то сохраненное изображение имеет правильный размер, но смещение все еще происходит и, таким образом, режет нижний и правый края. Устанавливается маржа.Левый и верхний все еще вызывает смещение происходит, но все изображение сохраняется, но с неправильным размером (маржа.Слева + 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);
}

1 ответов


замените первые четыре строки этими строками

            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);

Я следил за этой статьей http://mcleodsean.wordpress.com/2008/10/07/bitmap-snapshots-of-wpf-visuals/ (для получения дополнительных объяснений) и возможность сохранения холста без полей.