2012-01-09 2 views
1

誰かが私がそれを行うべきではないことを教えてもらえますか?なぜ私は物理的な記憶装置に図面を保存できませんか?パネルからの図面(コンテンツ)をC#で物理ストレージ上の任意のフォーマットに保存する方法は? (WinForms)

private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     Pen p = new Pen(Color.Red, 3); 
     Bitmap bmp = new Bitmap(700, 900); 
     Graphics gr = this.CreateGraphics(); 

     gr.DrawLine(p, new Point(30, 30), new Point(80, 120)); 
     gr.DrawEllipse(p, 30, 30, 80, 120); 

     //when i do this way it saves only a black rectangle, without other drawn content 
     bmp.Save(@"C:\testBMP.jpeg", ImageFormat.Jpeg); 


     // If i use the following 2 commented lines it saves only a empty rectangle. 

     //Rectangle rec = new Rectangle(0, 0, 700, 900); 
     // panel1.DrawToBitmap(bmp, rec); 


    } 

ありがとうございました!

+2

は、あなたがあなたのパネルの 'Paint'内部ビットマップを保存しますかイベント?つまり、フォームを再描画するたびに新しいファイルを作成します。これは他の場所で行う必要があります。ボタンがクリックされたとき。 – Groo

+0

@Groo、そうだよ!ありがとうございました! – meorfi

答えて

3

あなたはここでは2つの問題があります。

  1. パネルの内容を描画します。

    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
        using (Pen p = new Pen(Color.Red, 3)) 
        { 
         // get the panel's Graphics instance 
         Graphics gr = e.Graphics; 
    
         // draw to panel 
         gr.DrawLine(p, new Point(30, 30), new Point(80, 120)); 
         gr.DrawEllipse(p, 30, 30, 80, 120); 
        } 
    } 
    
  2. がイメージとしてあなたパネルの内容を保存:これは、このように、そのPaintイベントハンドラ内で行われるべきです。この部分はどこかを行うべきである(例えば、あなたが「保存」ボタンをクリックしたとき):

    private void saveButton_Click(object sender, EventArgs e) 
    { 
        int width = panel1.Size.Width; 
        int height = panel1.Size.Height; 
    
        using (Bitmap bmp = new Bitmap(width, height)) 
        { 
         panel1.DrawToBitmap(bmp, new Rectangle(0, 0, width, height)); 
         bmp.Save(@"C:\testBMP.jpeg", ImageFormat.Jpeg); 
        } 
    } 
    
+0

ありがとう!これは私の問題を解決し、ペイントイベント(wasntme) – meorfi

+1

@ meorfi:私はそれが助けてうれしいと言いたいことがもう一つある:あなたが作成するたびに(例えば、 'Pen'や' Bitmap'のような) 'IDisposable'を実装する新しいオブジェクトでは、使用直後に手動で処理する必要があります(これは' using'文が行うものです)。描画に関わるほとんどのクラスは使い捨てですので、「グラフィックス」を含む何かをするときはいつでもこのことを覚えておいてください。 'Graphics'も使い捨てですが、作成していない(' e.Graphics'プロパティの中に格納されています)、この場合は処理しないでください。 – Groo

+1

単純なカラーペンを使用しているので、新しいペンを作成する代わりにPens.Redを使用することができます。しかし、それを処分しないでください! –

3

インスタンスgrは、ビットマップ(bmp)とは関係ありません。つまり、フォームやコントロールに関連付けられたグラフィックスを作成し、別のビットマップを作成しています。ビットマップを保存すると、その中に何も描画されていません。

+0

は、コントロールに描画されたグラフィックスをビットマップオブジェクトに関連付けることができますし、その後にそれを保存する方法はありますか? – meorfi

+0

Grooは私を助けました:)興味があるなら、彼の反応を見てください。 – meorfi

+0

@meorfi - Grooは良い応答を持っています。私は会議に行かなければならなかった! – RQDQ

1

フォームからではなく、ImageからGraphicsオブジェクトを取得する必要があります。私はこれをテストしていませんが、うまくいくはずです。

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    using (Pen p = new Pen(Color.Red, 3)) 
    using (Bitmap bmp = new Bitmap(700, 900)) 
    using (Graphics gr = Graphics.FromImage(bmp)) 
    { 
     gr.DrawLine(p, new Point(30, 30), new Point(80, 120)); 
     gr.DrawEllipse(p, 30, 30, 80, 120); 

     bmp.Save(@"C:\testBMP.jpeg", ImageFormat.Jpeg); 
    } 
} 
+0

ありがとうございます。すべての描画されたコンテンツが物理的なイメージに現れました。画像の背景を設定する方法はありますか?物理的なファイルに黒い背景があるのが分かります... – meorfi

関連する問題