Сохранение холста в png C# wpf
Поэтому я пытаюсь сделать снимок моего холста в 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);
}
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/ (для более подробного объяснения) и смог сохранить холст без полей.