Laden...

Dateizugriff durch Bitmap-Objekt beenden

Erstellt von sowas1111 vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.179 Views
Thema geschlossen
S
sowas1111 Themenstarter:in
22 Beiträge seit 2011
vor 12 Jahren
Dateizugriff durch Bitmap-Objekt beenden

Guten Tag,
mein neues Problem sieht folgendermaßen aus:
Ich habe in eine pictureBox eine BMP aus einer Datei geladen.
Wenig später (wenn der Nutzer dies auswählt) wird diese BMP gelöscht.
Leider fliegt das Programm bei mir raus, weil es noch selber auf die Datei zugreift!
Da der Befehl:

pictureBox1.Image = Bitmap.FromFile("C:\\Bild.bmp");

keine weiter Möglichkeit bietet, den Zugriff auf die Datei zu beenden, wollte ich mal fragen, wie man das sonst machen kann.
Danke für Tipps!

1.552 Beiträge seit 2010
vor 12 Jahren

Hallo sowas1111,

Die Datei wird zwar nach erfolgreichem Laden wieder geschlossen aber die das Bild wird "gesperrt" und wird erst in dem Moment freigegeben sobald das Image disposed wird, also sobald du pictureBox1.Image.Dispose() aufrufst oder dies irgendwie anderweitig aufgerufen wird, z.b. durch Schließen des Fensters.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo xxMUROxx,

pictureBox1.Image.Dispose() ist keine so gute Idee, denn solange das Bild an PictureBox.Image zugewiesen ist, wird es von der PictureBox benötigt und da sollte man es der PictureBox nicht "unter dem Hintern wegziehen".

Hallo sowas1111,

trotzdem ist natürlich richtig, dass Bitmap.Dispose den Dateizugriff beendet.

Wenn du beides gleichzeitig brauchst, also Zugriff auf das Bitmap-Objekt und Zugriff auf die Bild-Datei, gibt es im Grunde zwei Möglichkeiten (wurde auch schon mehrmals im Forum besprochen).

Bitmap normal laden und dann umkopieren, z.B. mit new Bitmap/Graphics.FromImage/Graphics.DrawImage oder einfach mit Bitmap.Clone und dann das Original mit Dispose zerstören.

Oder noch besser, klarer und sicherer Inhalt der der Bilddatei laden (File.ReadAllBytes), in einen MemoryStream packen und das Bitmap-Objekt aus diesem Stream laden.

herbivore

1.552 Beiträge seit 2010
vor 12 Jahren

Hallo herbivore,

hab mich etwas ungünstig ausgedrückt. Hab natürlich nicht gemeint, dass man das Dispose auf der PictureBox.Image direkt aufruft, sondern dass das Image Disposed werden muss, unabhängig der PictureBox. Wollte mit pictureBox1.Image.Dispose() nur aufzeigen welches Image Disposed werden muss.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

S
sowas1111 Themenstarter:in
22 Beiträge seit 2011
vor 12 Jahren
Funktioniert noch nicht

Danke für die Vorschläge,
das hier funktioniert aber noch nicht...


Bitmap bild1 = new Bitmap(Bitmap.FromFile(C:\\Bild.bmp"));
Bitmap bild = new Bitmap(bild1);
bild1.Dispose();
pictureBox1.Image = bild;

Wenn ich jetzt File.Delete("C:\Bild.bmp"); mache, stürtzt das Programm immer noch ab...

P
157 Beiträge seit 2010
vor 12 Jahren

Wie wäre es wenn du einenen DateiStream erstellst und die Bitmap über diesen öffnest:


FileStream fs = new FileStream("C:\\Bild.bmp",FileMode.Open);
Bitmap bmp = new Bitmap(fs);
fs.Close();

Hinweis von herbivore vor 12 Jahren

Nicht gut, man darf dem Bitmap-Objekt nicht den Stream unter dem Hintern wegziehen.

S
sowas1111 Themenstarter:in
22 Beiträge seit 2011
vor 12 Jahren
Jetzt funktioniert es!

Danke für die Hilfe, jetzt funktioniert es nämlich!
So habe ich den Problem jetzt geändert:


FileStream bild1 = new FileStream(C:\\Bild.bmp", FileMode.Open);
Bitmap bild = new Bitmap(bild1);
bild1.Dispose();
bild1.Close();
pictureBox1.Image = bild;

und später dann:


File.Delete("C:\\Bild.bmp");

Danke für die Hilfe!

Hinweis von herbivore vor 12 Jahren

Am sichersten ist immer noch der Weg über den MemoryStream.

Thema geschlossen