簡體   English   中英

將繪圖圖像轉換為位圖圖像

[英]Convert DrawingImage to BitmapImage

我想繪制大量形狀(線條、橢圓和...),然后將它們保存為位圖或 png。 我制作了圖紙,問題是:如何在 C#中將 DrawingImage轉換為BitmapImage 代碼是這樣的:

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

// your suggestion? DrawingImage - > BitmapImage

您可以將 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);
    }
}

請注意,您實際上不需要 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);
    }
}

我發現這樣很容易:

public static BitmapSource ToBitmapSource(DrawingImage source)
{
    DrawingVisual drawingVisual = new DrawingVisual();
    DrawingContext drawingContext = drawingVisual.RenderOpen();
    drawingContext.DrawImage(source, new Rect(new Point(0, 0), new Size(source.Width, source.Height)));
    drawingContext.Close();

    RenderTargetBitmap bmp = new RenderTargetBitmap((int)source.Width, (int)source.Height, 96, 96, PixelFormats.Pbgra32);
    bmp.Render(drawingVisual);
    return bmp;
}

您可以使用它來獲取 System.Drawing.Bitmap

using (MemoryStream ms = new MemoryStream())
{
    PngBitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(ToBitmapSource(drawingImage)));
    encoder.Save(ms);

    using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(ms))
    {
        bmpOut = new System.Drawing.Bitmap(bmp);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM