web-dev-qa-db-ja.com

デフォルト画像ギャラリーから選択した画像の正しい方向を取得する方法

Exifタグが常に0を返すすべてのデバイスで標準で動作するように、デフォルトの画像ギャラリーから選択された画像の正しい画像の向きを取得するために、いくつかのリンクを調べました。

Androidのポートレートカメラアプリで撮影された画像の場合、EXIF方向タグ値は常に

Exif方向タグは0を返します

ExifデータTAG_ORIENTATIONは常に

http://mobisocial.stanford.edu/news/2011/08/rotating-images-in-Android/

すべてのデバイスで動作する正確なソリューションを取得する方法は?

35
ramsraj111

ユーザーが作成したプログラムで画像(写真)を撮影した場合、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;
    }
}
103
ramaral

私は最後の答えに従い、写真を管理、回転、サイズ変更、キャッシュ、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);
3
Santi Iglesias

私にとって、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を返します

それが役に立てば幸い.. :)

3
Ankit Popli

この投稿を読んだ人は、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;
}
1
Mehlyfication