Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>You may put the ImageDrawing into an Image control and render that into a <a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.rendertargetbitmap.aspx" rel="nofollow">RenderTargetBitmap</a>, which is a BitmapSource and can therefore be serialized by a <a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapencoder.aspx" rel="nofollow">BitmapEncoder</a> (PngBitmapEncoder in this example).</p> <pre><code>public void SaveDrawingToFile(Drawing drawing, string fileName, double scale) { var drawingImage = new Image { Source = new DrawingImage(drawing) }; var width = drawing.Bounds.Width * scale; var height = drawing.Bounds.Height * scale; drawingImage.Arrange(new Rect(0, 0, width, height)); var bitmap = new RenderTargetBitmap((int)width, (int)height, 96, 96, PixelFormats.Pbgra32); bitmap.Render(drawingImage); var encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bitmap)); using (var stream = new FileStream(fileName, FileMode.Create)) { encoder.Save(stream); } } </code></pre> <p>Note that you don't actually need a BitmapImage for encoding, because BitmapSource (or any derived class like RenderTargetBitmap) will be accepted as argument to <a href="http://msdn.microsoft.com/en-us/library/ms615993.aspx" rel="nofollow">BitmapFrame.Create</a>.</p> <hr> <p>A slightly different solution would involve a <a href="http://msdn.microsoft.com/en-us/library/system.windows.media.drawingvisual.aspx" rel="nofollow">DrawingVisual</a> instead of a DrawingImage:</p> <pre><code>public void SaveDrawingToFile(Drawing drawing, string fileName, double scale) { var drawingVisual = new DrawingVisual(); using (var drawingContext = drawingVisual.RenderOpen()) { drawingContext.PushTransform(new ScaleTransform(scale, scale)); drawingContext.PushTransform(new TranslateTransform(-drawing.Bounds.X, -drawing.Bounds.Y)); drawingContext.DrawDrawing(drawing); } var width = drawing.Bounds.Width * scale; var height = drawing.Bounds.Height * scale; var bitmap = new RenderTargetBitmap((int)width, (int)height, 96, 96, PixelFormats.Pbgra32); bitmap.Render(drawingVisual); var encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bitmap)); using (var stream = new FileStream(fileName, FileMode.Create)) { encoder.Save(stream); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload