グラフィックス PictureBox の Image プロパティに関する良く有る勘違い PictureBox に画像を表示する方法と仕て PictureBox の Image プロパティを使う方法と Graphics の DrawImage メソッドを使う方法が有るが 此の 2 つの方法を混同し 正しく理解して居ない事が多い様で有る 例えば 下記に列挙する様な状況が 此れに該当する 1.PictureBox の Graphics オブジェクトを使って PictureBox に画像や図形を描画し 其のイメージを保存する為に PictureBox の Image プロパティの Save メソッドを呼び出すと エラーが発生するか 又は 期待する結果が得られない 2.PictureBox の Graphics オブジェクトを使って PictureBox に描画し 其のイメージを PictureBox の Image プロパティで取得しようとすると エラーが発生するか 又は 期待する結果が得られない 3.PictureBox の Image プロパティで画像を表示し 更に PictureBox の Graphics オブジェクトを使って PictureBox に図形を描画すると 他のウィンドウに隠れた後等で 描画した図形が消えて仕舞う 上記の様なトラブルは PictureBox の Graphics オブジェクトを使って描画した画像や図形が 其の PictureBox の Image プロパティに反映されると勘違いした事に起因する 併し 実際には PictureBox の Graphics オブジェクトに何を描画しようが 其れが PictureBox の Image プロパティに反映される事は無い 此の 2 つは 全く別の方法なので有る 詰まり 此の様なトラブルを解決する方法と仕ては 以下の孰れかに成る 1.PictureBox の Image プロパティを一切使用しない 2.PictureBox の Graphics オブジェクト (PictureBox.Paint イベントと PictureBox.CreateGraphics メソッド ) を一切使用しない PictureBox の Image プロパティを一切使用しない方法 先ずは 1 番目の方法で有る 此処では Graphics の DrawImage メソッドを使う方法を使ってピクチャボックスに画像や図形を描画して居る場合に ピクチャボックスに表示されて居るイメージを何の様にすれば保存出来るかと謂う問題に絞って説明する 此れには 色々な方法が考えられるが 其の一つは ピクチャボックスに表示する画像を Bitmap オブジェクトに描画し Paint イベントでは 其の Bitmap を描画すると謂う物が有る 以下に具体例を示す フォームにピクチャボックス PictureBox1 とボタン Button1 Button2 が有る物とし Button1 をクリックする事に依りピクチャボックスに図形を描画し Button2 をクリックする事に依り画像を保存して居る -1-
' PictureBox1 に表示する画像 Private BMP As Bitmap = Nothing Visual Basic ' フォームの Load イベントハンドラ Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles MyBase.Load ' 300x300 の大きさのイメージを BMP に設定 BMP = New Bitmap(300, 300) ' Button1 の Click イベントハンドラ Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Button1.Click ' BMP に設定されて居るイメージの Graphics オブジェクトを取得 Dim G As Graphics = Graphics.FromImage(BMP) ' イメージに描画 G.FillPie(Brushes.Red, 50, 50, 200, 200, 0, 360) ' Graphics の破棄 G.Dispose( ) ' PictureBox の再描画 PictureBox1.Invalidate( ) ' Button2 の Click イベントハンドラ Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Button2.Click ' ピクチャボックスに表示されて居る画像を保存 If Not (BMP Is Nothing) Then BMP.Save("C: test.png") End If ' PictureBox1 の Paint イベントハンドラ Private Sub PictureBox1_Paint(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) _ Handles PictureBox1.Paint ' 画像の表示 If Not (BMP Is Nothing) Then e.graphics.drawimage(bmp, 0, 0, BMP.Width, BMP.Height) End If -2-
// PictureBox1 に表示する画像 private Bitmap bmp = null; C# // フォームの Load イベントハンドラ private void Form1_Load(object sender, System.EventArgs e) // 300x300 の大きさのイメージを bmp に設定 bmp = new Bitmap(300, 300); // Button1 の Click イベントハンドラ private void Button1_Click(object sender, System.EventArgs e) // bmp に設定されて居るイメージの Graphics オブジェクトを取得 Graphics g = Graphics.FromImage(bmp); // イメージに描画 g.fillpie(brushes.red, 50, 50, 200, 200, 0, 360); // Graphics を破棄する g.dispose( ); // PictureBox の再描画 PictureBox1.Invalidate( ); // Button2 の Click イベントハンドラ private void Button2_Click(object sender, System.EventArgs e) // ピクチャボックスに表示されて居る画像を保存 if (bmp!= null) bmp.save("c: test.png"); // PictureBox1 の Paint イベントハンドラ private void PictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) // 画像を表示する if (bmp!= null) e.graphics.drawimage(bmp, 0, 0, bmp.width, bmp.height); -3-
PictureBox の Graphics オブジェクトを一切使用しない方法 此の場合は PictureBox の Image プロパティに指定されたイメージに直接描画すれば良いと謂う事に成る 詰まり 下記の様に成る 1.PictureBox の Image プロパティに画像 ( イメージ ) が設定する 2.Graphics.FromImage メソッドに依り Image プロパティに設定したイメージの Graphics オブジェクトを取得し 此れを使って描画する 3.PictureBox の Invalidate メソッドに依り 再描画する 此の方法に依り ピクチャボックスに図形を描画するサンプルを 下記に示す 此処では フォームにピクチャボックス PictureBox1 とボタン Button1 が有る物とし Button1 をクリックすると PictureBox1 に赤い丸が表示される Visual Basic ' フォームの Load イベントハンドラ Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.Load ' 300x300 の大きさのイメージを Image プロパティに設定 PictureBox1.Image = New Bitmap(300, 300) ' Button1 の Click イベントハンドラ Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click ' Image プロパティに設定されて居るイメージの Graphics オブジェクトを取得 Dim G As Graphics = Graphics.FromImage(PictureBox1.Image) ' イメージに描画 G.FillPie(Brushes.Red, 50, 50, 200, 200, 0, 360) ' Graphics の破棄 G.Dispose( ) ' PictureBox の再描画 PictureBox1.Invalidate( ) C# // フォームの Load イベントハンドラ private void Form1_Load(object sender, System.EventArgs e) // 300x300 の大きさのイメージを Image プロパティに設定 PictureBox1.Image = new Bitmap(300, 300); -4-
// Button1 の Click イベントハンドラ private void Button1_Click(object sender, System.EventArgs e) // Image プロパティに設定されて居るイメージの Graphics オブジェクトを取得 Graphics g = Graphics.FromImage(PictureBox1.Image); // イメージに描画 g.fillpie(brushes.red, 50, 50, 200, 200, 0, 360); // Graphics の破棄 g.dispose( ); // PictureBox の再描画 PictureBox1.Invalidate( ); 前記の PictureBox の Image プロパティを一切使用しない方法 と同じ様なコードに成るが 此の方法の方がより簡単な分 融通は利かない -5-