Użyłem poniżej rozwiązań (ładowanie Image ze strumienia), ale się nowy problem. img obiekt jest absolutnie poprawny instancja klasy Image z wszystkimi polami wypełnionymi poprawnymi wartościami. Ale nazywając
img.Save("path/to/new/image.bmp");
na nim powoduje nowego wyjątku dla GDI + (System.Runtime.InteropServices.ExternalException w interfejsie GDI +) - dostaję komunikat o błędzie, ale jest w języku polskim, nie jestem pewien, jak to przetłumaczyć.
pytanie Original
Mam problem z C# .NET Framework 2.0
Zasadniczo I'am chce osiągnąć:
Image img = Image.FromFile("Path/To/Image.bmp");
File.Delete("Path/To/Image.bmp"); // Exception, the file is in use!
Ważne jest dla mnie, aby zachować kopię obrazu w pamięci, gdy oryginalny plik został usunięty. Chociaż jest to jakoś dziwne, że .NET nadal blokuje plik na dysku twardym, mimo że nie jest już potrzebny do żadnej operacji (cały obraz jest teraz w pamięci, czyż nie?)
Próbowałem tego rozwiązania:
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!
mogę zrobić:
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!
Ale to wydaje mi się prawie jak za pomocą nuke zabić błąd ... i rodzi kolejny problem: GDI słabo wspierać Naniesienie wizerunków palety opartej na siebie (i palety większość stanowią moje zbiory).
Czy robię coś nie tak? Czy jest jakiś lepszy sposób na zapisanie Obrazu w pamięci i usunięcie oryginalnego pliku z dysku twardego?
Dzięki, działa bezbłędnie i jest szybszy niż moje rozwiązanie :) – PiotrK
WHOW !!! Masz moje WIELKIE podziękowania. Działa to jak uroku :) (rozwiązanie z DllImport) thx dużo :) –
Obraz utworzony przez tę funkcję traci swój RawFormat (który mówi format, w którym obraz został zapisany jako). Może to stanowić problem, jeśli chcesz zapisać go w strumieniu, który da wyjątek podczas przesyłania strumienia i RawFormat obrazu. Ponadto, podczas zapisywania obrazu, zawsze będzie domyślnie png, chyba że podano inaczej. – user886079