PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Exif encoding problems


bulvuy
2015-03-26, 08:34:07
Hi zusammen,

ich möchte gerne eine Bildergallery auf PHP Basis generieren welche die Exif-Daten der jeweiligen Bilder ausliest und diese dann als Kommentar für das jeweilige Bild anzeigt.
Der User soll später die Bilder über Windows rechts-klick editieren und die Exif-Daten selber anspassen

Die Gallery läuft soweit, allerdings habe ich das Problem, dass das Encoding wohl nicht richtig stimmt.
Ursprünglich habe ich die Daten von der WINXP-Sektion genommen, welche jetzt aber komischerweise alle mit ???????? dargestellt werden. Warum kann ich mir nicht erklären.
Hat hier jemand eine Idee?

DUMP Exif-Daten:

array(6) { ["FILE"]=> array(6) { ["FileName"]=> string(5) "1.jpg" ["FileDateTime"]=> int(1427348813) ["FileSize"]=> int(35936) ["FileType"]=> int(2) ["MimeType"]=> string(10) "image/jpeg" ["SectionsFound"]=> string(33) "ANY_TAG, IFD0, EXIF, APP12, WINXP" } ["COMPUTED"]=> array(5) { ["html"]=> string(25) "width="1200" height="800"" ["Height"]=> int(800) ["Width"]=> int(1200) ["IsColor"]=> int(1) ["ByteOrderMotorola"]=> int(1) } ["IFD0"]=> array(6) { ["ImageDescription"]=> string(24) "BildTitel selber erstellt" ["Exif_IFD_Pointer"]=> int(2158) ["Title"]=> string(50) "BildTitel selber erstellt" ["Comments"]=> string(32) "Kommentar selber erstellt" ["Subject"]=> string(50) "BildTitel selber erstellt" ["UndefinedTag:0xEA1C"]=> string(1924) "�X�0" } ["EXIF"]=> array(1) { ["UndefinedTag:0xEA1C"]=> string(2060) "�" } ["APP12"]=> array(2) { ["Company"]=> string(5) "Ducky" ["Info"]=> string(1) "" } ["WINXP"]=> array(3) { ["Title"]=> string(24) "????????????????????????" ["Comments"]=> string(15) "???????????????" ["Subject"]=> string(24) "????????????????????????" } }

PHuV
2015-03-26, 13:15:32
Kannst Du mal direkt die HEX-Werte auslesen? So sieht es erst mal nach einer UTF-8-Codierung aus.

bulvuy
2015-03-26, 13:41:25
Kannst Du mal direkt die HEX-Werte auslesen? So sieht es erst mal nach einer UTF-8-Codierung aus.

die Hexwerte von?

Mosher
2015-03-26, 13:52:59
Von der Datei, aus der du deinen EXIF-Dump herauskopiert hast.
Es wäre wohl interessant zu wissen, wie die Strings in HEX repräsentiert werden.

bulvuy
2015-03-26, 13:55:24
Von der Datei, aus der du deinen EXIF-Dump herauskopiert hast.
Es wäre wohl interessant zu wissen, wie die Strings in HEX repräsentiert werden.

ah ok...also die ausgelesenen exif daten die ich über die exif_read_data function ermittelt habe?
diese dann in hex ausgeben? bin ich richtig oder komplett falsch? sonst bitte mehr info

Mosher
2015-03-26, 14:28:32
Ich vermute, dass PHuV das gemeint hat, bin mir aber leider gerade nicht sicher. :( Sorry.

PHuV
2015-03-26, 23:35:40
Yup, meinte ich.

Gut, über eine Funktion ausgelesen, dann wird es schwierig. Kannst Du der Funktion ein Encoding übergeben? Probier mal UTF-8. Leider bin ich kein PHP-Experte, aber ich bin Enoding-Profi. ;)

Die Fragenzeichen ?????? und �X�0" deuten meistens darauf hin, daß die Zeichekette nicht entziffert werden kann. Das kann hier an der Bytefolge liegen:

http://de.wikipedia.org/wiki/UTF-8

110xxxxx 10xxxxxx
:
usw.
welche eben bei normalen String-Funktionen nicht richtig übersetzt werden können.

Dazu müßte ich aber die String-Werte als HEX-Codes oder binär sehen, um genau sagen zu können.

Was Du mal so probieren könntest: Nimm ein Programm wie IrfanView oder Spezialprogramme, welche gezielt Exif-Dateien auslesen können, wie Exif-Viewer, Exifer, ExifTool, Jeffrey's Exif Viewer oder so was. Dann siehst Du vielleicht mehr. Weißt Du, von welcher Kamera die Bilder stammen?

Weiterhin könntest Du - was mühsamer wäre - einfach nur mal den Header der Datei direkt auslesen, entweder über eine PHP-String-Funktion, welche HEX-Werte direkt ausliest, oder Du nimmst einen Hex-Editor, und schaust Dir die Bytefolgen am Anfang der Datei direkt an. Hier mußt Du aber mal nachlesen, wie die Exif-Struktur aufgebaut ist, und die entsprechenden Werte von Hand auslesen.

