Hintergrund: Ich schreibe gerade eine Kamera-App für ein Messenger-Programm. Ich kann das aufgenommene Bild nicht auf einem dauerhaften Datenträger speichern. Die Kamera muss alle Ausrichtungen unterstützen. Meine Implementierung ist die der bekannten Surfaceview-Beispiele. Ich verwende die Display-Klasse, um die Ausrichtung zu erkennen und die Kamera entsprechend zu drehen. Im takePicture jpeg callback konstruiere ich eine Bitmap aus byte[], um einige Probleme mit dem Seitenverhältnis zu umgehen: Kamera-API: Geräteübergreifende Probleme
Problembeschreibung: Bei einigen Geräten wird die konstruierte Bitmap bei ROTATION_270 (Gerät um 90 Grad im Uhrzeigersinn gedreht) auf dem Kopf stehend angezeigt. Bis jetzt scheint es Samsung zu sein. Ich kann nur vermuten, dass vielleicht die Kamera verkehrt herum angelötet ist oder etwas in der Art, aber das ist weder hier noch dort. Ich kann zwar überprüfen, ob eine Bitmap seitlich ist, aber ich kann nicht logisch überprüfen, ob sie auf dem Kopf steht, also brauche ich Zugriff auf die EXIF-Daten.
Android bietet einen Parser für diese Funktion http://developer.Android.com/reference/Android/media/ExifInterface.html aber leider hat es einen einzigen Konstruktor, der eine Datei akzeptiert... die ich nicht habe und nicht will. Intuitiv könnte ich einen Konstruktor für ein Byte-Array schreiben, aber das scheint wirklich schmerzhaft angesichts ihrer Aufrufe in nativen Code http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.Android/Android/2.2.1_r1/Android/media/ExifInterface.java
Meine Frage hat also zwei Teile:
-
Weiß jemand, ob das byte[] Array enthält vollständige EXIF jpeg Header Daten enthält, oder ist der Pfad durch die BitmapFactory.decode(...) / BitmapFactory.compress(...) irgendwie hinzugefügt?
-
Wenn diese EXIF-Daten in dem Byte-Array vorhanden sind, wie kann Orientierungsinformationen zuverlässig auslesen?
Bearbeiten 10/18/12
Die folgende Antwort von pcans bezieht sich auf Teil 2 meiner Frage. Wie ich in den Kommentaren unter seiner Antwort angedeutet habe, müssen Sie den Quellcode in Ihr Projekt einbinden, wenn Sie diesen Parser verwenden wollen. Die in dem verlinkten SO-Beitrag erwähnten Änderungen wurden bereits vorgenommen und hier gepostet: https://github.com/strangecargo/metadata-extractor
HINWEIS Neuere Versionen von Metadaten-Extraktor funktionieren direkt auf Android ohne Änderungen und sind über Maven verfügbar.
Jedoch, wie zu Teil 1, erhalte ich 0 Tags zurück aus dem Parser, wenn ich es mit dem Byte-Array, das ich von takePicture erhalten ausführen. Ich bin immer besorgt, dass das Byte-Array nicht die Daten hat, die ich brauche. Ich werde weiterhin in diese zu suchen, aber begrüßen jede weitere Einsicht.