Да, файл блокируется при загрузке первого растрового объекта, и, таким образом, bmpClone.Save()
в тот же файл не удается, потому что у вас есть логическая тупик.
При открытии растровых изображений по имени файла файл блокируется на протяжении всего срока действия растрового изображения. Если вы используете поток, поток должен оставаться открытым.
Обновление
Если вы хотите, чтобы в памяти было два растровых изображения для использования вне области действия метода, в котором вы находитесь, тогда вы не будете использовать блок using
.
Создайте первое изображение из файла, а затем клонируйте его. Используйте их по мере необходимости на протяжении всего жизненного цикла пользовательского интерфейса, но обязательно очищайте их, используя Dispose()
, когда они больше не нужны, чтобы высвободить базовые ресурсы.
Также из MSDN:
Сохранение изображения в тот же файл
был построен из не допускается
и выбрасывает исключение
Это довольно неловко. Если объект, созданный с помощью clone()
, хранит информацию об источнике изображения (например, дескриптор исходного файла) или вы не можете разблокировать файл иным образом при использовании экземпляров Bitmap, то вам, вероятно, придется либо сохранить его в новый файл или открыть из временной копии оригинала.
Попробуйте вместо этого:
// ... make a copy of test.jpg called test_temp.jpg
Bitmap bmpOriginal = new Bitmap("C:\\test_temp.jpg"))
Bitmap bmpClone = (Bitmap)bmp.Clone();
// ... do stuff
bmpClone.RotateFlip(RotateFlipType.Rotate180FlipNone);
bmpClone.Save("C:\\test.jpg");
// ... cleanup
bmpOriginal.Dispose();
bmpClone.Dispose();