bulvuy
2015-03-27, 09:58:57
Yup, meinte ich.

Gut, über eine Funktion ausgelesen, dann wird es schwierig. Kannst Du der Funktion ein Encoding übergeben? Probier mal UTF-8. Leider bin ich kein PHP-Experte, aber ich bin Enoding-Profi. ;)

Die Fragenzeichen ?????? und �X�0" deuten meistens darauf hin, daß die Zeichekette nicht entziffert werden kann. Das kann hier an der Bytefolge liegen:

http://de.wikipedia.org/wiki/UTF-8

110xxxxx 10xxxxxx
:
usw.
welche eben bei normalen String-Funktionen nicht richtig übersetzt werden können.

Dazu müßte ich aber die String-Werte als HEX-Codes oder binär sehen, um genau sagen zu können.

Was Du mal so probieren könntest: Nimm ein Programm wie IrfanView oder Spezialprogramme, welche gezielt Exif-Dateien auslesen können, wie Exif-Viewer, Exifer, ExifTool, Jeffrey's Exif Viewer oder so was. Dann siehst Du vielleicht mehr. Weißt Du, von welcher Kamera die Bilder stammen?

Weiterhin könntest Du - was mühsamer wäre - einfach nur mal den Header der Datei direkt auslesen, entweder über eine PHP-String-Funktion, welche HEX-Werte direkt ausliest, oder Du nimmst einen Hex-Editor, und schaust Dir die Bytefolgen am Anfang der Datei direkt an. Hier mußt Du aber mal nachlesen, wie die Exif-Struktur aufgebaut ist, und die entsprechenden Werte von Hand auslesen.

Uff okay...cool, dass ist doch mal ein Ansatz vor allem wenn ich einen Encoding-Profi zur Hand habe. Ich werde mir das heute mal anschauen und versuchen hier was sinnvolles für dich zu posten, wo du was ermitteln kannst.

Schon ein dickes Danke, da ich mir schon einen abgegooglet habe bin ich dankbar für jede Hilfe!

Mosher
2015-03-27, 13:14:30
Ich bin zwar kein Encoding-Profi, kenne mich aber mit Bytes aus .^^

Vielleicht kann ich auch helfen und wenn nicht, warten wir halt auf PHuV. :)

bulvuy
2015-03-27, 14:03:57
Hier ist mal der Hex-Code von den ?
3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f

könnt ihr damit was anfangen?

bulvuy
2015-03-27, 14:08:54
Und hier mal die IFD0 Sektion der Exif:

426f7873656d696e617220766f6d20312e312e32303135683231353842006f007800730065006d00 69006e0061007200200076006f006d00200031002e0031002e003200300031003500680000004b00 6c00610075007300200069006e00200041006b00740069006f006e00000042006f00780073006500 6d0069006e0061007200200076006f006d00200031002e0031002e00320030003100350068000000 1cea0000000800000200000058080000160000008e1000003... aber hier kommen noch hunderte 0..

Mosher
2015-03-27, 16:03:29
Sorry, ich kann dir dazu gerade nicht mehr sagen, als dass 0x3f der ASCII-Code für das Zeichen '?' ist.

ASCII und UTF-8 sind in den ersten 128 Zeichen (also bis 0x7F) deckungsgleich.
Sorry für die spärliche Informationen. Besser, wir warten doch auf PHuV.

PHuV
2015-03-27, 18:04:38
Hier ist mal der Hex-Code von den ?
3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f

könnt ihr damit was anfangen?
Nein, das ist der bereits interpretierte Code. Stringfunktion schafft die Interpretation nicht, und setzt dann vermutlich die ? rein.
Und hier mal die IFD0 Sektion der Exif:

426f7873656d696e617220766f6d20312e312e32303135683231353842006f007800730065006d00 69006e0061007200200076006f006d00200031002e0031002e003200300031003500680000004b00 6c00610075007300200069006e00200041006b00740069006f006e00000042006f00780073006500 6d0069006e0061007200200076006f006d00200031002e0031002e00320030003100350068000000 1cea0000000800000200000058080000160000008e1000003... aber hier kommen noch hunderte 0..
Das ist schon besser. Die ersten Zeichenfolgen sind normaler ACSII-Text. Ab dem 4200 wird es interessant. Little Endian Darstellung (Intel CPU), sieht man schön, da die 00 an zweiter Stelle ist, hier ist der String UTF-16. Wenn man genau hinschaut, fängt die Kette mit 42 an, entspricht dem B, und 42 00 (eigentlich 00 42 in Big Endian Format) ist auch ein B, aber in UTF-16! Weiter gehts am Anfang mit 6f=o, und 6f00=o in UTF-16. Wie man schön sieht, wiederholt sich der Text einfach, erst mal in ASCII bis zur besagten Stelle, und dann UTF-16

Also, erster String:
Boxseminar vom 1.1.2015h2158
Zweiter Sting (UTF-16) (Leerzeichen entspricht 00, _ ist das sichtbare Leerzeichen Hex 20 ):
B o x s e m i n a r _ v o m _ 1 . 1 . 2 0 1 5 h 2 1 5 8

