Im Zuge eines Bildprojekts war es erforderlich, die Abmessungen des Bildes, den genauen Aufnahmezeitpunkt und die Geo-Koordinaten zu erfragen.
Um es vorweg zu nehmen: viel ist gelungen, das abschließende Programm liest die verfügbaren Parameter aus der Bilddatei, doch die GPS-Koordinaten sind noch verborgen.
Dennoch zeigt dieses Projekt den Weg, wie man die intimen Daten einer Aufnahme mit einem Programm abfragen und auswerten kann.
EXIF-Daten
Was eine Kamera über ein Bild zu sagen hat, wird in den so genannten EXIF-Daten (Exchangeable Image File Format) gespeichert. Und diese Daten befinden sich im jeweiligen Dateiformat Jpeg oder Raw. (Es werden auch Musik- und Videodateien durch das EXIF-Format beschrieben.)
Das Format hat es in sich. Die Darstellung des Datenformats in einem PDF-Dokument füllt 200 Seiten (siehe Links). Was immer man vorhat, ein vollständiges, systematisches Auslesen aller Werte ist keine Kleinigkeit, und man muss sich praktisch immer auf spezielle Fragestellungen beschränken. Die Schwierigkeit liegt darin, dass viele der Daten weitergehende Bedeutungen haben und diese ebenfalls in die Auswertung aufgenommen werden müssten.
Leider sind aber die EXIF-Daten nur der einigermaßen genormte Teil der Bilddaten, denn viele weitere Daten sind je nach Hersteller und Kamera ganz verschieden zu interpretieren. Um einen EIndruck von der Komplexität dieses Projekts zu geben, hier die Liste aller Datentypen, die in diesem Zusammenhang analysiert werden müssen:
AFCP, AIFF, APE, APP12, ASF, Apple, Audible, BMP BPG, Canon, CanonCustom, CanonRaw, CanonVRD, Casio, Composite, DICOM, DJI, DNG, DPX, DV, DarwinCore, DjVu, EXE, EXIF, Extra, FITS JSON, FLAC, FLIF, FLIR, Flash, FlashPix, Font, FotoStation, FujiFilm, GE, GIF, GIMP, GPS, GeoTiff, GoPro, H264, HP, HTML, ICC_Profile, ID3, IPTC, ISO, ITC, JFIF, JPEG, JVC, Jpeg2000, Kodak Leaf, KyoceraRaw MinoltaRaw, LNK, Lytro, M2TS, MIE, MIFF, MNG, MOI, MPC, MPEG, MPF, MWG, MXF, MacOS, Matroska, Microsoft, Minolta, Motorola, Nikon, NikonCapture, NikonCustom, Nintendo, OOXML, Ogg, Olympus, OpenEXR, Opus Theora, PCX, PDF, PGF, PICT, PLIST, PLUS, PNG, PSP, Palm, Panasonic, PanasonicRaw, Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PostScript, PrintIM, Qualcomm, QuickTime, RIFF, RSRC, RTF, Radiance, Rawzor, Real, Reconyx, Red, Ricoh, Samsung, Sanyo, Scalado, Shortcuts, Sigma, SigmaRaw, Sony, SonyIDC, Stim, Tag Table Index, Torrent, Unknown, VCard, Vorbis, WTV, XMP, ZIP, iWork
Die EXIF-Daten sind nur ein kleiner Teil in diesem Dschungel.
EXIF-Programme
Es gibt eigene Programme sich um diese Daten bemühen, aber das Datum der letzten Updates solcher Programme deutet darauf hin, dass man sie nicht mehr wirklich benötigt, weil moderne Bildbearbeitungsprogramme und auch das Windows-Betriebssystem alle Details zu den Bildern verraten.
EXIF in Windows
Mit Windows ist das Auslesen der EXIF-Daten eine leichte Übung. Ein Rechtsklick auf die Bilddatei öffnet das Kontextmenü, man wählt die Eigenschaften und im Reiter „Details“ findet man die Abschnitte Beschreibung, Ursprung, Bild, Kamera, Erweiterte Fotoeigenschaften, GPS und Datei. Und in den Daten in diesen Abschnitten befindet sich alles Wissenswerte über ein bestimmtes Bild.
Exif-Viewer von Thomas Kolkmann
Ein Programm aus dem Jahr 2012 ist der Exif-Viewer.
https://www.giga.de/downloads/exif-viewer-2/
Bei der Installation muss man einen Ordner wählen. Achtung: Das Programm legt keinen eigenen Ordner an, sondern kopiert alle Dateien in den angegebenen Ordner. Man muss daher diesen Ordner zuerst manuell anlegen und dann bei der Installation explizit angeben. Die Installation dauert ungewöhnlich lang, das Programm selbst läuft aber flott.
ExifTool von Phil Harvey
https://www.sno.phy.queensu.ca/~phil/exiftool/index.html
Es handelt sich um ein mächtiges Kommandozeilen-Programm, das ich nicht weiter erforscht habe, aber die Homepage des Programms bietet eine genaue Übersicht über Exif-Tags, und die waren auch die Grundlage für die eigenen Programmierversuche:
- https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
- https://sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html
- https://sno.phy.queensu.ca/~phil/exiftool/TagNames/index.html
(Achtung, die Großschreibung ist hier wichtig, …/exif.html funktioniert nicht)
Wer Bilddaten eines Bildes benötigt, besuche die Seite von Phil Harvey, lade sich die Datei exiftook(-k).exe (umbenennen in exiftook.exe) und starte sie mit einer Bilddatei als Argument. Hier das Ergebnis:
PS S:\desktop> s:\desktop\exiftool.exe IMG_20190624_092010.jpg
ExifTool Version Number : 11.60 File Name : IMG_20190624_092010.jpg Directory : . File Size : 492 kB File Modification Date/Time : 2019:06:24 22:56:45+02:00 File Access Date/Time : 2019:06:24 22:56:45+02:00 File Creation Date/Time : 2019:06:24 07:20:10+02:00 File Permissions : rw-rw-rw- File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg JFIF Version : 1.01 Exif Byte Order : Big-endian (Motorola, MM) Image Description : hdrpl Make : HUAWEI Camera Model Name : LYA-L29 Orientation : Unknown (0) X Resolution : 72 Y Resolution : 72 Resolution Unit : inches Software : LYA-L29 9.0.0.266(C432E10R1P16) Modify Date : 2019:06:24 09:20:11 Y Cb Cr Positioning : Centered Document Name : Exposure Time : 1/33 F Number : 1.8 Exposure Program : Program AE ISO : 400 Exif Version : 0210 Date/Time Original : 2019:06:24 09:20:11 Create Date : 2019:06:24 09:20:11 Components Configuration : Y, Cb, Cr, - Compressed Bits Per Pixel : 0.95 Shutter Speed Value : 1/999963365 Aperture Value : 1.8 Brightness Value : 0 Exposure Compensation : 0 Max Aperture Value : 1.8 Metering Mode : Multi-segment Light Source : Daylight Flash : No Flash Focal Length : 5.6 mm Warning : [minor] Unrecognized MakerNotes Maker Note Unknown Text : Auto Sub Sec Time : 300409 Sub Sec Time Original : 300409 Sub Sec Time Digitized : 300409 Flashpix Version : 0100 Color Space : sRGB Exif Image Width : 2736 Exif Image Height : 3648 Interoperability Index : R98 - DCF basic file (sRGB) Interoperability Version : 0100 Sensing Method : One-chip color area File Source : Digital Camera Scene Type : Directly photographed Custom Rendered : Custom Exposure Mode : Auto White Balance : Auto Digital Zoom Ratio : 1 Focal Length In 35mm Format : 27 mm Scene Capture Type : Standard Gain Control : None Contrast : Normal Saturation : Normal Sharpness : Normal Subject Distance Range : Unknown GPS Version ID : 2.2.0.0 GPS Latitude Ref : North GPS Longitude Ref : East GPS Altitude Ref : Below Sea Level GPS Time Stamp : 07:20:10 GPS Processing Method : GPS GPS Date Stamp : 2019:06:24 Device Setting Description : (Binary data 4 bytes, use -b option to extract) Compression : JPEG (old-style) Thumbnail Offset : 9010 Thumbnail Length : 29088 Image Width : 2736 Image Height : 3648 Encoding Process : Baseline DCT, Huffman coding Bits Per Sample : 8 Color Components : 3 Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2) Aperture : 1.8 Image Size : 2736x3648 Megapixels : 10.0 Scale Factor To 35 mm Equivalent: 4.8 Shutter Speed : 1/33 Create Date : 2019:06:24 09:20:11.300409 Date/Time Original : 2019:06:24 09:20:11.300409 Modify Date : 2019:06:24 09:20:11.300409 Thumbnail Image : (Binary data 29088 bytes, use -b option to extract) GPS Altitude : 0 m Above Sea Level GPS Date/Time : 2019:06:24 07:20:10Z GPS Latitude : 48 deg 10' 25.74" N GPS Longitude : 16 deg 21' 50.93" E Circle Of Confusion : 0.006 mm Field Of View : 67.4 deg Focal Length : 5.6 mm (35 mm equivalent: 27.0 mm) GPS Position : 48 deg 10' 25.74" N, 16 deg 21' 50.93" E Hyperfocal Distance : 2.79 m Light Value : 4.8
exiftool.exe analysiert die Daten von Zehntausenden Tags und gibt sein Wissen auch über die Kommandozeile bekannt, zum Beispiel mit exiftool.exe -list.
EXIF-Daten per Programm
Im Beitrag „Dateieigenschaften“ wurde beschrieben, dass man über ein COM-Objekt einige Bildeigenschaften abfragen kann aber bei Weitem nicht alle, die eine Kamera in die Bilddatei einträgt.
Gewünscht ist, dass man Bilddaten per Programm auslesen kann, um zum Beispiel ein Bild korrekt skalieren und beschriften zu können. Skalieren ist für die Ausgabe auf Webseiten wichtig, den die Bilder aus der Kamera sind dafür viel zu groß. Für eine Bilddokumentation kann es nützlich sein, den genauen Aufnahmezeitpunkt und die Geo-Koordinaten in die Bildbeschriftung mit aufnehmen zu können.
Für solche Aufgaben eignet sich am besten PowerShell. Sehr bewährt hat sich als Editor Visual Studio Code, denn es ist dort auch ein Debugger enthalten, mit dem man das Programm Zeile für Zeile abarbeiten kann.
Die Eigenschaften für ein Bildobjekt findet man an drei Stellen:
- Eigenschaften einer Datei
- Eigenschaften des Objekts Bitmap
- Eigenschaften der EXIF-Daten
Eigenschaften einer Datei
Eine Datei wird durch die Klasse FileInfo der Assembly System.IO beschrieben. Die Klasse wird durch den new-Operator mit dem Bild D15A0663.JPG in das Objekt $FileInfo abgebildet.
Objekte sind in Powershell durch das Get-Member-Applet einfach zu untersuchen.
$FileInfo | Get-Member GetAccessControl Method System.Security.AccessControl.FileSecurity GetAccessControl(), System.Security.AccessContr... GetHashCode Method int GetHashCode() GetLifetimeService Method System.Object GetLifetimeService() GetObjectData Method void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Ser... GetType Method type GetType() InitializeLifetimeService Method System.Object InitializeLifetimeService() MoveTo Method void MoveTo(string destFileName) Open Method System.IO.FileStream Open(System.IO.FileMode mode), System.IO.FileStream Open(System.IO.Fi... OpenRead Method System.IO.FileStream OpenRead() OpenText Method System.IO.StreamReader OpenText() OpenWrite Method System.IO.FileStream OpenWrite() Refresh Method void Refresh() Replace Method System.IO.FileInfo Replace(string destinationFileName, string destinationBackupFileName), ... SetAccessControl Method void SetAccessControl(System.Security.AccessControl.FileSecurity fileSecurity) ToString Method string ToString() Attributes Property System.IO.FileAttributes Attributes {get;set;} CreationTime Property datetime CreationTime {get;set;} CreationTimeUtc Property datetime CreationTimeUtc {get;set;} Directory Property System.IO.DirectoryInfo Directory {get;} DirectoryName Property string DirectoryName {get;} Exists Property bool Exists {get;} Extension Property string Extension {get;} FullName Property string FullName {get;} IsReadOnly Property bool IsReadOnly {get;set;} LastAccessTime Property datetime LastAccessTime {get;set;} LastAccessTimeUtc Property datetime LastAccessTimeUtc {get;set;} LastWriteTime Property datetime LastWriteTime {get;set;} LastWriteTimeUtc Property datetime LastWriteTimeUtc {get;set;} Length Property long Length {get;} Name Property string Name {get;} BaseName ScriptProperty System.Object BaseName {get=if ($this.Extension.Length -gt 0){$this.Name.Remove($this.Name... VersionInfo ScriptProperty System.Object VersionInfo {get=[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this....
Man erhält alle Eigenschaften (Property) und Methoden (Method). Die Werte der Eigenschaften erhält man mit
$FileInfo | Select-Object -Property * Mode : -a---- VersionInfo : File: s:\desktop\test\D15A0663.JPG InternalName: OriginalFilename: FileVersion: FileDescription: Product: ProductVersion: Debug: False Patched: False PreRelease: False PrivateBuild: False SpecialBuild: False Language: BaseName : D15A0663 Target : {} LinkType : Name : D15A0663.JPG Length : 6035123 DirectoryName : s:\desktop\test Directory : s:\desktop\test IsReadOnly : False Exists : True FullName : s:\desktop\test\D15A0663.JPG Extension : .JPG CreationTime : 25.07.2019 23:05:49 CreationTimeUtc : 25.07.2019 21:05:49 LastAccessTime : 25.07.2019 23:05:49 LastAccessTimeUtc : 25.07.2019 21:05:49 LastWriteTime : 22.07.2019 19:41:54 LastWriteTimeUtc : 22.07.2019 17:41:54 Attributes : Archive
Benötigt man nur eine bestimmte Eigenschaft (Beispiel Länge), schreibt man
$FileInfo | Select-Object -Property Length Length ------ 6035123
Wenn die Länge der Datei als Variable in einem Programm weiterverwendet werden soll:
$Length = $FileInfo.Length $Length 6035123
Eigenschaften des Objekts Bitmap
Für das Dateisystem sind alle Dateien gleich und es weiß daher nur allgemeine administrative Daten über sie. Für Bilder gibt es die spezialisierte Klasse Bitmap.
Man wendet diese Klasse ganz ähnlich an wie beim Dateisystem, nur der Name ist halt verschieden. Die Zeile Add-Type macht die Assembly System.Drawing bekannt, denn anders als die Assembly System.IO des Dateisystems werden die Bilder-Klassen nicht bei Start von Powershell geladen.
Add-type -AssemblyName System.Drawing $Image = [System.Drawing.Bitmap]::new($ImagePath) $Image | Get-Member TypeName: System.Drawing.Bitmap Name MemberType Definition ---- ---------- ---------- Clone Method System.Drawing.Bitmap Clone(System.Drawing.Rectangle rect, System.Drawing.Imaging.PixelFormat ... CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType) Dispose Method void Dispose(), void IDisposable.Dispose() Equals Method bool Equals(System.Object obj) GetBounds Method System.Drawing.RectangleF GetBounds([ref] System.Drawing.GraphicsUnit pageUnit) GetEncoderParameterList Method System.Drawing.Imaging.EncoderParameters GetEncoderParameterList(guid encoder) GetFrameCount Method int GetFrameCount(System.Drawing.Imaging.FrameDimension dimension) GetHashCode Method int GetHashCode() GetHbitmap Method System.IntPtr GetHbitmap(), System.IntPtr GetHbitmap(System.Drawing.Color background) GetHicon Method System.IntPtr GetHicon() GetLifetimeService Method System.Object GetLifetimeService() GetObjectData Method void ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.R... GetPixel Method System.Drawing.Color GetPixel(int x, int y) GetPropertyItem Method System.Drawing.Imaging.PropertyItem GetPropertyItem(int propid) GetThumbnailImage Method System.Drawing.Image GetThumbnailImage(int thumbWidth, int thumbHeight, System.Drawing.Image+G... GetType Method type GetType() InitializeLifetimeService Method System.Object InitializeLifetimeService() LockBits Method System.Drawing.Imaging.BitmapData LockBits(System.Drawing.Rectangle rect, System.Drawing.Imagi... MakeTransparent Method void MakeTransparent(), void MakeTransparent(System.Drawing.Color transparentColor) RemovePropertyItem Method void RemovePropertyItem(int propid) RotateFlip Method void RotateFlip(System.Drawing.RotateFlipType rotateFlipType) Save Method void Save(string filename), void Save(string filename, System.Drawing.Imaging.ImageFormat form... SaveAdd Method void SaveAdd(System.Drawing.Imaging.EncoderParameters encoderParams), void SaveAdd(System.Draw... SelectActiveFrame Method int SelectActiveFrame(System.Drawing.Imaging.FrameDimension dimension, int frameIndex) SetPixel Method void SetPixel(int x, int y, System.Drawing.Color color) SetPropertyItem Method void SetPropertyItem(System.Drawing.Imaging.PropertyItem propitem) SetResolution Method void SetResolution(float xDpi, float yDpi) ToString Method string ToString() UnlockBits Method void UnlockBits(System.Drawing.Imaging.BitmapData bitmapdata) Flags Property int Flags {get;} FrameDimensionsList Property guid[] FrameDimensionsList {get;} Height Property int Height {get;} HorizontalResolution Property float HorizontalResolution {get;} Palette Property System.Drawing.Imaging.ColorPalette Palette {get;set;} PhysicalDimension Property System.Drawing.SizeF PhysicalDimension {get;} PixelFormat Property System.Drawing.Imaging.PixelFormat PixelFormat {get;} PropertyIdList Property int[] PropertyIdList {get;} PropertyItems Property System.Drawing.Imaging.PropertyItem[] PropertyItems {get;} RawFormat Property System.Drawing.Imaging.ImageFormat RawFormat {get;} Size Property System.Drawing.Size Size {get;} Tag Property System.Object Tag {get;set;} VerticalResolution Property float VerticalResolution {get;} Width Property int Width {get;}
Wieder erhält man eine Übersicht über alle Methoden und Eigenschaften und die Werte der Eigenschaften erhalten wir wie vorher:
$Image | Select-Object -Property * Tag : PhysicalDimension : {Width=5472, Height=3648} Size : {Width=5472, Height=3648} Width : 5472 Height : 3648 HorizontalResolution : 72 VerticalResolution : 72 Flags : 77840 RawFormat : [ImageFormat: b96b3cae-0728-11d3-9d7b-0000f81ef32e] PixelFormat : Format24bppRgb Palette : System.Drawing.Imaging.ColorPalette FrameDimensionsList : {7462dc86-6180-4c7e-8e3f-ee7333a7a483} PropertyIdList : {271, 272, 282, 283...} PropertyItems : {271, 272, 282, 283...}
Man erfährt Länge und Breite des Bildes, das ist schon ein Teil der Fragestellung. Um die Bildhöhe allein auszugeben, schreibt man
"Höhe:" + $Image.Height Höhe:3648
Um einen bestimmten Index abzufragen schreibt man:
Die hier dargestellten Daten sind offenbar jene, die man zu Bearbeitung in Windows benötigt. Alle weitergehenden Daten sieht man nicht explizit. Sie befinden sich in der Eigenschaft PropertyItems. PropertyItems ist ein Array von Arrays, die alle über einen Index abrufbar sind. Die Liste dieser Indizes befindet sich in PropertyIdList. Die Werte eines bestimmten Index bestimmt man ganz einfach:
$Image.PropertyIdList[0] 271 $Image.PropertyItems[0] Id Len Type Value -- --- ---- ----- 271 6 2 {67, 97, 110, 111...}
Die Id ist eine Wiederholung der Id aus PopertyIdList, Len ist die Anzahl der Stellen im Feld Value, Type ist der Datentyp in Value und Value ist ein Byte-Array (byte[]).
Die erste Frage ist die Bedeutung des Type-Feldes. Wenn man meint, dass in der zugehörigen Microsoft-Dokumentation diese Typen aufgezählt und erklärt sind, dann ist man auf dem Holzweg. Man behilft sich mit Fundstellen im Internet.
Type | Description |
1 | A Byte object |
2 | An array of Byte object encoded as ASCII |
3 | A 16-bit integer |
4 | A 32-bit integer |
5 | An array of two Byte objects that represent a rational number |
6 | Not used |
7 | Undefined |
8 | Not used |
9 | Slong |
10 | Srational |
Wie gut die Werte in dieser Tabelle ermittelt wurden, kann man daran ablesen, dass die jetzt ins Spiel kommenden EXIF-Ids und deren Bedeutung ebenfalls einen Typ enthalten. Aber diese beiden Typen stimmen leider nicht immer überein.
Das Auslesen der Bilddimensionen wäre also mit diesem Programm bereits erledigt, doch wollte man auch etwas über das Aufnahmedatum und die Geo-Koordinaten wissen, doch davon zeigen die Eigenschaften nichts, wenigstens nicht explizit. Es gibt einfache Eigenschaften wie Width und Height aber auch zusammengesetzte Eigenschaften wie Size, PropertyIdList und PropertyItems. Und genau in den beiden letzteren verbergen sich die gewünschten Angaben. Es wieder so ähnlich wie bei den Dateieigenschaften, dass es davon eine nicht klar definierte Anzahl gibt. Aber im Falle der EXIF-Daten gibt es sehr aufschlussreiche Verzeichnisse, die eine möglichst lückenlose Landkarte dieser Eigenschaften beschreiben.
Die PropertyIdList enthält alle in diesem Bild definierten EXIF-Ids. Das sind ganze Zahlen im Bereich 0…65635. Von den 65536 Positionen sind 475 definiert und für jede definierte Position ist auch deren Bedeutung bekannt. Es gibt bei einigen Ids noch viele weitergehende Informationen, die dann vom Hersteller und oft auch vom Kameratyp abhängen. In der oben gezeigten Ausgabe sieht man, dass die Ids 271, 272, 282, 283… definiert sind und dass danach noch viele weitere folgen.
Wie kann man also alle diese Kameradaten aus dem Objekt herausholen und – vor allem – was bedeuten diese Zahlen?
Welche Ids sind definiert?
$Image.PropertyIdList | ForEach-Object { Write-Host "$id " -NoNewline }
Diese Zeile gibt alle Ids der Eigenschaft PropertyIdList des Bildobjekts $Image aus.
271 272 282 283 296 305 306 315 531 33432 33434 33437 34850 34855 34864 34866 36864 36867 36868 37121 37377 37378 37380 37383 37385 37386 37500 37510 37520 37521 37522 40960 40961 40962 40963 20545 20546 4097 4098 41486 41487 41488 41985 41986 41987 41990 42016 42032 42033 42034 42036 42037 0 1 2 3 4 5 20507 20515 20525 20526 20528 513 514 20625 20624
Unser Bild verfügt über 67 EXIF-Einträge. Die Ids sind nicht geordnet, und das ist etwas unübersichtlich. Mit Beteiligung des Sort-Object wird die Ausgabe übersichtlicher:
$Image.PropertyIdList | Sort-Object | ForEach-Object { Write-Host "$_ " -NoNewLine} 0 1 2 3 4 5 271 272 282 283 296 305 306 315 513 514 531 4097 4098 20507 20515 20525 20526 20528 20545 20546 20624 20625 33432 33434 33437 34850 34855 34864 34866 36864 36867 36868 37121 37377 37378 37380 37383 37385 37386 37500 37510 37520 37521 37522 40960 40961 40962 40963 41486 41487 41488 41985 41986 41987 41990 42016 42032 42033 42034 42036 42037
Jede dieser Zahlen ist ein Index aus den EXIF-Daten.
Jetzt lassen wir und die zur PropIdList gehörigen Werte ausgeben – aber gleich sortiert. Hier muss man beachten, dass es sich um ein Array handelt, und man muss dem Sort-Object mitteilen, nach welcher Spalte sortiert werden soll.
$Image.PropertyItems | Sort-Object -Property Id Id Len Type Value -- --- ---- ----- 0 4 1 {2, 2, 0, 0} 1 2 2 {78, 0} 2 24 5 {48, 0, 0, 0...} 3 2 2 {69, 0} 4 24 5 {16, 0, 0, 0...} 5 1 1 {0} 271 6 2 {67, 97, 110, 111...} 272 21 2 {67, 97, 110, 111...} 282 8 5 {72, 0, 0, 0...} 283 8 5 {72, 0, 0, 0...} 296 2 3 {2, 0} 305 7 2 {80, 105, 99, 97...} 306 20 2 {50, 48, 49, 57...} 315 7 2 {80, 105, 99, 97...} 513 4 4 {142, 40, 0, 0} 514 4 4 {191, 21, 0, 0} 531 2 3 {2, 0} 4097 4 4 {96, 21, 0, 0} 4098 4 4 {64, 14, 0, 0} 20507 5567 1 {255, 216, 255, 224...} 20515 2 3 {6, 0} 20525 8 5 {72, 0, 0, 0...} 20526 8 5 {72, 0, 0, 0...} 20528 2 3 {2, 0} 20545 4 2 {82, 57, 56, 0} 20546 4 7 {48, 49, 48, 48} 20624 128 3 {1, 0, 1, 0...} 20625 128 3 {1, 0, 1, 0...} 33432 1 2 {0} 33434 8 5 {1, 0, 0, 0...} 33437 8 5 {56, 0, 0, 0...} 34850 2 3 {2, 0} 34855 2 3 {160, 0} 34864 2 3 {2, 0} 34866 4 4 {160, 0, 0, 0} 36864 4 7 {48, 50, 51, 48} 36867 20 2 {50, 48, 49, 57...} 36868 20 2 {50, 48, 49, 57...} 37121 4 7 {1, 2, 3, 0} 37377 8 10 {0, 160, 7, 0...} 37378 8 5 {0, 0, 5, 0...} 37380 8 10 {0, 0, 0, 0...} 37383 2 3 {5, 0} 37385 2 3 {16, 0} 37386 8 5 {124, 0, 0, 0...} 42032 1 2 {0} 42033 13 2 {48, 54, 51, 48...} 42034 32 5 {16, 0, 0, 0...} 42036 44 2 {84, 65, 77, 82...} 42037 11 2 {48, 48, 48, 48...}
Was bedeuten diese Indexzahlen und wie geht man mit deren Werten, die ja offenbar – je nach Typ – immer etwas anderes bedeuten?
Verzeichnis der EXIF-Indizes
Phil Harvey lüftet in seinem EXIF-Tool auf der Seite der EXIF-Tags die Bedeutung der Ids und wir nutzen seine Erkenntnisse, um den nichtssagenden Zahlen die richtige Bedeutung zu geben.
Aus der Liste aus Phils Webseite wurde die Tabelle in ein Excel-Sheet kopiert, die Erklärungsspalte gelöscht, ebenso alle Zeilen, die nicht mit einer Id beginnen und danach als Datei exif.csv gespeichert. Die erste Spalte der .csv-Datei ist die Id im Hex-Format und die zweite Spalte ist die Erklärung dazu. Man erhält eine Datei mit 475 Zeilen. Diese Excel-Tabelle befindet sich im ZIP-Archiv zu diesem Beitrag.
Aus dieser Tabelle wurde eine CSV-Tabelle gebildet. Die ersten Zeilen sind:
0x0001;InteropIndex;string!;InteropIFD;; 0x0002;InteropVersion;undef!:;InteropIFD;; 0x000b;ProcessingSoftware;string;IFD0;; 0x00fe;SubfileType;int32u!;IFD0;; 0x00ff;OldSubfileType;int16u!;IFD0;; 0x0100;ImageWidth;int32u!;IFD0;; 0x0101;ImageHeight;int32u!;IFD0;; 0x0102;BitsPerSample;int16u[n]!;IFD0;; 0x0103;Compression;int16u!:;IFD0;; 0x0106;PhotometricInterpretation;int16u!;IFD0;; 0x0107;Thresholding;int16u!;IFD0;; 0x0108;CellWidth;int16u!;IFD0;; 0x0109;CellLength;int16u!;IFD0;; 0x010a;FillOrder;int16u!;IFD0;; 0x010d;DocumentName;string;IFD0;; 0x010e;ImageDescription;string;IFD0;; 0x010f;Make;string;IFD0;; 0x0110;Model;string;IFD0;; 0x0111;StripOffsets ;no;-;; 0x0112;Orientation;int16u;IFD0;; 0x0115;SamplesPerPixel;int16u!;IFD0;; 0x0116;RowsPerStrip;int32u!;IFD0;; 0x0117;StripByteCounts ;no;-;; 0x0118;MinSampleValue;int16u;IFD0;; 0x0119;MaxSampleValue;int16u;IFD0;; 0x011a;XResolution;rational64u:;IFD0;; 0x011b;YResolution;rational64u:;IFD0;; 0x011c;PlanarConfiguration;int16u!;IFD0;; 0x011d;PageName;string;IFD0;; 0x011e;XPosition;rational64u;IFD0;; 0x011f;YPosition;rational64u;IFD0;; 0x0120;FreeOffsets;no;-;; 0x0121;FreeByteCounts;no;-;; 0x0122;GrayResponseUnit;int16u;IFD0;; 0x0123;GrayResponseCurve;no;-;; 0x0124;T4Options;no;-;; 0x0125;T6Options;no;-;; 0x0128;ResolutionUnit;int16u:;IFD0;; 0x0129;PageNumber;int16u[2];IFD0;; 0x012c;ColorResponseUnit;no;-;; 0x012d;TransferFunction;int16u[768]!;IFD0;; 0x0131;Software;string;IFD0;; 0x0132;ModifyDate;string;IFD0;; 0x013b;Artist;string;IFD0;; 0x013c;HostComputer;string;IFD0;; 0x013d;Predictor;int16u!;IFD0;; 0x013e;WhitePoint;rational64u[2];IFD0;; 0x013f;PrimaryChromaticities;rational64u[6];IFD0;; 0x0140;ColorMap;no;-;; 0x0141;HalftoneHints;int16u[2];IFD0;; 0x0142;TileWidth;int32u!;IFD0;; 0x0143;TileLength;int32u!;IFD0;; 0x0144;TileOffsets;no;-;; 0x0145;TileByteCounts;no;-;; 0x0146;BadFaxLines;no;-;; 0x0147;CleanFaxData;no;-;; 0x0148;ConsecutiveBadFaxLines;no;-;; 0x014a;SubIFD ;-;-;; 0x014c;InkSet;int16u;IFD0;; 0x014d;InkNames;no;-;; 0x014e;NumberofInks;no;-;; 0x0150;DotRange;no;-;; 0x0151;TargetPrinter;string;IFD0;; 0x0152;ExtraSamples;no;-;; 0x0153;SampleFormat;no;SubIFD;; 0x0154;SMinSampleValue;no;-;; 0x0155;SMaxSampleValue;no;-;; 0x0156;TransferRange;no;-;; 0x0157;ClipPath;no;-;; 0x0158;XClipPathUnits;no;-;; 0x0159;YClipPathUnits;no;-;; 0x015a;Indexed;no;-;; 0x015b;JPEGTables;no;-;; 0x015f;OPIProxy;no;-;; 0x0190;GlobalParametersIFD;-;-;; 0x0191;ProfileType;no;-;; 0x0192;FaxProfile;no;-;; 0x0193;CodingMethods;no;-;; 0x0194;VersionYear;no;-;; 0x0195;ModeNumber;no;-;; 0x01b1;Decode;no;-;; 0x01b2;DefaultImageColor;no;-;; 0x01b3;T82Options;no;-;; 0x01b5;JPEGTables;no;-;; 0x0200;JPEGProc;no;-;; 0x0201;ThumbnailOffset ;int32u*;IFD1;; 0x0202;ThumbnailLength ;int32u*;IFD1;; 0x0203;JPEGRestartInterval;no;-;; 0x0205;JPEGLosslessPredictors;no;-;; 0x0206;JPEGPointTransforms;no;-;; 0x0207;JPEGQTables;no;-;; 0x0208;JPEGDCTables;no;-;; 0x0209;JPEGACTables;no;-;; 0x0211;YCbCrCoefficients;rational64u[3]!;IFD0;; 0x0212;YCbCrSubSampling;int16u[2]!;IFD0; ;'2 2' = YCbCr4:2:0 (2 2) 0x0213;YCbCrPositioning;int16u!:;IFD0;; 0x0214;ReferenceBlackWhite;rational64u[6];IFD0;; 0x022f;StripRowCounts;no;-;; 0x02bc;ApplicationNotes;int8u!;IFD0;; 0x0320;Image Title;;;; 0x03e7;USPTOMiscellaneous;no;-;; 0x1000;RelatedImageFileFormat;string!;InteropIFD;; 0x1001;RelatedImageWidth;int16u!;InteropIFD;; 0x1002;RelatedImageHeight;int16u!;InteropIFD;; 0x4746;Rating;int16u/;IFD0;; 0x4747;XP_DIP_XML;no;-;; 0x4748;StitchInfo;-;-;; 0x4749;RatingPercent;int16u/;IFD0;; 0x5090;Luminance Table;;;; 0x5091;Chrominance Table;;;; 0x7000;SonyRawFileType;no;-;; 0x7010;SonyToneCurve;no;-;; 0x7031;VignettingCorrection;int16s!;SubIFD;; 0x7032;VignettingCorrParams;int16s[17]!;SubIFD;; 0x7034;ChromaticAberrationCorrection;int16s!;SubIFD;; 0x7035;ChromaticAberrationCorrParams;int16s[33]!;SubIFD;; 0x7036;DistortionCorrection;int16s!;SubIFD;; 0x7037;DistortionCorrParams;int16s[17]!;SubIFD;; 0x74c7;SonyCropTopLeft;int32u[2]!;SubIFD;; 0x74c8;SonyCropSize;int32u[2]!;SubIFD;; 0x800d;ImageID;no;-;; 0x80a3;WangTag1;no;-;; 0x80a4;WangAnnotation;no;-;; 0x80a5;WangTag3;no;-;; 0x80a6;WangTag4;no;-;; 0x80b9;ImageReferencePoints;no;-;; 0x80ba;RegionXformTackPoint;no;-;; 0x80bb;WarpQuadrilateral;no;-;; 0x80bc;AffineTransformMat;no;-;; 0x80e3;Matteing;no;-;; 0x80e4;DataType;no;-;; 0x80e5;ImageDepth;no;-;; 0x80e6;TileDepth;no;-;; 0x8214;ImageFullWidth;no;-;; 0x8215;ImageFullHeight;no;-;; 0x8216;TextureFormat;no;-;; 0x8217;WrapModes;no;-;; 0x8218;FovCot;no;-;; 0x8219;MatrixWorldToScreen;no;-;; 0x821a;MatrixWorldToCamera;no;-;; 0x827d;Model2;no;-;; 0x828d;CFARepeatPatternDim;int16u[2]!;SubIFD;; 0x828e;CFAPattern2;int8u[n]!;SubIFD;; 0x828f;BatteryLevel;no;-;; 0x8290;KodakIFD;-;-;; 0x8298;Copyright;string;IFD0;; 0x829a;ExposureTime;rational64u;ExifIFD;; 0x829d;FNumber;rational64u;ExifIFD;; 0x82a5;MDFileTag;no;-;; 0x82a6;MDScalePixel;no;-;; 0x82a7;MDColorTable;no;-;; 0x82a8;MDLabName;no;-;; 0x82a9;MDSampleInfo;no;-;; 0x82aa;MDPrepDate;no;-;; 0x82ab;MDPrepTime;no;-;; 0x82ac;MDFileUnits;no;-;; 0x830e;PixelScale;double[3];IFD0;; 0x8335;AdventScale;no;-;; 0x8336;AdventRevision;no;-;; 0x835c;UIC1Tag;no;-;; 0x835d;UIC2Tag;no;-;; 0x835e;UIC3Tag;no;-;; 0x835f;UIC4Tag;no;-;; 0x83bb;IPTC-NAA;int32u!;IFD0;; 0x847e;IntergraphPacketData;no;-;; 0x847f;IntergraphFlagRegisters;no;-;; 0x8480;IntergraphMatrix;double[n];IFD0;; 0x8481;INGRReserved;no;-;; 0x8482;ModelTiePoint;double[n];IFD0;; 0x84e0;Site;no;-;; 0x84e1;ColorSequence;no;-;; 0x84e2;IT8Header;no;-;; 0x84e3;RasterPadding;no;-;; 0x84e4;BitsPerRunLength;no;-;; 0x84e5;BitsPerExtendedRunLength;no;-;; 0x84e6;ColorTable;no;-;; 0x84e7;ImageColorIndicator;no;-;; 0x84e8;BackgroundColorIndicator;no;-;; 0x84e9;ImageColorValue;no;-;; 0x84ea;BackgroundColorValue;no;-;; 0x84eb;PixelIntensityRange;no;-;; 0x84ec;TransparencyIndicator;no;-;; 0x84ed;ColorCharacterization;no;-;; 0x84ee;HCUsage;no;-;; 0x84ef;TrapIndicator;no;-;; 0x84f0;CMYKEquivalent;no;-;; 0x8546;SEMInfo;string;IFD0;; 0x8568;AFCP_IPTC;-;-;; 0x85b8;PixelMagicJBIGOptions;no;-;; 0x85d7;JPLCartoIFD;no;-;; 0x85d8;ModelTransform;double[16];IFD0;; 0x8602;WB_GRGBLevels;no;-;; 0x8606;LeafData;-;-;; 0x8649;PhotoshopSettings;-;IFD0;; 0x8769;ExifOffset;-;IFD0;; 0x8773;ICC_Profile;-;IFD0;; 0x877f;TIFF_FXExtensions;no;-;; 0x8780;MultiProfiles;no;-;; 0x8781;SharedData;no;-;; 0x8782;T88Options;no;-;; 0x87ac;ImageLayer;no;-;; 0x87af;GeoTiffDirectory;undef;IFD0;; 0x87b0;GeoTiffDoubleParams;undef;IFD0;; 0x87b1;GeoTiffAsciiParams;string;IFD0;; 0x87be;JBIGOptions;no;-;; 0x8822;ExposureProgram;int16u;ExifIFD;; 0x8824;SpectralSensitivity;string;ExifIFD;; 0x8825;GPSInfo;-;IFD0;; 0x8827;ISO;int16u[n];ExifIFD;; 0x8828;Opto-ElectricConvFactor;no;-;; 0x8829;Interlace;no;-;; 0x882a;TimeZoneOffset;int16s[n];ExifIFD;; 0x882b;SelfTimerMode;int16u;ExifIFD;; 0x8830;SensitivityType;int16u;ExifIFD;; 0x8831;StandardOutputSensitivity;int32u;ExifIFD;; 0x8832;RecommendedExposureIndex;int32u;ExifIFD;; 0x8833;ISOSpeed;int32u;ExifIFD;; 0x8834;ISOSpeedLatitudeyyy;int32u;ExifIFD;; 0x8835;ISOSpeedLatitudezzz;int32u;ExifIFD;; 0x885c;FaxRecvParams;no;-;; 0x885d;FaxSubAddress;no;-;; 0x885e;FaxRecvTime;no;-;; 0x8871;FedexEDR;no;-;; 0x888a;LeafSubIFD;-;-;; 0x9000;ExifVersion;undef:;ExifIFD;; 0x9003;DateTimeOriginal;string;ExifIFD;; 0x9004;CreateDate;string;ExifIFD;; 0x9009;GooglePlusUploadCode;undef[n];ExifIFD;; 0x9010;OffsetTime;string;ExifIFD;; 0x9011;OffsetTimeOriginal;string;ExifIFD;; 0x9012;OffsetTimeDigitized;string;ExifIFD;; 0x9101;ComponentsConfiguration;undef[4]!:;ExifIFD; ;4 = R 0x9102;CompressedBitsPerPixel;rational64u!;ExifIFD;; 0x9201;ShutterSpeedValue;rational64s;ExifIFD;; 0x9202;ApertureValue;rational64u;ExifIFD;; 0x9203;BrightnessValue;rational64s;ExifIFD;; 0x9204;ExposureCompensation;rational64s;ExifIFD;; 0x9205;MaxApertureValue;rational64u;ExifIFD;; 0x9206;SubjectDistance;rational64u;ExifIFD;; 0x9207;MeteringMode;int16u;ExifIFD;; 0x9208;LightSource;int16u;ExifIFD;; 0x9209;Flash;int16u;ExifIFD;; 0x920a;FocalLength;rational64u;ExifIFD;; 0x920b;FlashEnergy;no;-;; 0x920c;SpatialFrequencyResponse;no;-;; 0x920d;Noise;no;-;; 0x920e;FocalPlaneXResolution;no;-;; 0x920f;FocalPlaneYResolution;no;-;; 0x9210;FocalPlaneResolutionUnit;no;-;; 0x9211;ImageNumber;int32u;ExifIFD;; 0x9212;SecurityClassification;string;ExifIFD;; 0x9213;ImageHistory;string;ExifIFD;; 0x9214;SubjectArea;int16u[n];ExifIFD;; 0x9215;ExposureIndex;no;-;; 0x9216;TIFF-EPStandardID;no;-;; 0x9217;SensingMethod;no;-;; 0x923a;CIP3DataFile;no;-;; 0x923b;CIP3Sheet;no;-;; 0x923c;CIP3Side;no;-;; 0x923f;StoNits;no;-;; 0x927c;MakerNoteApple ;undef;ExifIFD;; 0x9286;UserComment;undef;ExifIFD;; 0x9290;SubSecTime;string;ExifIFD;; 0x9291;SubSecTimeOriginal;string;ExifIFD;; 0x9292;SubSecTimeDigitized;string;ExifIFD;; 0x932f;MSDocumentText;no;-;; 0x9330;MSPropertySetStorage;no;-;; 0x9331;MSDocumentTextPosition;no;-;; 0x935c;ImageSourceData;undef!;IFD0;; 0x9400;AmbientTemperature;rational64s;ExifIFD;; 0x9401;Humidity;rational64u;ExifIFD;; 0x9402;Pressure;rational64u;ExifIFD;; 0x9403;WaterDepth;rational64s;ExifIFD;; 0x9404;Acceleration;rational64u;ExifIFD;; 0x9405;CameraElevationAngle;rational64s;ExifIFD;; 0x9c9b;XPTitle;int8u;IFD0;; 0x9c9c;XPComment;int8u;IFD0;; 0x9c9d;XPAuthor;int8u;IFD0;; 0x9c9e;XPKeywords;int8u;IFD0;; 0x9c9f;XPSubject;int8u;IFD0;; 0xa000;FlashpixVersion;undef:;ExifIFD;; 0xa001;ColorSpace;int16u:;ExifIFD;; 0xa002;ExifImageWidth;int16u:;ExifIFD;; 0xa003;ExifImageHeight;int16u:;ExifIFD;; 0xa004;RelatedSoundFile;string;ExifIFD;; 0xa005;InteropOffset;-;-;; 0xa010;SamsungRawPointersOffset;no;-;; 0xa011;SamsungRawPointersLength;no;-;; 0xa101;SamsungRawByteOrder;no;-;; 0xa102;SamsungRawUnknown?;no;-;; 0xa20b;FlashEnergy;rational64u;ExifIFD;; 0xa20c;SpatialFrequencyResponse;no;-;; 0xa20d;Noise;no;-;; 0xa20e;FocalPlaneXResolution;rational64u;ExifIFD;; 0xa20f;FocalPlaneYResolution;rational64u;ExifIFD;; 0xa210;FocalPlaneResolutionUnit;int16u;ExifIFD;; 0xa211;ImageNumber;no;-;; 0xa212;SecurityClassification;no;-;; 0xa213;ImageHistory;no;-;; 0xa214;SubjectLocation;int16u[2];ExifIFD;; 0xa215;ExposureIndex;rational64u;ExifIFD;; 0xa216;TIFF-EPStandardID;no;-;; 0xa217;SensingMethod;int16u;ExifIFD;; 0xa300;FileSource;undef;ExifIFD;; 0xa301;SceneType;undef;ExifIFD;; 0xa302;CFAPattern;undef;ExifIFD;; 0xa401;CustomRendered;int16u;ExifIFD;; 0xa402;ExposureMode;int16u;ExifIFD;; 0xa403;WhiteBalance;int16u;ExifIFD;; 0xa404;DigitalZoomRatio;rational64u;ExifIFD;; 0xa405;FocalLengthIn35mmFormat;int16u;ExifIFD;; 0xa406;SceneCaptureType;int16u;ExifIFD;; 0xa407;GainControl;int16u;ExifIFD;; 0xa408;Contrast;int16u;ExifIFD;; 0xa409;Saturation;int16u;ExifIFD;; 0xa40a;Sharpness;int16u;ExifIFD;; 0xa40b;DeviceSettingDescription;no;-;; 0xa40c;SubjectDistanceRange;int16u;ExifIFD;; 0xa420;ImageUniqueID;string;ExifIFD;; 0xa430;OwnerName;string;ExifIFD;; 0xa431;SerialNumber;string;ExifIFD;; 0xa432;LensInfo;rational64u[4];ExifIFD;; 0xa433;LensMake;string;ExifIFD;; 0xa434;LensModel;string;ExifIFD;; 0xa435;LensSerialNumber;string;ExifIFD;; 0xa460;CompositeImage;int16u;ExifIFD;; 0xa461;CompositeImageCount;int16u[2];ExifIFD;; 0xa462;CompositeImageExposureTimes;undef;ExifIFD;; 0xa480;GDALMetadata;string;IFD0;; 0xa481;GDALNoData;string;IFD0;; 0xa500;Gamma;rational64u;ExifIFD;; 0xafc0;ExpandSoftware;no;-;; 0xafc1;ExpandLens;no;-;; 0xafc2;ExpandFilm;no;-;; 0xafc3;ExpandFilterLens;no;-;; 0xafc4;ExpandScanner;no;-;; 0xafc5;ExpandFlashLamp;no;-;; 0xbc01;PixelFormat;no;-;; 0xbc02;Transformation;no;-;; 0xbc03;Uncompressed;no;-;; 0xbc04;ImageType;no;-;; 0xbc80;ImageWidth;no;-;; 0xbc81;ImageHeight;no;-;; 0xbc82;WidthResolution;no;-;; 0xbc83;HeightResolution;no;-;; 0xbcc0;ImageOffset;no;-;; 0xbcc1;ImageByteCount;no;-;; 0xbcc2;AlphaOffset;no;-;; 0xbcc3;AlphaByteCount;no;-;; 0xbcc4;ImageDataDiscard;no;-;; 0xbcc5;AlphaDataDiscard;no;-;; 0xc427;OceScanjobDesc;no;-;; 0xc428;OceApplicationSelector;no;-;; 0xc429;OceIDNumber;no;-;; 0xc42a;OceImageLogic;no;-;; 0xc44f;Annotations;no;-;; 0xc4a5;PrintIM;undef;IFD0;; 0xc573;OriginalFileName;no;-;; 0xc580;USPTOOriginalContentType;no;-;; 0xc5e0;CR2CFAPattern;no;-;; 0xc612;DNGVersion;int8u[4]!;IFD0;; 0xc613;DNGBackwardVersion;int8u[4]!;IFD0;; 0xc614;UniqueCameraModel;string;IFD0;; 0xc615;LocalizedCameraModel;string;IFD0;; 0xc616;CFAPlaneColor;no;SubIFD;; 0xc617;CFALayout;no;SubIFD;; 0xc618;LinearizationTable;int16u[n]!;SubIFD;; 0xc619;BlackLevelRepeatDim;int16u[2]!;SubIFD;; 0xc61a;BlackLevel;rational64u[n]!;SubIFD;; 0xc61b;BlackLevelDeltaH;rational64s[n]!;SubIFD;; 0xc61c;BlackLevelDeltaV;rational64s[n]!;SubIFD;; 0xc61d;WhiteLevel;int32u[n]!;SubIFD;; 0xc61e;DefaultScale;rational64u[2]!;SubIFD;; 0xc61f;DefaultCropOrigin;int32u[2]!;SubIFD;; 0xc620;DefaultCropSize;int32u[2]!;SubIFD;; 0xc621;ColorMatrix1;rational64s[n]!;IFD0;; 0xc622;ColorMatrix2;rational64s[n]!;IFD0;; 0xc623;CameraCalibration1;rational64s[n]!;IFD0;; 0xc624;CameraCalibration2;rational64s[n]!;IFD0;; 0xc625;ReductionMatrix1;rational64s[n]!;IFD0;; 0xc626;ReductionMatrix2;rational64s[n]!;IFD0;; 0xc627;AnalogBalance;rational64u[n]!;IFD0;; 0xc628;AsShotNeutral;rational64u[n]!;IFD0;; 0xc629;AsShotWhiteXY;rational64u[2]!;IFD0;; 0xc62a;BaselineExposure;rational64s!;IFD0;; 0xc62b;BaselineNoise;rational64u!;IFD0;; 0xc62c;BaselineSharpness;rational64u!;IFD0;; 0xc62d;BayerGreenSplit;int32u!;SubIFD;; 0xc62e;LinearResponseLimit;rational64u!;IFD0;; 0xc62f;CameraSerialNumber;string;IFD0;; 0xc630;DNGLensInfo;rational64u[4];IFD0;; 0xc631;ChromaBlurRadius;rational64u!;SubIFD;; 0xc632;AntiAliasStrength;rational64u!;SubIFD;; 0xc633;ShadowScale;rational64u!;IFD0;; 0xc634;SR2Private ;-;IFD0;; 0xc635;MakerNoteSafety;int16u;IFD0;; 0xc640;RawImageSegmentation;no;-;; 0xc65a;CalibrationIlluminant1;int16u!;IFD0;; 0xc65b;CalibrationIlluminant2;int16u!;IFD0;; 0xc65c;BestQualityScale;rational64u!;SubIFD;; 0xc65d;RawDataUniqueID;int8u[16]!;IFD0;; 0xc660;AliasLayerMetadata;no;-;; 0xc68b;OriginalRawFileName;string!;IFD0;; 0xc68c;OriginalRawFileData;undef!;IFD0;; 0xc68d;ActiveArea;int32u[4]!;SubIFD;; 0xc68e;MaskedAreas;int32u[n]!;SubIFD;; 0xc68f;AsShotICCProfile;undef!;IFD0;; 0xc690;AsShotPreProfileMatrix;rational64s[n]!;IFD0;; 0xc691;CurrentICCProfile;undef!;IFD0;; 0xc692;CurrentPreProfileMatrix;rational64s[n]!;IFD0;; 0xc6bf;ColorimetricReference;int16u!;IFD0;; 0xc6c5;SRawType;no;IFD0;; 0xc6d2;PanasonicTitle;undef;IFD0;; 0xc6d3;PanasonicTitle2;undef;IFD0;; 0xc6f3;CameraCalibrationSig;string!;IFD0;; 0xc6f4;ProfileCalibrationSig;string!;IFD0;; 0xc6f5;ProfileIFD;-;IFD0;; 0xc6f6;AsShotProfileName;string!;IFD0;; 0xc6f7;NoiseReductionApplied;rational64u!;SubIFD;; 0xc6f8;ProfileName;string!;IFD0;; 0xc6f9;ProfileHueSatMapDims;int32u[3]!;IFD0;; 0xc6fa;ProfileHueSatMapData1;float[n]!;IFD0;; 0xc6fb;ProfileHueSatMapData2;float[n]!;IFD0;; 0xc6fc;ProfileToneCurve;float[n]!;IFD0;; 0xc6fd;ProfileEmbedPolicy;int32u!;IFD0;; 0xc6fe;ProfileCopyright;string!;IFD0;; 0xc714;ForwardMatrix1;rational64s[n]!;IFD0;; 0xc715;ForwardMatrix2;rational64s[n]!;IFD0;; 0xc716;PreviewApplicationName;string!;IFD0;; 0xc717;PreviewApplicationVersion;string!;IFD0;; 0xc718;PreviewSettingsName;string!;IFD0;; 0xc719;PreviewSettingsDigest;int8u!;IFD0;; 0xc71a;PreviewColorSpace;int32u!;IFD0;; 0xc71b;PreviewDateTime;string!;IFD0;; 0xc71c;RawImageDigest;int8u[16]!;IFD0;; 0xc71d;OriginalRawFileDigest;int8u[16]!;IFD0;; 0xc71e;SubTileBlockSize;no;-;; 0xc71f;RowInterleaveFactor;no;-;; 0xc725;ProfileLookTableDims;int32u[3]!;IFD0;; 0xc726;ProfileLookTableData;float[n]!;IFD0;; 0xc740;OpcodeList1;undef!;SubIFD;; 0xc741;OpcodeList2;undef!;SubIFD;; 0xc74e;OpcodeList3;undef!;SubIFD;; 0xc761;NoiseProfile;double[n]!;SubIFD;; 0xc763;TimeCodes;int8u[n];IFD0;; 0xc764;FrameRate;rational64s;IFD0;; 0xc772;TStop;rational64u[n];IFD0;; 0xc789;ReelName;string;IFD0;; 0xc791;OriginalDefaultFinalSize;int32u[2]!;IFD0;; 0xc792;OriginalBestQualitySize;int32u[2]!;IFD0;; 0xc793;OriginalDefaultCropSize;rational64u[2]!;IFD0;; 0xc7a1;CameraLabel;string;IFD0;; 0xc7a3;ProfileHueSatMapEncoding;int32u!;IFD0;; 0xc7a4;ProfileLookTableEncoding;int32u!;IFD0;; 0xc7a5;BaselineExposureOffset;rational64s!;IFD0;; 0xc7a6;DefaultBlackRender;int32u!;IFD0;; 0xc7a7;NewRawImageDigest;int8u[16]!;IFD0;; 0xc7a8;RawToPreviewGain;double!;IFD0;; 0xc7aa;CacheVersion;int32u!;SubIFD2;; 0xc7b5;DefaultUserCrop;rational64u[4]!;SubIFD;; 0xc7d5;NikonNEFInfo;-;-;; 0xea1c;Padding;undef!;ExifIFD;; 0xea1d;OffsetSchema;int32s!;ExifIFD;; 0xfde8;OwnerName;string/;ExifIFD;; 0xfde9;SerialNumber;string/;ExifIFD;; 0xfdea;Lens;string/;ExifIFD;; 0xfe00;KDC_IFD;-;-;; 0xfe4c;RawFile;string/;ExifIFD;; 0xfe4d;Converter;string/;ExifIFD;; 0xfe4e;WhiteBalance;string/;ExifIFD;; 0xfe51;Exposure;string/;ExifIFD;; 0xfe52;Shadows;string/;ExifIFD;; 0xfe53;Brightness;string/;ExifIFD;; 0xfe54;Contrast;string/;ExifIFD;; 0xfe55;Saturation;string/;ExifIFD;; 0xfe56;Sharpness;string/;ExifIFD;; 0xfe57;Smoothness;string/;ExifIFD;; 0xfe58;MoireFilter;string/;ExifIFD;;
Beim Vergleich dieser ersten Zeilen mit den Ids, die das Bitmap-Objekt des Testbildes ausgibt, fällt ein Widerspruch auf, denn im Testbild werden die Ids 1,2,3,4,5, definiert, aber in der Liste der EXIF-Tags sind 3,4,5 nicht enthalten. Das Bild-Objekt liefert daher EXIF-Einträge, die in der Dokumentation nicht genannt sind. Umgekehrt gibt es auch sehr viele Exif-Indizes, die in den Eigenschaften des Bild-Objekt keine Entsprechung haben.
Da mein Interesse den Geo-Koordinaten galt, suchte ich nach Hinweisen zu diesen Daten. Das Feld, das auf diese Daten verweist hat den Index 0x8825. Das Problem: dieses Feld ist in den Kamera-Daten nicht definiert und daher bleiben die GPS-Daten verborgen, obwohl sie natürlich in irgendeinem der Felder unerkannt schlummern.
EXIF-Daten in Powershell einlesen
Um diese CSV-Datei in PowerShell bekannt zu machen, kann man sie mit dem Befehl Import-Csv importieren, allerdings nicht ohne Ergänzungen, denn man muss auch noch sagen, wie die Spalten heißen und welches das Trennzeichen ist. Das Kommando dazu lautet:
$exif = Import-Csv -Path s:\desktop\exif.csv -Header 'IDH','Title','Type','Comment' -Delimiter ';'
Man kann nun eine bestimmte EXIF-Eigenschaft oder ein bestimmtes Feld dieser Eigenschaft so abfragen:
PS C:\Users\franz> $exif[1] IDH Title Type Comment --- ----- ---- ------- 0x0002 InteropVersion undef!: InteropIFD PS C:\Users\franz> $exif[13].Title FillOrder
Hex -> Dez
Eine Schwierigkeit ist, dass die EXIF-Eigenschaften im Hex-Format angegeben sind und man zum Ansprechen eine Dezimalzahl verwenden muss. Hier wurde das so gelöst, dass eine zusätzliche Spalte Id importiert wurde und Werte für diese Spalte aus den Werten der Spalte IDH berechnet wurden:
$exif = Import-Csv -Path s:\desktop\exif.csv -Header 'IDH','Title','Type','Comment' -Delimiter ";" | Select *,Id $exif | ForEach { $_.Id = [Convert]::ToInt64($_.IDH,16) } PS C:\Users\franz> $exif[13].IDH 0x010a PS C:\Users\franz> $exif[13].ID 266
Ausgabe der Bytefolgen
Alle eingetragenen Eigenschaften werden in Byte-Folgen übergeben. Diese Bytefolgen können sein: Strings, ganze Zahlen (16, 32 und 64 Bit) mit oder ohne Vorzeichen sowie Verhältnisse, die als zwei 32-Bit-Zahlen in einer 64-Bit-Zahl kodiert werden. Weiters gibt es Spezialformate für Farbpaletten und einfach auch unbekannte Formate.
Um für die wichtigsten EXIF-Vatiablen eine vernünftige Ausgabe zu erhalten, wurden vier Funktionen formuliert: GetString, GetNumber16, GetNumber32, GetRatio64.
Beispiel: GetNumber16
function GetNumber16 { Param ([byte[]]$b) return $b[0] + 256 * $b[1]; }
Am Ende steht ein Programm, das zu einer gegebenen Bilddatei bekannt gibt, was alle diese Daten aus dem Dateisystem, dem Bild-Objekt und den EXIF-Daten im Bild-Objekt hergeben. Die Ausgabe erfolgt – was die EXIF-Daten anlangt – als CSV-Datei. Man kann daher die Ausgabe in ein Excel-Sheet kopieren und verschiedene Bilder oder Kameras miteinander vergleichen.
exif.ps1
#Ermittelt die EXIF-Parameter einer Datei #======================================== Param ([string]$ImagePath = "s:\desktop\test\D15A0663.JPG") #"s:\desktop\test\IMG_20190602_160848.jpg") if (!([System.IO.File]::Exists($ImagePath))) { "Bild existiert nicht"; return } $ImageTypes = ".jpg", ".jpeg", ".png", ".tif", ".bmp" $Extension = [System.IO.Path]::GetExtension($ImagePath).ToLower() if (!($ImageTypes.Contains($Extension))) { "Kein erlaubtes Format"; return } $CRLF = [char]13 + [char]10 function GetRatio64 { Param ([byte[]]$b) $First = $b[0] + 256 * $b[1] + 65536 * $b[2] + 16777216 * $b[3] $Second = $b[4] + 256 * $b[5] + 65536 * $b[6] + 16777216 * $b[7] if ($First -gt 2147483648) { $First = $First - 4294967296 } if ($Second -gt 2147483648) { $Second = $Second - 4294967296 } if ($Second -eq 0) { $Second = 1 } if (($First -eq 1) -and ($Second -ne 1)) { return ("1/" + $Second) } else { return ($First / $Second) } } function GetNumber16 { Param ([byte[]]$b) return $b[0] + 256 * $b[1]; } function GetNumber32 { Param ([byte[]]$b) return $b[0] + 256 * $b[1] + 65536 * $b[2] + 16777216 * $b[3] } function GetString { Param ([byte[]]$b) $s = '' for ($i = 0; $i -lt $b.Length; $i++) { $s += [char]$b[$i] } return $s } $s = "Eigenschaften des Bildes $ImagePath" $s += $CRLF + "".PadLeft($s.Length, '=') + $CRLF + $CRLF $s = $CRLF + $s $s += "Eigenschaften der Datei$CRLF$CRLF" $FileInfo = [System.IO.FileInfo]::new($ImagePath) $s += "Name: " + $FileInfo.Name + $CRLF $s += "Verzeichnisname: " + $FileInfo.DirectoryName + $CRLF $s += "Vollständiger Name: " + $FileInfo.FullName + $CRLF $s += "Erweiterung: " + $FileInfo.Extension + $CRLF $s += "Nur Lesen: " + $FileInfo.IsReadOnly + $CRLF $s += "Länge: " + $FileInfo.Length + $CRLF $s += "Mode: " + $FileInfo.Mode + $CRLF $s += "Attribute: " + $FileInfo.Attributes + $CRLF $s += "CreationTime: " + $FileInfo.CreationTime + $CRLF $s += "LastAccessTime: " + $FileInfo.LastAccessTime + $CRLF $s += "LastWriteTime: " + $FileInfo.LastWriteTime + $CRLF $s += "CreationTimeUtc: " + $FileInfo.CreationTimeUtc + $CRLF $s += "LastAccessTimeUtc: " + $FileInfo.LastAccessTimeUtc + $CRLF $s += "LastWriteTimeUtc: " + $FileInfo.LastWriteTimeUtc + $CRLF $s += $CRLF Add-type -AssemblyName System.Drawing $s += "Eigenschaften des Bitmap-Objekts$CRLF$CRLF" $Image = [System.Drawing.Bitmap]::new($ImagePath) $Items = $Image.PropertyItems | Sort-Object -Property Id $PropertyIdList_sort = $Image.PropertyIdList | Sort-Object $PropertyIdListHex_sort = $PropertyIdList_sort | ForEach-Object { "0x" + [Convert]::ToString($_, 16) } #https://www.c-sharpcorner.com/uploadfile/mahesh/reading-metadata-of-images-in-gdi/ $Types = "", "byte", "byte[]", "int16", "int32", "rational64", "unused", "undef", "unused", "long", "rational" $s += "Tag: " + $Image.Tag + $CRLF $s += "PhysicalDimension: " + $Image.PhysicalDimension + $CRLF $s += "Size: " + $Image.Size + $CRLF $s += "Width: " + $Image.Width + $CRLF $s += "Height: " + $Image.Height + $CRLF $s += "HorizontalResolution: " + $Image.HorizontalResolution + $CRLF $s += "VerticalResolution: " + $Image.VerticalResolution + $CRLF $s += "Flags: " + $Image.Flags + $CRLF $s += "RawFormat: " + $Image.RawFormat + $CRLF $s += "PixelFormat: " + $Image.PixelFormat + $CRLF $s += "Palette: " + $Image.Palette + $CRLF $s += "FrameDimensionsList: " + $Image.FrameDimensionsList + $CRLF $s += "PropertyIdListCount: " + $Image.PropertyIdList.Length + $CRLF $s += "PropertyIdList: " + $PropertyIdList_sort + $CRLF $s += "PropertyIdListHex: " + $PropertyIdListHex_sort + $CRLF $s += "PropertyItems: + $CRLF" $s += "IdHex;Id;Type;TypeText;Length;Bytes;ExifName;ExifType;ExifValue" + $CRLF $s += $CRLF $s += "Eigenschaften der EXIF-Daten$CRLF$CRLF" $ExifTable = Import-Csv -Path s:\desktop\exif\exif.csv -Header 'IDH', 'Title', 'Type', 'Comment' -Delimiter ";" | Select-Object *, Id $ExifTable | ForEach-Object { $_.Id = [Convert]::ToInt64($_.IDH, 16) } $ExifEntries = 0 $ExifEntriesNone = 0 foreach ($Item in $Items) { $s1 = '' $s1 += "0x" + ([String][Convert]::ToString($Item.Id, 16)).PadLeft(4, '0') + ";" + [string]$Item.Id + ";" + [string]$Item.Type + ";" + $Types[$Item.Type] + ";" + [string]$Item.Len + ";" for ($i = 0; $i -lt $Item.Len; $i++) { $s1 += [string]$Item.Value[$i] + " " if ($i -eq 10) { if ($Item.Len -gt 10) { $s1 += "..." break } } } $Id = $Item.Id $ExifItem = $ExifTable | Where-Object { $_.Id -eq $Id } $ExifName = $ExifItem.Title $ExifType = $ExifItem.Type if ($null -eq $ExifItem) { $ExifEntriesNone++ $s1 += ";NOEXIF;;" #switch ($Id) { # 20507 { # $s1 += GetString $Item.Value # } # default { # } #} $s1 += $CRLF } else { $Value = $Item.Value switch -Wildcard ($ExifType) { 'string*' { $s0 = GetString $Value } 'int16*' { $s0 = GetNumber16 $Value } 'int32*' { $s0 = GetNumber32 $Value } 'rational64*' { $s0 = GetRatio64 $Value } default { $s0 = '' } } $s1 += ";$ExifName;$ExifType;$s0$CRLF" } $s += $s1 $ExifEntries++ } $s "EXIF-Einträge: $ExifEntries, None: $ExifEntriesNone"
exif.ps1 – Ausgabe
Die Ausgabe besteht aus drei Teilen:
- Eigenschaften der Datei
- Eigenschaften des Bitmap-Objekts
- Eigenschaften der EXIF-Daten
Eigenschaften des Bildes s:\desktop\test\D15A0663.JPG ===================================================== Eigenschaften der Datei Name: D15A0663.JPG Verzeichnisname: s:\desktop\test Vollständiger Name: s:\desktop\test\D15A0663.JPG Erweiterung: .JPG Nur Lesen: False Länge: 6035123 Mode: -a---- Attribute: Archive CreationTime: 07/25/2019 23:05:49 LastAccessTime: 07/25/2019 23:05:49 LastWriteTime: 07/22/2019 19:41:54 CreationTimeUtc: 07/25/2019 21:05:49 LastAccessTimeUtc: 07/25/2019 21:05:49 LastWriteTimeUtc: 07/22/2019 17:41:54 Eigenschaften des Bitmap-Objekts Tag: PhysicalDimension: {Width=5472, Height=3648} Size: {Width=5472, Height=3648} Width: 5472 Height: 3648 HorizontalResolution: 72 VerticalResolution: 72 Flags: 77840 RawFormat: [ImageFormat: b96b3cae-0728-11d3-9d7b-0000f81ef32e] PixelFormat: Format24bppRgb Palette: System.Drawing.Imaging.ColorPalette FrameDimensionsList: 7462dc86-6180-4c7e-8e3f-ee7333a7a483 PropertyIdListCount: 67 PropertyIdList: 0 1 2 3 4 5 271 272 282 283 296 305 306 315 513 514 531 4097 4098 20507 20515 20525 20526 20528 20545 20546 20624 20625 33432 33434 33437 34850 34855 34864 34866 36864 36867 36868 37121 37377 37378 37380 37383 37385 37386 37500 37510 37520 37521 37522 40960 40961 40962 40963 41486 41487 41488 41985 41986 41987 41990 42016 42032 42033 42034 42036 42037 PropertyIdListHex: 0x0 0x1 0x2 0x3 0x4 0x5 0x10f 0x110 0x11a 0x11b 0x128 0x131 0x132 0x13b 0x201 0x202 0x213 0x1001 0x1002 0x501b 0x5023 0x502d 0x502e 0x5030 0x5041 0x5042 0x5090 0x5091 0x8298 0x829a 0x829d 0x8822 0x8827 0x8830 0x8832 0x9000 0x9003 0x9004 0x9101 0x9201 0x9202 0x9204 0x9207 0x9209 0x920a 0x927c 0x9286 0x9290 0x9291 0x9292 0xa000 0xa001 0xa002 0xa003 0xa20e 0xa20f 0xa210 0xa401 0xa402 0xa403 0xa406 0xa420 0xa430 0xa431 0xa432 0xa434 0xa435
Eigenschaften der EXIF-Daten
PropertyItems: IdHex;Id;Type;TypeText;Length;Bytes;ExifName;ExifType;ExifValue 0x0000;0;1;byte;4;2 2 0 0 ;NOEXIF;; 0x0001;1;2;byte[];2;78 0 ;InteropIndex;string!;N 0x0002;2;5;rational64;24;48 0 0 0 1 0 0 0 11 0 0 ...;InteropVersion;undef!:; 0x0003;3;2;byte[];2;69 0 ;NOEXIF;; 0x0004;4;5;rational64;24;16 0 0 0 1 0 0 0 19 0 0 ...;NOEXIF;; 0x0005;5;1;byte;1;0 ;NOEXIF;; 0x010f;271;2;byte[];6;67 97 110 111 110 0 ;Make;string;Canon 0x0110;272;2;byte[];21;67 97 110 111 110 32 69 79 83 32 55 ...;Model;string;Canon EOS 7D Mark II 0x011a;282;5;rational64;8;72 0 0 0 1 0 0 0 ;XResolution;rational64u:;72 0x011b;283;5;rational64;8;72 0 0 0 1 0 0 0 ;YResolution;rational64u:;72 0x0128;296;3;int16;2;2 0 ;ResolutionUnit;int16u:;2 0x0131;305;2;byte[];7;80 105 99 97 115 97 0 ;Software;string;Picasa 0x0132;306;2;byte[];20;50 48 49 57 58 48 55 58 50 50 32 ...;ModifyDate;string;2019:07:22 19:41:54 0x013b;315;2;byte[];7;80 105 99 97 115 97 0 ;Artist;string;Picasa 0x0201;513;4;int32;4;142 40 0 0 ;ThumbnailOffset ;int32u*;10382 0x0202;514;4;int32;4;191 21 0 0 ;ThumbnailLength ;int32u*;5567 0x0213;531;3;int16;2;2 0 ;YCbCrPositioning;int16u!:;2 0x1001;4097;4;int32;4;96 21 0 0 ;RelatedImageWidth;int16u!;5472 0x1002;4098;4;int32;4;64 14 0 0 ;RelatedImageHeight;int16u!;3648 0x501b;20507;1;byte;5567;255 216 255 224 0 16 74 70 73 70 0 ...;NOEXIF;; 0x5023;20515;3;int16;2;6 0 ;NOEXIF;; 0x502d;20525;5;rational64;8;72 0 0 0 1 0 0 0 ;NOEXIF;; 0x502e;20526;5;rational64;8;72 0 0 0 1 0 0 0 ;NOEXIF;; 0x5030;20528;3;int16;2;2 0 ;NOEXIF;; 0x5041;20545;2;byte[];4;82 57 56 0 ;NOEXIF;; 0x5042;20546;7;undef;4;48 49 48 48 ;NOEXIF;; 0x5090;20624;3;int16;128;1 0 1 0 1 0 1 0 1 0 2 ...;Luminance Table;; 0x5091;20625;3;int16;128;1 0 1 0 1 0 2 0 4 0 4 ...;Chrominance Table;; 0x8298;33432;2;byte[];1;0 ;Copyright;string; 0x829a;33434;5;rational64;8;1 0 0 0 200 0 0 0 ;ExposureTime;rational64u;1/200 0x829d;33437;5;rational64;8;56 0 0 0 10 0 0 0 ;FNumber;rational64u;5.6 0x8822;34850;3;int16;2;2 0 ;ExposureProgram;int16u;2 0x8827;34855;3;int16;2;160 0 ;ISO;int16u[n];160 0x8830;34864;3;int16;2;2 0 ;SensitivityType;int16u;2 0x8832;34866;4;int32;4;160 0 0 0 ;RecommendedExposureIndex;int32u;160 0x9000;36864;7;undef;4;48 50 51 48 ;ExifVersion;undef:; 0x9003;36867;2;byte[];20;50 48 49 57 58 48 55 58 50 50 32 ...;DateTimeOriginal;string;2019:07:22 15:35:08 0x9004;36868;2;byte[];20;50 48 49 57 58 48 55 58 50 50 32 ...;CreateDate;string;2019:07:22 15:35:08 0x9101;37121;7;undef;4;1 2 3 0 ;ComponentsConfiguration;undef[4]!:; 0x9201;37377;10;rational;8;0 160 7 0 0 0 1 0 ;ShutterSpeedValue;rational64s;7.625 0x9202;37378;5;rational64;8;0 0 5 0 0 0 1 0 ;ApertureValue;rational64u;5 0x9204;37380;10;rational;8;0 0 0 0 1 0 0 0 ;ExposureCompensation;rational64s;0 0x9207;37383;3;int16;2;5 0 ;MeteringMode;int16u;5 0x9209;37385;3;int16;2;16 0 ;Flash;int16u;16 0x920a;37386;5;rational64;8;124 0 0 0 1 0 0 0 ;FocalLength;rational64u;124 0x927c;37500;7;undef;8896;41 0 1 0 3 0 49 0 0 0 174 ...;MakerNoteApple ;undef; 0x9286;37510;7;undef;264;0 0 0 0 0 0 0 0 0 0 0 ...;UserComment;undef; 0x9290;37520;2;byte[];3;51 56 0 ;SubSecTime;string;38 0x9291;37521;2;byte[];3;51 56 0 ;SubSecTimeOriginal;string;38 0x9292;37522;2;byte[];3;51 56 0 ;SubSecTimeDigitized;string;38 0xa000;40960;7;undef;4;48 49 48 48 ;FlashpixVersion;undef:; 0xa001;40961;3;int16;2;1 0 ;ColorSpace;int16u:;1 0xa002;40962;4;int32;4;96 21 0 0 ;ExifImageWidth;int16u:;5472 0xa003;40963;4;int32;4;64 14 0 0 ;ExifImageHeight;int16u:;3648 0xa20e;41486;5;rational64;8;0 127 83 0 131 3 0 0 ;FocalPlaneXResolution;rational64u;6086.76307007786 0xa20f;41487;5;rational64;8;0 170 55 0 87 2 0 0 ;FocalPlaneYResolution;rational64u;6090.15025041736 0xa210;41488;3;int16;2;2 0 ;FocalPlaneResolutionUnit;int16u;2 0xa401;41985;3;int16;2;0 0 ;CustomRendered;int16u;0 0xa402;41986;3;int16;2;0 0 ;ExposureMode;int16u;0 0xa403;41987;3;int16;2;0 0 ;WhiteBalance;int16u;0 0xa406;41990;3;int16;2;0 0 ;SceneCaptureType;int16u;0 0xa420;42016;2;byte[];33;51 53 99 53 100 55 99 48 52 101 101 ...;ImageUniqueID;string;35c5d7c04ee7fd530261674ec6cf52b3 0xa430;42032;2;byte[];1;0 ;OwnerName;string; 0xa431;42033;2;byte[];13;48 54 51 48 50 49 48 48 52 54 57 ...;SerialNumber;string;063021004695 0xa432;42034;5;rational64;32;16 0 0 0 1 0 0 0 44 1 0 ...;LensInfo;rational64u[4];16 0xa434;42036;2;byte[];44;84 65 77 82 79 78 32 49 54 45 51 ...;LensModel;string;TAMRON 16-300mm F/3.5-6.3 Di II VC PZD B016 0xa435;42037;2;byte[];11;48 48 48 48 48 48 48 48 48 48 0 ...;LensSerialNumber;string;0000000000 EXIF-Einträge: 67, None: 11
Die EXIF-Daten (PropertyItems) wurden als CSV-Tabelle ausgegeben. Man kann sie daher einfach in Excel importieren und übersichtlich weiterbearbeiten.
Am Ende sieht man, dass es 67 EXIF-Einträge gibt, dass aber die Bedeutung von 11 unbekannt ist.
Bildvergleich
Verglichen werden die EXIF-Daten einer CANON-Kamera mit einer HUAWEI-Kamera. Die folgende Tabelle zeigt den Anfang dieser Excel-Tabelle, die alle Datenzeilen enthält, die aus den Bilddateien ausgelesen werden können. Die Spalten CANON-Value und HUAWEI-Value wurden aus den Spalten CANON-Bytes und HUAWEI-Bytes berechnet. Es sind insgesamt 60 Zeilen. Die grün gekennzeichneten Zeilen sind sowohl bei CANON als auch bei HUAWEI definiert, die anderen Zeilen nur bei einer der beiden Kameratypen. Die Excel-Tabelle ist in dem ZIP-Archiv enthalten.
Von den 475 definierten EXIF-Einträgen sind also bei der Abfrage des Bildes nur etwa 60 belegt. Und verschiedene Kameras benutzen nicht immer dieselben Felder. Es gibt einige Kuriositäten. Zum Beispiel den EXIF-Index 0x10e=270 "Image Description". CANON lässt dieses Feld leer, HUAWEI schreibt hier "fznor" hinein. Dieser Text steht auch irritierenderweise im Kommentar zu einem Kamera-Bild, das man in WordPress importiert. Man muss diese sinnlosen Buchstaben explizit löschen. Noch kurioser ist, dass diese Buchstaben nicht immer dieselben sind, manchmal steht dort auch etwas anderes. Das war sowohl beim Mate 9 der Fall und ist es noch beim Mate 20.
Ebenfalls rätselhaft ist das EXIF-Feld 0x501b=20507. Es verweist auf ein mehrere Tausend Byte großes Datenfeld. Wahrscheinlich ist hier ein Vorschaubild gespeichert. Das und viele weitere Unklarheiten müssten noch weiter analysiert werden.
Mit dem Auslesen der EXIF-Daten allein ist es nicht gelungen die GPS-Koordinaten auszulesen, man müsste dafür etwas tiefer in die Tausenden verfügbaren Indizes eintauchen, die mit dem Kommandozeilentool exiftool.exe ausgegeben werden.
Walter schreibt
Zum exiftool habe ich eine ‚alte‘ aber sehr funktionable Oberfläche ‚ExifToolGUI v5‘ Im Web gefunden. Hiermit lassen sich einige, für mich wesentliche Änderungen an den Exif-Daten bequem ausführen. Das Programm mag keine ‚file-anzahl‘ über ca. 120 zur Manipulation, es hängt sich dann auf. Link: http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=2750.0. Hier ist ein Bericht zum Gui: https://www.heise.de/download/product/exiftoolgui-63032
Links
- EXIF (Wikipedia)
- EXIF-Dokumentation (PDF, ca. 200 Seiten) (ist auch im Ordner „Clubintern“ als 2019-08-08 EXIF DC-008-Translation-2019-E.pdf zu finden.
- https://blogs.technet.microsoft.com/jamesone/2007/07/13/exploring-photographic-exif-data-using-powershell-of-course/
- https://www.loc.gov/preservation/digital/formats/content/tiff_tags.shtml
- https://devblogs.microsoft.com/scripting/use-powershell-to-find-metadata-from-photograph-files/
- https://gallery.technet.microsoft.com/scriptcenter/get-file-meta-data-function-f9e8d804
- https://social.technet.microsoft.com/Forums/windowsserver/en-US/e1c1f26b-6f9d-45ae-bb8c-5f4d4e38058a/powershell-script-to-read-metadata-info-from-pictures?forum=winserverpowershell
- https://mnaoumov.wordpress.com/2015/01/11/get-exif-metadata-with-powershell/
Franz war pensionierter HTL Lehrer (TGM), Präsident von ClubComputer, Herausgeber der Clubzeitung PCNEWS und betreute unser Clubtelefon und Internet Support. Er war leidenschaftlicher Rapid Wien Fan. Er ist leider Anfang Jänner 2024 nach langer schwerer Krankheit verstorben.
Danke Franz, ein toller Bericht, sehr informativ und excellent recherchiert!
Zwei Anmerkungen: Der Link im Text: Darstellung des Datenformats in einem PDF-Dokument (The requested URL /std/documents/e/DC-008-Translation-2019-E.pdf was not found on this server.) funktioniert bei mir leider nicht.
Zum exiftool habe ich eine ‚alte‘ aber sehr funktionable Oberfläche ‚ExifToolGUI v5‘ Im Web gefunden. Hiermit lassen sich einige, für mich wesentliche Änderungen an den Exif-Daten bequem ausführen. Das Programm mag keine ‚file-anzahl‘ über ca. 120 zur Manipulation, es hängt sich dann auf.
Link: http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=2750.0
Habe einen Bericht zum Gui gefunden: https://www.heise.de/download/product/exiftoolgui-63032