代码之家  ›  专栏  ›  技术社区  ›  TalkingCode

将可视对象的内容另存为WPF中的图像文件?

  •  2
  • TalkingCode  · 技术社区  · 14 年前

    我需要将WPF对象的内容保存为图像文件。在我的应用程序中,我在画布对象上绘制了一个图表。这是我需要保存的。包含所有子对象的画布。

    3 回复  |  直到 10 年前
        1
  •  5
  •   Anatoliy Nikolaev    10 年前

    你要找的是 RenderTargetBitmap 上课。在我链接的MSDN页面上有一个使用它的示例,还有一个很好的示例,其中包括保存到文件:

    RenderTargetBitmap by Eric Sinc

        2
  •  4
  •   Anatoliy Nikolaev    10 年前

    RenderTargetBitmap 对象,将在进一步的函数中使用。

    public static RenderTargetBitmap ConvertToBitmap(UIElement uiElement, double resolution)
    {
        var scale = resolution / 96d;
    
        uiElement.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
        var sz = uiElement.DesiredSize;
        var rect = new Rect(sz);
        uiElement.Arrange(rect);
    
        var bmp = new RenderTargetBitmap((int)(scale * (rect.Width)), (int)(scale * (rect.Height)), scale * 96, scale * 96, PixelFormats.Default);
        bmp.Render(uiElement);
    
        return bmp;
    }
    

    此函数创建文件的JPEG字符串内容并将其写入文件:

    public static void ConvertToJpeg(UIElement uiElement, string path, double resolution)
    {
        var jpegString = CreateJpeg(ConvertToBitmap(uiElement, resolution));
    
        if (path != null)
        {
            try
            {
                using (var fileStream = File.Create(path))
                {
                    using (var streamWriter = new StreamWriter(fileStream, Encoding.Default))
                    {
                        streamWriter.Write(jpegString);
                        streamWriter.Close();
                    }
    
                    fileStream.Close();
                }
            }    
    
            catch (Exception ex)
            {
                //TODO: handle exception here
            }
        }
     }
    

    此函数用于创建图像内容的JPEG字符串表示:

    public static string CreateJpeg(RenderTargetBitmap bitmap)
    {
        var jpeg = new JpegBitmapEncoder();
        jpeg.Frames.Add(BitmapFrame.Create(bitmap));
        string result;
    
        using (var memoryStream = new MemoryStream())
        {
            jpeg.Save(memoryStream);
            memoryStream.Seek(0, SeekOrigin.Begin);
    
            using (var streamReader = new StreamReader(memoryStream, Encoding.Default))
            {
                result = streamReader.ReadToEnd();
                streamReader.Close();
            }
    
            memoryStream.Close();
        }
    
        return result;
    }
    

    希望这有帮助。

        3
  •  1
  •   ChrisUK    9 年前

    在Eric Sinc教程的帮助下,我找到了以下解决方案:

    注意,这个例子中保存的元素是“cnvClasses”,并且输出的大小与控件完全相同。

            SaveFileDialog svDlg = new SaveFileDialog();
            svDlg.Filter = "PNG files|*.png|All Files|*.*";
            svDlg.Title = "Save diagram as PNG";
            if (svDlg.ShowDialog().Value == true)
            {
                RenderTargetBitmap render = new RenderTargetBitmap((int)this.cnvClasses.ActualWidth, (int)this.cnvClasses.ActualHeight, 96, 96, PixelFormats.Pbgra32);
                render.Render(cnvClasses);
                PngBitmapEncoder encoder = new PngBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(render));
                using (FileStream fs = new FileStream(svDlg.FileName, FileMode.Create))
                    encoder.Save(fs);
            }