Как стереть содержимое на растровом изображении

У меня есть приложение C# winForm, которое содержит элемент управления pictureBox. Этот элемент управления имеет событие 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;
    }
  }
}

person Community    schedule 01.07.2009    source источник


Ответы (3)


Почему бы не создать совершенно новое растровое изображение при загрузке нового файла и не заменить растровое изображение, назначенное в настоящее время pb_Resim.Image при загрузке? Это позволит GC собирать старое растровое изображение, не требуя от вас каких-либо усилий по «очистке» предыдущего растрового изображения, и гарантирует, что у вас есть совершенно новое, свежее растровое изображение без какого-либо остаточного мусора для вновь загруженного файла.

person jrista    schedule 01.07.2009


Я думаю, вы имели в виду очистить поле изображения от предыдущего содержимого, которое оказалось растровым объектом файла изображения.

Вы уже сделали новую кисть, новое растровое изображение, получили новый графический холст из нового растрового изображения.

Есть ли шанс сделать новый PictureBox?

Потому что это то, что я сделал, когда моему приложению нужно было быстро и грязно неоднократно отображать набор изображений. Я уверен, что есть лучший способ очистить изображение, например, с помощью Refresh().

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

  ...

}

Почему бы вам сначала не попробовать Refresh()? Он должен работать.

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

  ...

}
person Blessed Geek    schedule 10.08.2009