web-dev-qa-db-ja.com

System.Drawing.Graphicsをpngまたはbmpに保存する

画面に描画したグラフィックスオブジェクトがあり、pngまたはbmpファイルに保存する必要があります。グラフィックスはそれを直接サポートしていないようですが、何らかの形で可能である必要があります。

手順は何ですか?

20
Old Man

それをBitmapにコピーしてから、ビットマップのSaveメソッドを呼び出します。

文字通り(画面のデバイスコンテキストを取得することによって)画面に描画している場合、描画した画面を保存する唯一の方法は、描画してプロセスを逆にすることですfrom画面to a Bitmap。これは可能ですが、ビットマップに直接描画する方がはるかに簡単です(画面への描画に使用するのと同じコードを使用)。

8
MusiGenesis

これがコードです:

Bitmap bitmap = new Bitmap(Convert.ToInt32(1024), Convert.ToInt32(1024), System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bitmap);

// Add drawing commands here
g.Clear(Color.Green);

bitmap.Save(@"C:\Users\johndoe\test.png", ImageFormat.Png);

グラフィックがフォーム上にある場合、これを使用できます。

private void DrawImagePointF(PaintEventArgs e)
{
   ... Above code goes here ...

   e.Graphics.DrawImage(bitmap, 0, 0);
}

さらに、Webページに保存するには、これを使用できます。

MemoryStream memoryStream = new MemoryStream();
bitmap.Save(memoryStream, ImageFormat.Png);
var pngData = memoryStream.ToArray();

<img src="data:image/png;base64,@(Convert.ToBase64String(pngData))"/>

グラフィックスオブジェクトはGDI +描画面です。つまり、フォームまたは画像のいずれかを描画するためのデバイスコンテキストがアタッチされている必要があります。

23
Curtis Yallop

これを試してください、私にとってはうまくいきます...

private void SaveControlImage(Control ctr)
{
    try
    {
        var imagePath = @"C:\Image.png";

        Image bmp = new Bitmap(ctr.Width, ctr.Height);
        var gg = Graphics.FromImage(bmp);
        var rect = ctr.RectangleToScreen(ctr.ClientRectangle);
        gg.CopyFromScreen(rect.Location, Point.Empty, ctr.Size);

        bmp.Save(imagePath);
        Process.Start(imagePath);

    }
    catch (Exception)
    {
        //
    }
}

画像またはコントロール上に描画している可能性があります。画像使用の場合

    Image.Save("myfile.png",ImageFormat.Png)

コントロールで描画する場合は、Control.DrawToBitmap()を使用して、返された画像を上記のように保存します。

修正していただきありがとうございます。画面に直接描画できることを知りませんでした。

1
filip-fku
Graphics graph = CreateGraphics();
Bitmap bmpPicture = new Bitmap("filename.bmp");

graph.DrawImage(bmpPicture, width, height);
1
Cobusve