4

多数の形状 (線、楕円など) を描画し、それらをビットマップまたは png として保存したいと考えています。私は図面を作成しましたが、質問は次のとおりです。C# でDrawingImageBitmapImageに変換するにはどうすればよいですか? コードは次のようなものです。

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

// your suggestion? DrawingImage - > BitmapImage
4

2 に答える 2

13

ImageDrawing を Image コントロールに配置し、それをRenderTargetBitmapにレンダリングできます。これは 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);
    }
}

BitmapSource (または RenderTargetBitmap などの派生クラス) は BitmapFrame.Create の引数として受け入れられるため、実際にはエンコードにBitmapImageは必要ないことに注意してください。


DrawingImage の代わりにDrawingVisualを使用すると、少し異なる解決策が得られます。

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);
    }
}
于 2013-01-17T20:37:55.103 に答える