EXIF-Vorschaubild extrahieren



  • Ich habe nun mit google viel Code gefunden, der die verschiedensten EXIF-Informationen ausliest. Aber leider keinen, der das EXIF-Vorschaubild ausliest.
    Ich möchte lediglich das Vorschaubild aus einer Datei auslesen und anschliessend als separate JPG abspeichern.
    Hat da jemand eine Idee ?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Vor einiger Zeit habe ich einmal einen Exif-Tagger geschrieben (allerdings in C++), der auch das Vorschaubild ggf. anzeigt.
    Das Bild im IFD1-Verzeichnis gespeichert, wo du die Breite & Höhe und das Format auslesen kannst. Viele (die meisten?) Digitalkameras speichern das Vorschaubild bereits als jpeg, sodass es in diesen Fällen auf ein einfaches memcpy hinauslaufen sollte.

    Übrigens: Bei der Entwicklung hat mir dieses Dokument und ein Hexeditor sehr geholfen.

    Viel Spaß.



  • Das Dokument verweist leider auf Internetseiten, die es nicht mehr gibt.



  • Ja?
    Bei mir funktioniert der Link einwandfrei, auf diesem Rechner hatte ich die Datei auch nicht gespeichert.
    Du kannst dir aber auch andere Seiten zur Spezifikation des Formats ansehen.

    Wirklich zu beachten ist aber, dass unglücklicherweise sowohl little- als auch big endian unterstützt wird und die Bytes ggf. geswapped werden müssen.

    PS: Bei google ist die Seite bei mir an dritter Position auf Seite 2 aufgelistet (www.sanzui.com/main/file/exif19.pdf); mir hat es wirklich geholfen.



  • So jetzt habe ich durch die Anhänge alles gefunden.
    Aber bei meinen Dateien stimmt da irgendetwas nicht.
    In der Spezifikation steht
    0x010f make (=marke)
    0x0110 model (=kameratyp)

    Ich habe mir dann mit einem Hex-Editor gedit die Dateien angesehen und festgestellt:
    in meinen Dateien stehen diese Informationen auf anderen Adressen :
    00aa bzw. 00b4

    Muss man die angegeben Adressen irgendwie umrechnen ? Falls ja: wie ?



  • Es ist schon einige Zeit her, dass ich mir über das Format Gedanken gemacht habe, aber kurz aus der Erinnerung:
    Du suchst in der Datei nach 0xFFE1, merkst dir unbedingt, ob der Exif-Block im little- oder bigendian-Format vorliegt, und suchst nach den Verzeichnissen IFD0 und IFD1. Wie ein solches Vorzeichnis aufgebaut ist, kannst du dem pdf-Dokument entnehmen (alle Einträge liegen imho direkt hintereinander).

    Jeder Eintrag hat eine feste Größe:
    Tag (2 Byte), Format (2), Anzahl d. Komponenten (4), Wert oder Offset (4).

    Wenn das Format*Komponenten <= 4 Byte ist, ist der Wert direkt gspeichert, andernfalls ist es ein Offset innerhalb der Datei.

    Beispiel 0x010f (Make).
    Tag (2 Byte) = 0x010f 
    Format (2) = ascii string (0x02)
    Anzahl d. Komponenten (4) = ein Wert
    Offset (4) = ein Wert
    

    0x010f ist also keine Adresse. Wenn du den Wert auslesen möchtest, springst du zum angegebenen Offset und liest soviel Bytes ein, wie bei den Komponenten angegeben wurde. Hier ist zu beachten, dass die Zeichenfolge _nicht_ nullterminiert ist.

    Ich hoffe, ich konnte zumindest etwas helfen..


Anmelden zum Antworten