• Neuer Gutscheincode unseres Partners Schutzfolien24:
    DSLR-Forum2025
    Dauerhaft 10% Rabatt auf alle Displayschutzfolien und Schutzgläser der Eigenmarken
    "Upscreen", "Screenleaf", BROTECT" und "Savvies".
    Der Code ist für alle Geräteklassen gültig.
  • Stimmt ab über die Sieger des DSLR-Forum Fotowettbewerbs Mai 2025.
    Thema: "Grün"

    Nur noch bis zum 31.05.2025 23:59!
    Jeder darf abstimmen!
    Zur Abstimmung und Bewertung hier lang
  • In eigener Sache!

    Liebe Mitglieder, liebe Besucher und Gäste
    ich weiß, es ist ein leidiges Thema, aber ich muss es ansprechen: Werbung, Werbeblocker und Finanzierung des Forums.
    Bitte hier weiterlesen ...

  • Nicht erreichbare Adressen im Benutzerkonto
    Wir bekommen zurzeit eine große Anzahl an E-Mails, die das System zum Beispiel als Benachrichtigungen an Nutzer verschickt,
    als unzustellbar zurück, weil z.B. die Adressen nicht erreichbar sind oder das Postfach gar nicht existiert.
    Stellt doch bitte sicher, dass die Benachrichtigungen, die ihr vom System erwartet, auch zugestellt werden können.
    Nicht erreichbare E-Mail-Adressen sind dazu wenig hilfreich.
    Danke!
  • Unlauterer Verkäufer wieder unterwegs!

    Liebe Mitglieder,
    Florian Franzek, der seit Jahren mit verschiedensten Usernamen in allen möglichen Foren und auf etlichen Verkaufsplattformen auftritt,
    ist wieder hier im Forum und versucht, ehrliche Käufer zu betrügen.
    Wir können wenig tun, außer bei Bekanntwerden einer weiteren Registrierung eines Accounts für seine Machenschaften, diese umgehend zu sperren.
    Ich empfehle, bei Kontakt umgehend die Polizei einzuschalten.

WERBUNG

Exif Daten in C++ auslesen

epp4

Themenersteller
Hi,
ich habe schon seit einiger Zeit ein selbstgeschriebenes Tool im Einsatz, mit dem ich meine Bilder organisiere, darin enthalten auch z.B. eine Suche nach gewissen Exif-Werten.

Basis war die Klasse CExif.cpp, wie man sie im Internet z.B. bei CodeProject findet. Nun ist diese aber von 2003 und ich stehe bei gewissen Exif-Tags an. Ich möchte z.B. die LensSpecification auslesen, dieses Tag ist vorhanden, Irfanview zeigt es mir an.

Dieses Tag wird von CExif aber nicht gefunden. Wenn ich alle damit gelesenen Tags ansehe, auch die in CExif nicht definierten (bei switch/case einfach mal ein default eingebaut), ist das gewünschte nicht dabei.
Anscheinend sind neuere Tags in einem neuen "Rucksack" versteckt, an den CExif von 2003 nicht herankommt. Hat sich zufällig schon jemand mit dieser Problematik befasst und eine Lösung gefunden, oder muss ich mich durch die unendlichen Tiefen der neueren Exif-Spec wühlen, um an diese Zusatzdaten heranzukommen?

Erwin
 
Der LensType steht, wie auch andere Infos, innerhalb der MakerNotes (so, wie IrfanView das ja auch anzeigt). Anstatt den Aufwand zu trieben, diese von Hand zu zerlegen, könntest Du auch versuchen, Dich mit exiv2 anzufreunden:
http://www.exiv2.org/
Als C++-Library sollte sich das in C++-Projekte hoffentlich recht einfach einbinden lassen.

Auf der Seite hast Du dann auch gleich eine Referenz, wie Du den LensType übersetzen mußt, um daraus lesbare Daten zu erzeugen.

Gruß Bernhard
 
Hallo Bernhard,

danke für deine Antwort, das sehe ich mir mal an.
Ich brauche jedenfalls zwingend eine Einbindung in mein Projekt (arbeite noch mit dem alten Borland C++ Builder 5), mal sehen, was man da verbiegen muss.

Eine andere Lösung über einen command line Aufruf kann ich mir zeitlich jedenfalls nicht leisten. Da würde ich ewig warten, bis die Exif-Daten von 1000+ Bildern "im Kasten" sind.

Erwin
 
Ich brauche jedenfalls zwingend eine Einbindung in mein Projekt (arbeite noch mit dem alten Borland C++ Builder 5), mal sehen, was man da verbiegen muss.

Eine andere Lösung über einen command line Aufruf kann ich mir zeitlich jedenfalls nicht leisten. Da würde ich ewig warten, bis die Exif-Daten von 1000+ Bildern "im Kasten" sind.

Das ist doch eh eine DLL?

Ich würde die andere Lösung nicht gleich ausschließen. Ein Batchfile ist schnell gemacht und so langsam ist das nicht. Für eine Brennweitenanalyse von 8000 Bildern hat mein Rechner jedenfalls nicht wirklich lange geackert.
 
