背景: メッセンジャー プログラム用のカメラ アプリを作成しています。キャプチャしたイメージを永続ディスクに保存できません。カメラはすべての向きをサポートする必要があります。私の実装は、おなじみの Surfaceview の例の実装です。Display クラスを使用して向きを検出し、それに応じてカメラを回転させます。takePicture jpeg コールバックでは、縦横比の問題を回避するために、byte[] からビットマップを作成します。カメラ API: クロス デバイスの問題
問題の説明: 一部のデバイスでは、ROTATION_270 (時計回りに 90 度回転したデバイス) で作成されたビットマップが上下逆になります。これまでのところ、それはサムスンのようです。おそらくカメラが逆にはんだ付けされているか、何か影響があるのではないかと推測できますが、それはあちらこちらでもありません。ビットマップが横向きであるかどうかを確認できますが、寸法によって上下が逆になっているかどうかを論理的に確認することはできないため、EXIF データにアクセスする必要があります。
Android はこのhttp://developer.android.com/reference/android/media/ExifInterface.htmlのパーサーを提供しますが、残念ながら、ファイルを受け入れる単一のコンストラクターがあります... 私は持っておらず、望んでいません. 直感的にバイト配列のコンストラクターを作成できますが、ネイティブコードへの呼び出しを考えると、それは非常に苦痛に思えますhttp://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2 .1_r1/android/media/ExifInterface.java
私の質問には2つの部分があります:
byte[] 配列に完全な EXIF jpeg ヘッダー データがそのまま含まれているのか、それとも BitmapFactory.decode(...) / BitmapFactory.compress(...) を介したパスが何らかの方法で追加されているのか、誰かが知っていますか?
この EXIF データがバイト配列に存在する場合、信頼できる方法で方向情報を解析するにはどうすればよいですか?
2012 年 10 月 18 日を編集
以下の pcans の回答には、私の質問のパート 2 が含まれます。彼の回答の下のコメントで指摘したように、そのパーサーを使用したい場合は、ソースをプロジェクトに組み込む必要があります。そのリンクされた SO 投稿で言及されている変更は既に行われており、ここに再投稿されています: https://github.com/strangecargo/metadata-extractor
新しいバージョンのmetadata-extractorは変更なしで Android で直接動作し、Maven を介して利用できることに注意してください。
ただし、パート 1 に関しては、takePicture から取得したバイト配列を使用してパーサーを実行すると、パーサーから 0 個のタグが返されます。必要なデータがバイト配列にないのではないかと心配しています。これについては引き続き調査しますが、さらなる洞察を歓迎します。