UPDATED
Я использовал нижеприведенные решения (загрузка изображения из потока), но получил новую проблему. Объект img абсолютно правильный экземпляр класса изображения со всем полем, заполненным правильными значениями. Но при вызове
img.Save("path/to/new/image.bmp");
в нем приводит к новому исключению для GDI + (System.Runtime.InteropServices.ExternalException, в интерфейсе GDI +) - я получаю сообщение об ошибке, но на польском языке, я не знаю, как его перевести.
Исходный вопрос
У меня проблема с C # .NET Framework 2.0
В основном я пытаюсь добиться:
Image img = Image.FromFile("Path/To/Image.bmp");
File.Delete("Path/To/Image.bmp"); // Exception, the file is in use!
Для меня важно сохранить копию изображения в памяти, когда исходный файл был удален. Мне кажется странным, что .NET все еще блокирует файл на жестком диске, несмотря на то, что он больше не требуется для каких-либо операций (весь образ теперь находится в памяти, не так ли?)
Поэтому я попробовал это решение:
Image img = new Image(Image.FromFile("Path/To/Image.bmp")); // Make a copy
// this should immiedietaly destroy original loaded image
File.Delete("Path/To/Image.bmp"); // Still exception: the file is in use!
Я могу:
Image img = null;
using(Image imgTmp = Image.FromFile("Path/To/Image.bmp"))
{
img = new Bitmap(imgTmp.Width, imgTmp.Height, imgTmp.PixelFormat);
Graphics gdi = Graphics.FromIage(img);
gdi.DrawImageUnscaled(imgTmp, 0, 0);
gdi.Dispose();
imgTmp.Dispose(); // just to make sure
}
File.Delete("Path/To/Image.bmp"); // Works fine
// So I have img!
Но мне кажется, что это похоже на использование ядерной бомбы для уничтожения ошибки ... и возникает другая проблема: GDI плохо поддерживает рисование изображений на основе палитры друг на друге (а палитры составляют большинство в моей коллекции).
Я что-то не так делаю? Есть ли лучший способ сохранить изображение в памяти, а исходный файл удалить с жесткого диска?