Во-первых, было бы неплохо, если бы вы использовали ключевое слово "using
", чтобы охватить использование ваших одноразовых объектов (например, Bitmap
и Graphics
), вместо того, чтобы вызывать Dispose()
вручную для каждого. Использование «using
» лучше по многим причинам, таким как очистка содержимого при возникновении исключения, но также очень помогает для читабельности кода.
Во-вторых, кисти GDI также являются IDisposable
объектами, поэтому вы не должны создавать и забывать их. Сделайте это вместо:
using (var brush = new SolidBrush(Color.White))
{
g.FillRectangle(brush, 0, 0, width, height)
}
... или, что еще лучше, создайте свои кисти в начале своего приложения и держитесь за них до конца (но не забывайте также утилизировать их). IIRC, создание / утилизация кистей значительно влияет на производительность, если делать это часто.
В-третьих, я считаю, что ваша ошибка во 2-м разделе:
- Вы открываете изображение "ruta2"
- Вы создаете новое изображение
- Вы рисуете содержимое "ruta2" внутри этого нового изображения
- Вы сохраняете эту новую вещь поверх файла "ruta2", но исходное изображение из шага 1 все еще загружается и, вероятно, имеет некоторый дескриптор файла "ruta2", поэтому вам нужно избавиться от него перед тем, как перезаписать файл.
Если вы реорганизуете второй раздел, как это, он должен работать:
using (var b = new Bitmap(OtherWidth, OtherHeight))
using (var g = Graphics.FromImage(b))
{
using (var brush = new SolidBrush(Color.Red))
{
g.FillRectangle(brush, 0, 0, b.Width, b.Height);
}
using (var pic = new Bitmap(ruta2))
{
g.DrawImage(pic, 0, 0, pic.Height, pic.Width);
}
b.Save(ruta2, ImageFormat.Jpeg);
}