将XAML自定义控件保存为jpg / png文件

我在wpf窗口有一些对象,我想将其中一个保存到.png / jpg文件中。 使用wpf是可行的吗? 怎么做 ?

UPDATE对象是一个customControl,类似于Printdialog.Printvisual,但是将我的控件UI保存为图像文件

这是我的XAML

                                                  

我想保存

  

作为一个形象。

您可以使用此函数将Framework元素保存到PNG:

  public void ExportToPng(Uri path, FrameworkElement element) { if (path == null) return; // Save current canvas transform Transform transform = element.LayoutTransform; // reset current transform (in case it is scaled or rotated) element.LayoutTransform = null; // Get the size of canvas Size size = new Size(element.Width, element.Height); // Measure and arrange the surface // VERY IMPORTANT element.Measure(size); element.Arrange(new Rect(size)); // Create a render bitmap and push the surface to it RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Pbgra32); renderBitmap.Render(element); // Create a file stream for saving image using (FileStream outStream = new FileStream(path.LocalPath, FileMode.Create)) { // Use png encoder for our data PngBitmapEncoder encoder = new PngBitmapEncoder(); // push the rendered bitmap to it encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); // save the data to the stream encoder.Save(outStream); } // Restore previously saved layout element.LayoutTransform = transform; } 

这里描述了该函数,我将其更改为采用任何框架元素。 您需要将路径和用户控件传递给它。

这里链接的文章提供了详细的解释。 这个想法是渲染一个VisualVisual是一个类,UI可见控件派生自该类。 这段摘录应该符合您的利益:

 public MemoryStream GenerateImage(Visual visual, int width, int height, ImageFormat format) { BitmapEncoder encoder = null; switch (format) { case ImageFormat.JPG : encoder = new JpegBitmapEncoder(); break; case ImageFormat.PNG: encoder = new PngBitmapEncoder(); break; case ImageFormat.BMP: encoder = new BmpBitmapEncoder(); break; case ImageFormat.GIF: encoder = new GifBitmapEncoder(); break; case ImageFormat.TIF: encoder = new TiffBitmapEncoder(); break; } if (encoder == null) return null; RenderTargetBitmap rtb = this.RenderVisaulToBitmap(visual, width, height); MemoryStream file = new MemoryStream(); encoder.Frames.Add(BitmapFrame.Create(rtb)); encoder.Save(file); return file; }