Benutzer mit den meisten Antworten
Imagefile umbenennen oder löschen welches einem Button zugeordnet ist

Frage
-
Hallo NG
Habe eine Art Gallerie mit Buttons welche als Hintergundbild verschiedene Bilder enthalten.
Ich möchte nun entweder die dazugehörige Bilddatei umbenennen oder löschen.
Bekomme jedoch die Fehlermeldung:
"Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird."
Habe schon verschiedene Möglichkeiten ausprobiert die Bilddateien zu laden. Leider ohne Erfolg.
Auch das loslösen der Datei mit
ButtonDocument.BackgroundImage = null;
bringt nichts.
Gruss
Robert Oberholzer
Antworten
-
Hallo Robert,
das liegt mit großer Wahrscheinlichkeit daran, dass Du noch nicht Image.Dispose() aufgerufen hast. Die Image-Instanz hält unter diesen Umständen ein GDI+-Handle am Leben und GDI+ blockiert seinerseits den Zugriff auf die Datei.
Der Aufruf von Image.Dispose() wird direkt an GDI+ weitergeleitet:
SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(this, this.nativeImage));
Erst dann wird der Zugriff auf die Datei zugelassen.
Was kann man also machen? Du kannst z.B. das Bild in ein temporäres Bitmap kopieren und dann die nicht mehr benötigte Image-Instanz freigeben:public Image CopyImageFromFile(string imageFilePath) { Image imageOriginal = Image.FromFile(imageFilePath); Image imageCopy = new Bitmap(imageOriginal.Width, imageOriginal.Height); Graphics graphics = Graphics.FromImage(imageCopy); graphics.DrawImage(imageOriginal, 0, 0); imageOriginal.Dispose(); return imageCopy; }
Im weiteren kannst Du dann mit der zurückgegebenen Image-Kopie arbeiten.
Gruß
Marcel- Als Antwort markiert Robert Oberholzer Samstag, 5. Januar 2013 18:17
Alle Antworten
-
Hallo Robert,
das liegt mit großer Wahrscheinlichkeit daran, dass Du noch nicht Image.Dispose() aufgerufen hast. Die Image-Instanz hält unter diesen Umständen ein GDI+-Handle am Leben und GDI+ blockiert seinerseits den Zugriff auf die Datei.
Der Aufruf von Image.Dispose() wird direkt an GDI+ weitergeleitet:
SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(this, this.nativeImage));
Erst dann wird der Zugriff auf die Datei zugelassen.
Was kann man also machen? Du kannst z.B. das Bild in ein temporäres Bitmap kopieren und dann die nicht mehr benötigte Image-Instanz freigeben:public Image CopyImageFromFile(string imageFilePath) { Image imageOriginal = Image.FromFile(imageFilePath); Image imageCopy = new Bitmap(imageOriginal.Width, imageOriginal.Height); Graphics graphics = Graphics.FromImage(imageCopy); graphics.DrawImage(imageOriginal, 0, 0); imageOriginal.Dispose(); return imageCopy; }
Im weiteren kannst Du dann mit der zurückgegebenen Image-Kopie arbeiten.
Gruß
Marcel- Als Antwort markiert Robert Oberholzer Samstag, 5. Januar 2013 18:17
-
Hallo Marcel
Habe noch eine weitere Möglichkeit herausgefunden.
public Image CopyImageFromFile(string imageFilePath) { Image imageOrginal = Image.FromFile(imageFilePath); Image imageThumb = imageOrginal.GetThumbnailImage(100, 100, null, new IntPtr()); //Image imageThumb = imageOrginal.GetThumbnailImage(imageOrginal.Width, imageOrginal.Height, null, new IntPtr()); imageOrginal.Dispose(); return imageThumb; }
Gruss Robert -
Hallo Robert,
Das ist selbstverständlich auch eine Möglichkeit, wenn Du Thumbnails brauchst. Ein Thumbnail ist eine verkleinerte Kopie des Originals. Im wesentlichen macht GDI+ also auch nur das, was wir im ersten Code-Ausschnitt oben gesehen haben: Das Bild kopieren.
Eines soll dazu aber noch gesagt werden: Falls die Bilddatei bereits ein eingebettetes Thumbnail enthält, wird GDI+ dieses eingebettete Thumbnail zurückgeben und keine eigene Kopie erstellen. Die Skalierung einer bereits skalierten Version kann zu Qualitätseinbußen führen. Wenn Du mehr darüber erfahren möchtest, könntest Du einen sehr interessanten Blogk-Artikel von Dan Byström zum Thema lesen.Gruß
Marcel