3

私は、pictureBox コントロールを保持する C# winForm アプリケーションを持っています。このコントロールには Paint イベントがあります。ペイント イベントが発生するたびに、ビットマップが動的に作成され、その上で描画を実行します。そして、ユーザーが「保存」ボタンをクリックすると、編集された画像がjpgファイルとして保存されます。

今までは大丈夫です。pictureBox コントロールに新しい画像をロードすると、以前の編集内容がまだ生きています。

新しい画像をロードするたびに、ビットマップを消去して新たに開始するにはどうすればよいですか。

private void pb_Resim_Paint(object sender, PaintEventArgs e)
{
  List<eVucutParcalari> list = new List<eVucutParcalari>(pointList.Keys);
  // Loop through list
  foreach (eVucutParcalari k in list)
  {
    Dictionary<Point, Color> dicItem = pointList[k];
    foreach (KeyValuePair<Point, Color> pair in dicItem)
    {
      Point p = pair.Key;
      Color c = pair.Value;
      SolidBrush brush = new SolidBrush(c);

      if (pb_Resim.Image == null)
        return;
      Bitmap bmp = new Bitmap(pb_Resim.Image);
      Graphics gr = Graphics.FromImage(bmp);
      gr.FillRectangle(brush, p.X, p.Y, 5, 5);
      pb_Resim.Image = bmp;
    }
  }
}
4

3 に答える 3

2

新しいファイルをロードするときにまったく新しいビットマップを作成し、現在 pb_Resim.Image に割り当てられているビットマップをロード時に置き換えてみませんか? これにより、以前のビットマップを「クリア」する労力を費やす必要なく、GC によって古いビットマップを収集できるようになり、新しくロードされたファイルのあらゆる種類のジャンクが残っていない、真新しい新鮮なビットマップが確実に得られます。

于 2009-07-01T15:58:24.727 に答える
0

Christian Graus は GDI+ に関するいくつかの記事を書きました。これらはCodeProjectで見つけることができます。(GDI+ の記事まで下にスクロールします。) それらはあなたが行っている活動の種類に直接関係しているので、目を通しておくことをお勧めします。

于 2009-07-01T16:17:38.983 に答える
0

たまたま画像ファイルのビットマップオブジェクトである前のコンテンツの画像ボックスをクリアするつもりだったと思います。

新しいブラシ、新しいビットマップ、新しいビットマップからの新しいグラフィック キャンバスの取得は既に完了しています。

新しい PictureBox を作成する可能性はありますか?

それは、私のアプリが一連の画像を繰り返しすばやく表示する必要があったときに行ったことだからです。refresh()を使用するなど、ピクチャボックスをクリアするより良い方法があると確信しています。

foreach ( ... )
{
  pb_Resim = new PictureBox();
  configPictureBoxDimensions();

  ...

}

最初に refresh() を試してみませんか? それはうまくいくはずです。

foreach ( ... )
{
  pb_Resim = bmp;
  pb_Resim.refresh();

  ...

}
于 2009-08-10T05:51:34.560 に答える