Mit GDI+ das Image beim Speichern überschreiben

  • Hallo zusammen,

    folgender Code funzt nicht so, wie er soll:

    Ich kann keine Änderungen in die gleiche Datei zurückspeichern. Im Beispiel verändere ich nichts, da das egal ist. Auch so erhalte ich den Fehlercode 10, der leider bei _GDIPlus_ImageSaveToFile in der Hilfe nicht erklärt ist. Speichere ich in eine(n) andere Datei(namen), funzt es. Ich nehme an, GDI+ sorgt mit dem Handle dafür, das die Datei gesperrt ist. Aber ich würde eben gerne die Datei überschreiben und nicht dauernd neue Dateien erzeugen müssen.

    Gibt es einen Workaround?

    VG, Jens

  • Ich nehme mal stark an, dass _GDIPlus_ImageLoadFromFile das Handle auf dem Dateisystem offen hält und du somit nicht in die Datei schreiben kannst.
    Was du allerdings machen kannst, ist das Image zu manipulieren, das alte zu disposen und das neue zu saven.

    Als Beispiel kannst du z.B. mit _ImageScale das Bild skalieren und den Returnwert mit _ImageSaveToFile nutzen (vorher aber das alte $hFile mit _ImageDispose disposen).

  • Hallo Alpines,

    es funktioniert zwar, doch leider werden dabei die exif-Daten gelöscht. Kann man nicht irgendwie ein neues Handle basteln, ohne die Originaldaten (incl. exif) zu verändern?

  • Kannst ja die zu öffnende Datei erst woanders hinkopieren, dann öffnen und unter dem alten namen speichern. Löschst am Ende die kopierte Datei und fertig.
    Ansonsten würd ich mal _GDIPlus_BitmapCreateFromMemory probieren. Da kannst du selbst fileopen (als binary) und fileclose aufrufen. Dann dazwischen das fileread an die Funktion geben. Ich kann mir nur vorstellen, dass die exifdaten dabei auch verloren gehen.
    ggf. mit einem exiftool die daten kopieren und später wieder einfügen.

    Hab grad auch mal ne Funktion geschrieben, um den Exifheader aus der Datei zu lesen. Die sollte man dann vor die andere Datei packen können... Keine Ahnung, obs so funktioniert, sollte aber :)

  • Vielen Dank an alle,

    Ich habe es jetzt ähnlich wie

    Kannst ja die zu öffnende Datei erst woanders hinkopieren, dann öffnen und unter dem alten namen speichern. Löschst am Ende die kopierte Datei und fertig.

    ....gemacht. @Kanashius: Wie willst du die Exif-Daten deiner 2. Idee denn wieder mit der neuen Datei zusammenfügen?

    UEZs Vorschlag wird auf alle Fälle nötig, wenn man noch mehr mit dem Image macht.

    Auch Microsoft schreibt zu gdip_imagesavetofile : "GDI+ does not allow you to save an image to the same file that you used to construct the image."

    Vor dem Problem dürften dann ja schon viele gestanden haben...

    Falls es wen interessiert, hier der Workarround, der bei mir funzt:

    Einmal editiert, zuletzt von Trubadour (21. Juli 2017 um 15:47)