【问题标题】:Saving a canvas to png C# wpf将画布保存为 png C# wpf
【发布时间】:2014-02-20 02:56:26
【问题描述】:

所以我试图在 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);
}

【问题讨论】:

标签: c# wpf png rendertargetbitmap


【解决方案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/(以获得更多解释)并且能够保存没有边距的画布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2012-06-27
    • 2021-11-18
    • 2013-07-18
    • 2016-01-28
    • 1970-01-01
    • 2016-11-13
    相关资源
    最近更新 更多