2013-01-17 55 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