/// <summary> /// Creates image from canvas with map background. /// </summary> /// <param name="mapImage">Map image.</param> /// <param name="canvas">Canvas to draw.</param> /// <returns>Created image.</returns> private Image _CreateImage(MapImage mapImage, SysControls.Canvas canvas) { Debug.Assert(null != mapImage); Debug.Assert(null != canvas); Image imageWithData = null; RenderTargetBitmap bmp = null; SysControls.Canvas outer = null; Image sourceImage = null; using (MemoryStream sourceStream = new MemoryStream((byte[])mapImage.ImageData)) sourceImage = Image.FromStream(sourceStream); try { var bitmap = sourceImage as Bitmap; Debug.Assert(null != bitmap); ImageBrush imageBrush = _CreateImageBrush(bitmap); outer = new SysControls.Canvas(); outer.Width = mapImage.ImageWidth; outer.Height = mapImage.ImageHeight; outer.Children.Add(canvas); outer.Background = (ImageBrush)imageBrush.GetCurrentValueAsFrozen(); outer.Arrange(new Rect(0, 0, outer.Width, outer.Height)); bmp = new RenderTargetBitmap((int)outer.Width, (int)outer.Height, mapImage.ImageDPI, mapImage.ImageDPI, PixelFormats.Pbgra32); bmp.Render(outer); var encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bmp)); using (MemoryStream stream = new MemoryStream()) { encoder.Save(stream); imageWithData = Image.FromStream(stream); } } finally { // Clear and dispose all used stuff if (outer != null) { outer.UpdateLayout(); outer.Children.Clear(); } canvas.UpdateLayout(); foreach (object child in canvas.Children) { var symbolControl = child as SymbolControl; if (symbolControl != null) { symbolControl.Template = null; } } canvas.Children.Clear(); if (bmp != null) { bmp.Clear(); } if (sourceImage != null) { sourceImage.Dispose(); } } return(imageWithData); }