Warum hier ohne BOM (Byte Order Mark) (http://de.wikipedia.org/wiki/Byte_Order_Mark) einfach von ASCII in UTF-16 gewechselt wird, ist mir unklar.

Frage: mit was für einer Kamera wurde dieses Bild gemacht, und wurde vielleicht hinterher die Exif falsch geändert?

Lokadamus
2015-03-27, 18:20:07
Hat hier jemand eine Idee?Unter was laufen Client und Server?

Wenn der Client Unix/ Linux ist, kann es schon Probs wegen der Site Code geben.

PHuV
2015-03-27, 18:28:15
Ich hab mal hier was gefunden:

http://www.delphipraxis.net/90394-%5Bphp%5D-exif-informationen-werden-fehlerhaft-ausgelesen.html
http://www.php-resource.de/forum/showthread/t-94060.html

Schau mal, ob Dir das weiterhilft. Es gibt anscheinend eine Funktion "exif.encode_unicode", die Du verwenden mußt. Und hier mußt Du dann die richtige Codierung UCS-2LE setzen, das ist die besagte UTF-16 Codierung (http://de.wikipedia.org/wiki/UTF-16) mit LE = Little Endian-Format (Intel CPU). Aber wie gesagt, ich hab von PHP keine Ahnung, hier mußt Du dann selbst weiterforschen.

nalye
2015-03-27, 18:41:56
Klingt nach zwangsweisem FFFE setzen...

$data = $_POST['data'];
$data = "\xFF\xFE".iconv("UTF-8","UCS-2LE",$data);

PHuV
2015-03-27, 18:56:08
Klingt nach zwangsweisem FFFE setzen...

Aber warum ist dann der erste String nur ASCII? :confused:

nalye
2015-03-27, 18:58:04
Das stellt mich auch vor ein großes Rätsel... :uponder:

Mosher
2015-03-27, 18:58:15
Nein, das ist der bereits interpretierte Code. Stringfunktion schafft die Interpretation nicht, und setzt dann vermutlich die ? rein.

Das ist schon besser. Die ersten Zeichenfolgen sind normaler ACSII-Text. Ab dem 4200 wird es interessant.

Äh, eigentlich hatte ich das auch vermutet, hatte aber Angst, damit völlig daneben zu liegen und mich zu blamieren.
Sieht so aus, als hätte ich mich dadurch noch mehr blamiert xD.

PHuV
2015-03-27, 19:00:27
Ach was, Du willst helfen, das zählt.

PHuV
2015-03-27, 19:01:10
Das stellt mich auch vor ein großes Rätsel...
:uponder:
Wenn er die BOM von Hand setzt, wird der erste Teil auch als UTF-16 interpretiert, und dann kommt wieder Zeichenmurks raus. :frown:

bulvuy
2015-03-27, 19:21:42
So jetzt kommts...das ist von keiner Kamera aufgenommen, sondern ein File das ich ich als temporäres Bild mit PS CC erstellt habe.
Was mich persönlich noch vor ein größeres Rätsel stellt...Die Sektion WINXP hat ja schon in der Ausgabe problemlos funktioniert.
Aber leider kann ich den Zeitpunkt der Änderung nicht festellen. Ich werd jetzt mal ein neues File anlegen und schauen wie sich das verhält.


exif.encode_unicode habe ich bereits probiert, aber wenn man nicht weiß wie man es setzen muss ist es natürlich zwecklos.
Probier grad noch ein paar Sachen damit.

Die Leerzeichen über ein Regex rauszubasteln ist zwar eine Lösung, aber für mich als Programmier irgendwie unbefriedigend...schließlich programmiere
ich dann ja nur drum herum =(. Hab es jetzt dennoch mal so implementiert, aber in Ruhe lässt es mich so nicht...

bulvuy
2015-03-27, 19:22:35
Unter was laufen Client und Server?

Wenn der Client Unix/ Linux ist, kann es schon Probs wegen der Site Code geben.

1und1 Linux Webhosting

Lokadamus
2015-03-27, 19:59:02
1und1 Linux WebhostingAlso greifst du auf Linux zu, während dein System Windows ist.

http://de.wikipedia.org/wiki/Zeilenvorschub
http://de.wikipedia.org/wiki/Zeilenumbruch
Wenn das dein Problem ist, gehört es zu den einfachen Probs. Ich überlege gerade, wie man das am einfachsten überprüfen kann. :uconf2:

PHuV
2015-03-27, 20:20:59
Einfach nach 0d0a grepen? Ich habe damals sogar extra ein Modul is_dos gemacht, damit ich das schnell erkenne.

bulvuy
2015-03-31, 08:29:13
Also...ich hab jetzt tatsächlich den qad Weg genommen. Hat jemand Interesse an dem File? Ich glaub ich komme hier erstmal nicht weiter. Es läuft jetzt mit dem Workaround und ich hab leider noch genug andere Baustellen bei der Website.

Sonst nochmal danke für helfen!

PHuV
2015-03-31, 11:22:16
Was ist der qad-Weg? :confused:

bulvuy
2015-03-31, 12:34:41
Quick and dirty =)

mit ner regex die zwischenzeichen rausfiltern...