Das ist doch eh eine DLL?Für eine Brennweitenanalyse von 8000 Bildern hat mein Rechner jedenfalls nicht wirklich lange geackert.
Was heißt nicht lange?
Wenn ich mein Tool verwende, mit dem ich die RAWs und JPGs nebenher synchronisiere, dann möchte ich die EXIF-Daten von 1000 Bildern in ca. 1 Sek. eingelesen haben! So schnell geht es nämlich mit meiner bisherigen CExif-Klassen-Lösung.

Erwin
 
Die LensSpecification steht jedenfalls in der Tag-Liste von Phil Harvey's exiftool und sie wird auch bei Bedarf von einem File zum anderen mitkopiert.
Da die Hersteller (jedefnalls Canon und Nikon) in den MakerNotes wieder eine Exif IFD Struktur (wie bei den "normalen" EXIFs oder TIFF und damit CR2/NEF) nutzen, kann man die dort halt auch ausleden und mit Glück (wenn man dem Reverse-Engeneering vertraut) sogar wieder schreiben.

Nichts anderes macht exiv2. Entweder Du nutzt dessen Quelltexte oder Du wühlst Dich durch die MakerNote Doku, welche auf der dortigen Seite ja verlinkt ist, und dekodierst die MakerNotes selber. Vermutlich könnte man (u.U. nach dem Ignorieren von ein paar Headerbyte) CExif einfach auf den Inhalt des MakerNote-Tags loslassen und müsste dann (jedenfalls bei Nikon und Canon) die einzelnen Tags innerhalb der MakerNotes erhalten.
 
Ich möchte z.B. die LensSpecification auslesen, dieses Tag ist vorhanden, Irfanview zeigt es mir an.
Kann es sein, dass Du Dich an dieser Stelle irrst? Ich habe hier ein TIFF mit diesem Exif-Tag (in exiftool wie gesagt LensInfo genannt), und IrfanView zeigt es mir nicht an. Hast Du es vielleicht mit der Angabe "Focal length - x - y mm" verwechselt, die bei den MakerNotes steht?

Dieses Tag wird von CExif aber nicht gefunden (...)
Ich hab mir mal grob meine Raws mit exiftool angesehen, und keine der Kameras (Canon S90, 400D, 40D) schreibt dieses Exif-Tag überhaupt. Also wäre meine Vermutung, dass es praktisch nirgendwo vorhanden ist, auch nicht bei anderen Kameras.

