2013-01-17 53 views
0

我想绘制大量的形状(线,椭圆和...),然后将它们保存为位图或png。我提出的图纸和问题是:如何在C#中将DrawingImage转换为BitmapImage?的代码是这样的:将DrawingImage转换为BitmapImage

DrawingGroup drawingGroup = new DrawingGroup(); 
using(DrawingContext context = drawingGroup.Open()) 
{ 
    //make some drawing 
} 
DrawingImage drawingImage = new DrawingImage(drawingGroup) 

// your suggestion? DrawingImage - > BitmapImage 
+0

为什么?你想达到什么目的? – SLaks

+0

我想将它保存为具有合适尺寸的磁盘上的图像 –

+0

纵横比也很重要 –

回答

5

您可能把ImageDrawing成图像的控制和渲染成,这是一个的BitmapSource,因此可以由一个BitmapEncoder(PngBitmapEncoder在此实例中)被序列化。

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); 
    } 
} 

注意,你实际上并不需要编码一个BitmapImage的,因为的BitmapSource(或类似RenderTargetBitmap任何派生类)将被接受作为参数传递给BitmapFrame.Create


稍微不同的解决方案将涉及DrawingVisual代替DrawingImage:

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); 
    } 
} 
+0

纵横比很重要 –

+0

是的,原始图的纵横比。我也需要一种方法来控制规模。 (想象一下,我有很多可能具有大坐标值的几何图形) –

+0

我编辑了答案。现在它使用DrawingImage的宽度和高度来创建RenderTargetBitmap。要控制比例尺,只需将“宽度”和“高度”乘以适当的比例因子即可。 – Clemens