39

私は周りを見回しましたが、非常に苛立たしい問題に対する確かな答え/解決策はないようです。

縦向きで写真を撮ります。保存/破棄を押すと、ボタンも正しい向きになります。問題は、後で画像を横向きにしたときに取得することです(画像は反時計回りに90度回転しています)

ユーザーに特定の向きでカメラを使用するように強制したくありません。

写真がポートレートモードで撮影されたかどうかを検出し、ビットマップをデコードして正しい方法で裏返す方法はありますか?

4

2 に答える 2

88

写真は常にカメラがデバイスに組み込まれている向きで撮影されます。画像を正しく回転させるには、画像に保存されている向き情報(EXIFメタデータ)を読み取る必要があります。そこには、画像が撮影されたときにデバイスがどのように方向付けられたかが保存されます。

EXIFデータを読み取り、それに応じて画像を回転させるコードを次に示し fileます。は画像ファイルの名前です。

BitmapFactory.Options bounds = new BitmapFactory.Options();
bounds.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file, bounds);

BitmapFactory.Options opts = new BitmapFactory.Options();
Bitmap bm = BitmapFactory.decodeFile(file, opts);
ExifInterface exif = new ExifInterface(file);
String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
int orientation = orientString != null ? Integer.parseInt(orientString) :  ExifInterface.ORIENTATION_NORMAL;

int rotationAngle = 0;
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90;
if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180;
if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270;

Matrix matrix = new Matrix();
matrix.setRotate(rotationAngle, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2);
Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bounds.outWidth, bounds.outHeight, matrix, true);

更新2017-01-16

25.1.0サポートライブラリのリリースに伴い、ExifInterfaceサポートライブラリが導入されました。これにより、Exif属性へのアクセスが容易になる可能性があります。それに関する記事については、 Android開発者のブログを参照してください。

于 2012-10-17T11:49:17.473 に答える
1

選択された回答は、この質問および同様の質問に回答される最も一般的な方法を使用します。ただし、Samsungのフロントカメラとバックカメラの両方で機能しませんでした。サムスンや他の主要メーカーのフロントカメラとバックカメラの両方で機能する別のソリューションが必要な場合、nvhausidによるこの回答は素晴らしいです:

https://stackoverflow.com/a/18915443/6080472

クリックスルーしたくない場合、関連する魔法は、メディアファイルに対してEXIFまたはカーソルに依存するのではなく、CameraInfoを使用することです。

Bitmap realImage = BitmapFactory.decodeByteArray(data, 0, data.length);
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(mCurrentCameraId, info);
Bitmap bitmap = rotate(realImage, info.orientation);

リンク内の完全なコード。

于 2016-10-30T03:02:37.707 に答える