none
Imagefile umbenennen oder löschen welches einem Button zugeordnet ist RRS feed

  • 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

    Samstag, 5. Januar 2013 16:37

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

    Samstag, 5. Januar 2013 17:43
    Moderator

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

    Samstag, 5. Januar 2013 17:43
    Moderator
  • Hallo Marcel

    Funktioniert. Vielen Dank und noch ein schönes Wochenende.

    Gruss Robert

    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
    Samstag, 5. Januar 2013 18:32
  • 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

    Samstag, 5. Januar 2013 20:02
    Moderator
  • Hallo Marcel

    Vielen Dank für Deine aufschlussreiche Rückmeldung.

    Werde mir den Artikel gerne anschauen.

    Gruss Robert

    Samstag, 5. Januar 2013 23:44