Exifタグが常に0を返すすべてのデバイスで標準で動作するように、デフォルトの画像ギャラリーから選択された画像の正しい画像の向きを取得するために、いくつかのリンクを調べました。
Androidのポートレートカメラアプリで撮影された画像の場合、EXIF方向タグ値は常に
http://mobisocial.stanford.edu/news/2011/08/rotating-images-in-Android/
すべてのデバイスで動作する正確なソリューションを取得する方法は?
ユーザーが作成したプログラムで画像(写真)を撮影した場合、Parameters.setRotationに正しい回転値を設定する必要があります。
これは、カメラドライブに応じて、保存する前に画像を回転するか、回転値をexif TAG_ORIENTATIONに保存します。
したがって、TAG_ORIENTATIONがnullまたはゼロの場合、画像は正しい向きになります。そうでない場合は、TAG_ORIENTATIONの値に従って画像を回転させる必要があります。
[〜#〜] code [〜#〜]
EXIFからオリエンテーションを取得:
ExifInterface exif = null;
try {
exif = new ExifInterface(path);
} catch (IOException e) {
e.printStackTrace();
}
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
ビットマップを回転させる:
Bitmap bmRotated = rotateBitmap(bitmap, orientation);
ビットマップを回転させる方法:
public static Bitmap rotateBitmap(Bitmap bitmap, int orientation) {
Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_NORMAL:
return bitmap;
case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
matrix.setScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.setRotate(180);
break;
case ExifInterface.ORIENTATION_FLIP_VERTICAL:
matrix.setRotate(180);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_TRANSPOSE:
matrix.setRotate(90);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.setRotate(90);
break;
case ExifInterface.ORIENTATION_TRANSVERSE:
matrix.setRotate(-90);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.setRotate(-90);
break;
default:
return bitmap;
}
try {
Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bitmap.recycle();
return bmRotated;
}
catch (OutOfMemoryError e) {
e.printStackTrace();
return null;
}
}
私は最後の答えに従い、写真を管理、回転、サイズ変更、キャッシュ、ImageViewsにロードするシステムの作成に一生懸命努力しましたが、それは地獄だとわかります。それがすべて行われた場合でも、一部のデバイスではクラッシュによりOutOfMemoryが発生することがあります。答えは正しいですが、Androidでビットマップを管理することは困難です。
私のポイントは、車輪を再発明することではなく、完璧なデザインです。 Google自体は Glide を使用することをお勧めします。 1行で機能し、非常に使いやすく、サイズと機能数が軽量です。デフォルトでEXIFを管理し、メモリをチャームのように使用します。 。それは単に黒魔術でコード化されています;)
Picasso もEXIFを管理するかどうかはわかりませんが、両方の簡単な紹介があります:
https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
私のアドバイス:あなたの時間を無駄にしないで、それらを使用してください。問題を1行で解決できます。
Glide.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
私にとって、ExifInterfaceは次のように非常にうまく機能しました。
ExifInterface exifInterface = new ExifInterface(imagePath);
degree = Integer.parseInt(exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION));
または、次のようにMediaStore
を使用して画像の詳細を取得しようとすることができます。
String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION};
Cursor cur = managedQuery(imageUri, orientationColumn, null, null, null);
int orientation = -1;
if (cur != null && cur.moveToFirst()) {
orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0]));
}
同様のソリューション: ExifInterfaceは常に1を返します
それが役に立てば幸い.. :)
この投稿を読んだ人は、2016年12月に導入されたAndroidサポートライブラリのexifinterfaceを使用してください:
compile "com.Android.support:exifinterface:25.1.0" // or newer
このライブラリの詳細は、Android Developers Blog post: Introducing the ExifInterface Support Library
また、exifインターフェースに保存されている回転情報を処理するためのサンプルコードも含まれています。
int rotation = 0;
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotation = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotation = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotation = 270;
break;
}