Scheint so ein Tag zu sein, um das sich niemand kümmert (vielleicht auch, weil es relativ neu ist - hier ist es jedenfalls noch nicht erwähnt: http://www.exif.org/specifications.html). In dem betroffenen TIFF scheint Photoshops PhotoMerge das eingetragen zu haben, aber auch wieder nur den Brennweitenbereich, nicht den Blendenbereich, also auch nur halbherzig.

P.S. Und ja, es ist wirklich ein ganz normales Exif-Tag (exiftool: LensInfo, Exif-Spezifikation: LensSpecification). Aber es scheint halt niemand zu benutzen, so dass man wohl doch den Aufwand mit den MakerNotes treiben muss...
 
Zuletzt bearbeitet:
Ich hab mir mal grob meine Raws mit exiftool angesehen, und keine der Kameras (Canon S90, 400D, 40D) schreibt dieses Exif-Tag überhaupt.
In der CR2/JPG meiner 10D/20D und 1D MKIIN zeigt IrfanView (V4.33, also nicht mehr die aktuelle Version) es in der Tat nicht an, in allen Bildern meiner Nikons (D700/D7000/D4) ist dagegen die Maker Note "Lens Type" (Benennung gemäß IrfanView) enthalten. Wobei es noch in "Lens Type" und "Lens" aufgeteilt ist.

Nur weil Canon es besser wie Nikon versteckt und IrfanView es deshalb nicht anzeigt (vieleicht macht es V4.35 ja doch, ich finde nur gerade das ZIP-File zum Download nicht, die Setup-EXE können sie behalten) bedeutet es ja nicht, daß jeder Hersteller die Info nicht schreibt.

Canon:
http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Canon.html
Tag #22 LensType in den "Canon CameraSettings Tags" (Tag 0x001 der MakerNotes)

Nikon:
http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
Tag 0x0083 der MakerNotes

Diese liest exiv2 auch aus (nur die relevanten Tags):

Code:
Exif.Image.Make                          Ascii       6  Canon
Exif.Image.Model                         Ascii      23  Canon EOS-1D Mark II N
Exif.CanonCs.LensType                    Short       1  (0)
Exif.CanonCs.Lens                        Short       3  70.0 - 200.0 mm
Exif.CanonCs.MaxAperture                 Short       1  F2.8
Exif.CanonCs.MinAperture                 Short       1  F32

Exif.Image.Make                          Ascii      18  NIKON CORPORATION
Exif.Image.Model                         Ascii      11  NIKON D700
Exif.Nikon3.LensType                     Byte        1  D G VR
Exif.Nikon3.Lens                         Rational    4  200mm F2
Exif.NikonLd2.MaxApertureAtMinFocal      Byte        1  F2.0
Exif.NikonLd2.MaxApertureAtMaxFocal      Byte        1  F2.0
Daraus läßt sich dann das Objektiv ermitteln, da "Lens" jeweils schon die Übersetzung des binären Wertes in den String ist.
 
Kann es sein, dass Du Dich an dieser Stelle irrst? Ich habe hier ein TIFF mit diesem Exif-Tag (in exiftool wie gesagt LensInfo genannt), und IrfanView zeigt es mir nicht an. Hast Du es vielleicht mit der Angabe "Focal length - x - y mm" verwechselt, die bei den MakerNotes steht?
Ja ich meinte die Angabe Focal length x-y mm, wenn ich mir die Tagliste bei Phil Harvey's Exiftool ansehe, bringe es mit dem Tag A432h LensInfo in Verbindung (4 rational values giving focal and aperture ranges, called LensSpecification by the EXIF spec.).

Wenn ich mir bei Exiftool die Liste der Canon MakerNotes bezüglich Focal Length ansehe, ist jedenfalls nichts passendes dabei. Deshalb glaube ich, die Angabe x-y ist ein extrahierter Teil dieser LensInfo-Werte.

Exiftool scheint jedenfalls diesen Wert mitzukopieren. Wenn ich mittels Exiftool die Daten eines RAWs auf ein JPG kopiere, wandert die Focal length x-y mit. Den Export aus LR überlebt diese Info allerdings nicht.

Erwin
 
Exif.CanonCs.LensType Short 1 (0)
Exif.CanonCs.Lens Short 3 70.0 - 200.0 mm
Man muss aufpassen, dass man nicht die Maker-Angaben wie LensType und Lens mit der Angabe bei Irfanview verwechselt.

Die Angabe x-y mm kommt garantiert nicht von den oben zitierten Parametern!
Wenn ich mir z.B. ein RAW von meinem uralten Soligor 19-35 ansehe, steht auch Focal length 19-35 (1mm) in der Irfanviewangabe. Damals hat doch noch kein Mensch ein LensType-Value vergeben, so dass es Irfanview heute dekodieren und anzeigen kann.

Erwin
 
Die Angabe x-y mm kommt garantiert nicht von den oben zitierten Parametern!
Die Angabe von exiv2 kommt mit hoher Wahrscheinlichkeit von da, an der Canon war damals ein EF 70-200/2.8L IS.

Da mich Canon aber hier nicht mehr wirklich interessiert und Du auch keinen Hersteller angegeben hast beziehen sich meinen bisherigen Analysen einzig auf Nikon. Dort wird von IrfanView der LensType als binärer Wert dargestellt und das ist das einzige, was ich bisher versucht hätte zu dekodieren. Mit exiv2 oder mittels der oben von mir beschriebenen Methode (vorhin spaßeshalber mal mit dem Dekoder in meiner Bilddatenbank unter VB.NET versucht) klappt das auch bei Nikon-JPGs/NEFs.
 
Ich habe mir jetzt exiv2 mal angesehen. Eine Integration des Source-Codes direkt in mein Projekt tue ich mir nicht an. Da geht viel zu viel Zeit drauf, bis man sich durch alle Sourcen durchgekämpft hat.

Aber es gibt dennoch einen Lichtblick mit exiv2. Man kann mit einem einzigen cmdline-Aufruf die Daten aller Bilder eines Ordners in ein Textfile dumpen und das sogar sehr flott. D.h. eine ewig dauernde Schleife mit je einem cmdline-Aufruf pro Bild ist nicht nötig.

Ich schaue erst nochmals nach, ob von exiv2 die zugehörigen Daten aller meiner Objektive in der Form x-y mm erkannt werden. Falls ja, werde ich den cmdline-Aufruf auf Ordnerebene programmieren und anschließend das Textfile auswerten, d.h. für die einzelnen Bilder die benötigten Exif- und Maker-Daten daraus extrahieren.

Nochmals danke für den Tipp mit exiv2!

Erwin
 
Aber es gibt dennoch einen Lichtblick mit exiv2. Man kann mit einem einzigen cmdline-Aufruf die Daten aller Bilder eines Ordners in ein Textfile dumpen und das sogar sehr flott. D.h. eine ewig dauernde Schleife mit je einem cmdline-Aufruf pro Bild ist nicht nötig.
Das geht übrigens mit exiftool auch. Es ist nur etwas lahm beim allerersten Aufruf, weil es sich seine Perl-Umgebung (?) initialisieren muss.

Ach ja: Und exiftool hat noch den großen Vorteil, dass einige verschiedene Ausgabeformate gibt, auch welche, die sich wieder eindeutig parsen lassen (wichtig für den Aufruf aus einem anderen Programm).
 
WERBUNG
Zurück
Oben Unten