Problem beim EXIF-Daten entschlüsseln

Die Rubrik rund um das Thema Bildbearbeitung und Software. Techniken, EBV-Software, Tipps,...

Moderator: pilfi

d@niel
Batterie9 Makro
Beiträge: 1050
Registriert: Di Dez 02, 2003 10:07
Wohnort: Leipzig

Problem beim EXIF-Daten entschlüsseln

Beitrag von d@niel »

Hallo zusammen,

kennt sich jemand evtl. mit den "Innereien" der EXIF-Daten aus? Ich möchte ein kleines Programm basteln, welches mir aus einem jpg-Bild die EXIF-Daten ausliest und anzeigt. Das ist soweit eigentlich kein Problem, ich bekomme auch alle Daten raus, die ich haben möchte, nur teilweise in einem sehr seltsamen Format. Besonders kopfzerbrechen macht mir die EXIF-Id 33434 (hex 829a), die die Belichtungszeit angibt (exposure time). Der Wert ist hier nicht im Klartext gespeichert, sondern irgendwie seltsam codiert. Man bekommt 8 Byte zurück, die z.B. so aussehen können:

[2][0][0][0][232][3][0][0] entspricht 1/500 sec.
[8][0][0][0][232][3][0][0] entspricht 1/125 sec.
[5][0][0][0][232][3][0][0] entspricht 1/200 sec.
[9][61][0][0][128][150][152][0] entspricht 1/640 sec.

erstaunlich abweichend ist z.B. 1/100sec:
[1][0][0][0][100][0][0][0]
Das sieht ja logisch aus, ist aber eine Ausnahme, da es auf die anderen
Zeiten nicht zutrifft.

(Die eingeklammerten Werte sollen die einzelnen Bytes darstellen)

Ich kann einfach kein System darin finden. Kennt sich jemand mit sowas aus? Google konnte mir bisher auch nicht wirklich helfen.
Die anderen Daten (z.B. die Blendenzahl) sind wesentlich einfacher zu deuten. Bei der Blendenzahl (Id 33437) sieht es z.B. so aus

[38][0][0][0][10][0][0][0] entspricht Blende 3,8
[56][0][0][0][10][0][0][0] entspricht Blende 5,6
[63][0][0][0][10][0][0][0] entspricht Blende 6,3

Das erscheint ja irgendwie logisch. Nicht jedoch die "exposure time".
Was tun?

Sicher gibt es genug Software, die sowas auslesen und interpretieren kann, ich möchte aber dennoch gerne was eigenes "stricken". Über Sinn oder Unsinn dieses Unterfanges lasst uns hier jetzt mal nicht diskutieren :wink:

d@niel
Zuletzt geändert von d@niel am Do Jun 03, 2004 17:26, insgesamt 2-mal geändert.

Reiner
Sollte mal wieder fotografieren...
Beiträge: 20936
Registriert: Di Okt 08, 2002 19:23
Wohnort: Reutlingen
Kontaktdaten:

Beitrag von Reiner »

Vielleicht kannst Du die Infos aus dem Copyexif Skript von FixFoto rausholen...
Skript-Download
Reiner

wegus
Moderator
Beiträge: 6898
Registriert: Fr Apr 09, 2004 16:54
Wohnort: bei Braunschweig

Beitrag von wegus »

oder hier heraus, falls Du PHP kannst:

http://www.phpclasses.org/browse/package/1042.html

d@niel
Batterie9 Makro
Beiträge: 1050
Registriert: Di Dez 02, 2003 10:07
Wohnort: Leipzig

Beitrag von d@niel »

PHP ist mir leider absolut nicht geläufig, zudem ist der Code auf dieser Seite passwortgeschütz (Logon erforderlich).
Ideal wäre etwas in VB oder C#, zur Not auch Pascal... Oder eine allgemeine Erklärung, wie man die "exposure time" übersetzen kann.

Es scheint was mit dem Kehrwert des ersten Byte-Wertes zu tun zu haben, jedenfalls geht das bei "runden" Zeiten auf:

[8]..... 1/8 = 0.125 entspr. 1/125 sec
[5]..... 1/5 = 0.2 entspr. 1/200 sec
und so weiter.
Nur bei der 1/640sec klappts nicht. Aber der Weg scheint zustimmen.
Vermutlich ist es nicht der erste Byte-Wert allein sondern die ersten 4 Byte verschlüsseln den Wert (dezimal? hexa? oder wie?).


d@niel
Zuletzt geändert von d@niel am Do Jun 03, 2004 17:40, insgesamt 1-mal geändert.

Reiner
Sollte mal wieder fotografieren...
Beiträge: 20936
Registriert: Di Okt 08, 2002 19:23
Wohnort: Reutlingen
Kontaktdaten:

Beitrag von Reiner »

