簡體   English   中英

如何擦除位圖上的內容

[英]How to erase content on a Bitmap

我有C#winForm應用程序,它擁有一個pictureBox控件。 此控件具有Paint事件。 每次觸發paint事件時,都會動態創建一個Bitmap,並對其執行一些繪制。 當用戶點擊“保存”按鈕時,編輯的圖像保存為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;
    }
  }
}

為什么不在加載新文件時創建一個全新的位圖,並在加載時替換當前分配給pb_Resim.Image的位圖? 這將允許GC收集舊的位圖,而無需您花費任何精力“清除”前一個位圖,並確保您擁有一個全新的位圖,而不會為新加載的文件留下任何殘留的垃圾。

Christian Graus撰寫了幾篇關於GDI +的文章,您可以在CodeProject上找到它們。 (向下滾動到GDI +文章。)因為它們與您正在進行的活動類型直接相關,所以我建議您仔細查看。

我想你的意思是清除以前內容的圖片框,它恰好是圖像文件的位圖對象。

您已經完成了新的畫筆,新的位圖,從新的位圖獲取新的圖形畫布。

有沒有機會做一個新的PictureBox?

因為這就是我的應用程序必須快速反復顯示一組圖像時所做的事情。 我確信有更好的方法可以清除圖片框,比如使用refresh()。

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

  ...

}

為什么不首先嘗試refresh()? 它應該工作。

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

  ...

}

暫無
暫無

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

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