Чтобы перезаписать изображение, которое необходимо убедиться, что нет подключений к нему. Closing
, Disposing
или Cloning
недостаточно ...
Вот функция, которая создает действительно независимую копию:
Bitmap GetClone(string imageName)
{
if (!File.Exists(imageName)) return null;
Bitmap bmp2 = null;
using (Bitmap bmp = (Bitmap)Bitmap.FromFile(imageName))
{
bmp2 = new Bitmap(bmp.Width, bmp.Height, bmp.PixelFormat);
bmp2.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
using (Graphics g = Graphics.FromImage(bmp2))
{
g.DrawImage(bmp, 0, 0);
}
}
return bmp2;
}
Теперь вы можете сделать это:
string file = yourImageFileName;
Bitmap bmp = GetClone(file);
using (Graphics g = Graphics.FromImage(bmp))
{
// draw what you want..
g.DrawRectangle(Pens.Red, 11, 11, 199, 199);
}
bmp.Save(file, ImageFormat.Png); // use your own format etc..
Вы также должны позаботиться о том, чтобы не пропустить старые PictureBox.Image
версии. Вот вспомогательная функция:
void SetPBoxImage(PictureBox pbox, Bitmap bmp)
{
Bitmap dummy = (Bitmap)pbox.Image;
pbox.Image = null;
if (dummy != null) dummy.Dispose();
pbox.Image = bmp;
}