c# - 将 Canvas 保存为 png C# wpf

标签 c# wpf png rendertargetbitmap

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

这是我的:

为 Canvas 的大小创建一个矩形。如果 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);

我已关注这篇文章http://mcleodsean.wordpress.com/2008/10/07/bitmap-snapshots-of-wpf-visuals/ (更多解释)并能够无边距地保存 Canvas 。

关于c# - 将 Canvas 保存为 png C# wpf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21411878/

相关文章:

c# - WPF:ListView 中列表属性的总和

python - Alamofire 将 PNG 上传到具有白色背景的 Flask

visual-studio - 如何在 Visual Studio 2008 的绘图编辑器中将 .GIF 或 .PNG 文件中的像素设置为透明?

c# - 检查 List<T> 是否为 null 时空合并运算符的性能

c# - ASP.NET MVC 每个 View 1 个 ViewModel?

c# - 使用触发器 WPF MVVM 更改图像

.net - 如何使用 NavigationService 将对象传递给 ViewModel?

php - 想象一下。将颜色更改为透明

c# - 如何不区分大小写地使用 indexOf()?

c# - 如何获取实体模型连接字符串?