d@niel hat geschrieben: Ideal wäre etwas in VB oder C#, zur Not auch Pascal... Oder eine allgemeine Erklärung, wie man die "exposure time" übersetzen kann.
Das copyexif Skript ist in VB wenn mich nicht alles täuscht.... :)
Reiner

wegus
Moderator
Beiträge: 6898
Registriert: Fr Apr 09, 2004 16:54
Wohnort: bei Braunschweig

Beitrag von wegus »

PHP liest sich wie ein vereinfachtes C,

wenn Du das Skript haben magst, schick mir Deine email-Adresse als PN!

d@niel
Batterie9 Makro
Beiträge: 1050
Registriert: Di Dez 02, 2003 10:07
Wohnort: Leipzig

Beitrag von d@niel »

ja, das oben genannte Skript ist VB. Dennoch hilft´s mir nicht wirklich.
Aber: ich glaube, die Lösung selber gefunden zu haben. Muss noch ein wenig experimentieren, aber es sieht gut aus.
Wenn´s jemanden interessiert werde ich es dann gerne hier beschreiben.

d@niel

wegus
Moderator
Beiträge: 6898
Registriert: Fr Apr 09, 2004 16:54
Wohnort: bei Braunschweig

Beitrag von wegus »

@ d@niel:
ja bitte, so was interessiert mich immer :!:

TEG
Betterie1
Beiträge: 12
Registriert: Fr Apr 30, 2004 9:32
Wohnort: Kreis Gifhorn

Beitrag von TEG »

@ D@niel

ich bin auch daran interessiert.

Ich habe selbst mal ein bißchen gestöbert. Dabei bin ich als Urheber auf einen Matthias Wandel gestossen.
Ich habe den Code mit deinen Zahlen ausprobiert, allerdings ohne ein vernünftiges Ergebnis.


long ret1, ret2;
double dret1, dret2;

ret1 = (9 << 24) | (61 << 16) | (0 << 8 ) | (0 << 0 );
ret2 = (128 << 24) | (150 << 16) | (152 << 8 ) | (0 << 0 );

dret1 = (double)ret2/ret1;
dret2 = exp(dret1 * log(2));

dret2 müßte jetzt eigentlich die Belichtungszeit sein. Stimmt aber nicht. :cry:

Also wenn du eine Lösung gefunden hast würde ich gerne mal drau schauen.

Gruß Thomas

d@niel
Batterie9 Makro
Beiträge: 1050
Registriert: Di Dez 02, 2003 10:07
Wohnort: Leipzig

Beitrag von d@niel »

na ok, dann will ich mal versuchen, zu beschreiben, was ich herausgefunden habe. Das ganze bezieht sich (wie erwähnt) erstmal nur auf die "exposure time", die meisten anderen Daten kommen in einem wesentlich klareren Format rüber.

Nehmen wir als einfaches Beispiel erstmal eine Belichtungszeit von 1/125sec. Der Exif-Wert mit der ID 33434 (hex 829a), der diese "exposure time" liefert, sieht dabei so aus:

[8][0][0][0][232][3][0][0]

Diese Info ist laut Exif-Definition ein so genanntes Rational, welches aus zwei 4byte Werten besteht. Es sieht also eigentlich so aus:

8 0 0 0 , 232 3 0 0 (die Klammern lass ich jetzt mal weg)

Bis dahin ist das alles noch dokumentiert, jedenfalls habe ich was dazu gefunden. Das Problem war, aus diesen Daten auf die Belichtungszeit zu kommen. Das scheint nun so zu gehen:

Die beiden 4byte-Blöcke basieren auf einem 256er-Zahlensystem. Mann muss also für den ersten Wert rechnen:

8*1 + 0*256 + 0*512 + 0*1024 = 8 (der erste Wert ist also 8 )

232*1 + 3*256 + 0*512 + 0*1024 = 1000 (zweiter Wert ist also 1000)

Damit sind wir aber noch nicht bei 1/125. Das geht nun so:

1/8 = 0,125 (Kehrwert des ersten Wertes)
0,125 * 1000 = 125 (Ergebnis * zweiter Wert)
oder kurz (1/8 ) * 1000 = 125
Und davon der Kehrwert (1/125) ist unsere Belichtungszeit!

Ganz einfach eigentlich :wink:

So z.B. in C#:

private string DecodeExif(byte[] arrExif)
{
int value1 = (1*arrExif[0]) + (256*arrExif[1]) + (512*arrExif[2]) + (1024*arrExif[3]);
int value2 = (1*arrExif[4]) + (256*arrExif[5]) + (512*arrExif[6]) + (1024*arrExif[7]);
double exposure = (1.0/value1) * value2;
return "1/" + exposure.ToString();
}


Funktioniert bisher bei allen "geraden" Belichtungszeiten, nur bei 1/640 komme ich auf eigenartige Werte. Da muss noch etwas geforscht werden.

d@niel
Zuletzt geändert von d@niel am Fr Jun 04, 2004 10:20, insgesamt 2-mal geändert.

Antworten