如何擦除位图上的内容

时间:2009-07-01 15:55:16

标签: c# drawing bitmap erase

我有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;
    }
  }
}

3 个答案:

答案 0 :(得分:2)

为什么不在加载新文件时创建一个全新的位图,并在加载时替换当前分配给pb_Resim.Image的位图?这将允许GC收集旧的位图,而无需您花费任何精力“清除”前一个位图,并确保您拥有一个全新的位图,而不会为新加载的文件留下任何残留的垃圾。

答案 1 :(得分:0)

Christian Graus撰写了几篇关于GDI +的文章,你可以在CodeProject找到。 (向下滚动到GDI +文章。)因为它们与您正在进行的活动类型直接相关,所以我建议您仔细查看。

答案 2 :(得分:0)

我认为你的意思是清除之前内容的图片框,它恰好是图像文件的位图对象。

你已经完成了 新画笔,新位图,从新位图获取新的图形画布。

有可能做一个新的PictureBox吗?

因为这就是我的应用程序必须快速反复显示一组图像时所做的事情。我确信有更好的方法来清除图片框,比如使用refresh()。

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

  ...

}

为什么不首先尝试刷新()?它应该工作。

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

  ...

}