web-dev-qa-db-fra.com

Orientation des images depuis la galerie/objectif de la caméra

Je reçois une image sur mon application à partir de l'objectif de la caméra/de la galerie. Dans de nombreux téléphones, l'image que je lis de l'intention/Uri est déjà tournée pour corriger l'orientation. Par exemple, N1, Legend, Desire, c’est le cas.

Mais sur certains téléphones (par exemple, Milestone1, GalaxyS), la photo est toujours en mode paysage, quelle que soit la manière dont la photo a été prise. Cela signifie que dans mon application, l'image de portrait est présentée de manière incorrecte à l'utilisateur. J'ai essayé de lire les informations EXIF ​​de la photo, mais la balise d'orientation est toujours 0. Il doit y avoir un moyen de connaître la bonne orientation de la photo, car dans Milestone1, l'application de galerie affiche correctement les portraits. 

Comment savoir si je dois faire pivoter moi-même l'image avant de la montrer à l'utilisateur?

Merci pour votre aide!

32
Juhani

Florian answer travaille pour les images de galerie. 

Le code suivant fonctionne pour les images capturées, n’a pas été essayé avec des images de galerie mais je crois que cela devrait fonctionner. J'espère que cela aide n'importe qui.

Code:

public static int getCameraPhotoOrientation(Context context, Uri imageUri, String imagePath){
     int rotate = 0;
     try {
         context.getContentResolver().notifyChange(imageUri, null);
         File imageFile = new File(imagePath);
         ExifInterface exif = new ExifInterface(
                 imageFile.getAbsolutePath());
         int orientation = exif.getAttributeInt(
                 ExifInterface.TAG_ORIENTATION,
                 ExifInterface.ORIENTATION_NORMAL);

         switch (orientation) {
         case ExifInterface.ORIENTATION_ROTATE_270:
             rotate = 270;
             break;
         case ExifInterface.ORIENTATION_ROTATE_180:
             rotate = 180;
             break;
         case ExifInterface.ORIENTATION_ROTATE_90:
             rotate = 90;
             break;
         }


         Log.v(TAG, "Exif orientation: " + orientation);
     } catch (Exception e) {
         e.printStackTrace();
     }
    return rotate;
 }

EDIT: .__ Comme on peut le lire dans les commentaires, certains appareils ne supportent pas les informations Exif, n’ont pas vérifié lequel, mais je pense que HTC ne le fait pas. assurez-vous de vérifier quels périphériques et de créer une alternative.

25
eric.itzhak

La méthode suivante renvoie l'orientation d'une image en degrés. Cela fonctionne avec des images de la galerie. Renvoie les valeurs pour:

  • paysage normal: 0
  • portrait normal: 90
  • paysage à l'envers: 180
  • portrait à l'envers: 270
  • image non trouvée: -1

Le code:

public static int getOrientation(Context context, Uri photoUri) {
    Cursor cursor = context.getContentResolver().query(photoUri,
            new String[] { MediaStore.Images.ImageColumns.ORIENTATION },
            null, null, null);

    try {
        if (cursor.moveToFirst()) {
            return cursor.getInt(0);
        } else {
            return -1;
        }
    } finally {
        cursor.close();
    }
}
16
Florian Fankhauser
        int rotate = 0;
        try {
            File imageFile = new File(sourcepath);
            ExifInterface exif = new ExifInterface(
                    imageFile.getAbsolutePath());
            int orientation = exif.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL);

            switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_270:
                rotate = 270;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                rotate = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                rotate = 90;
                break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Matrix matrix = new Matrix();
        matrix.postRotate(rotate);
        bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
3
vineet pal

C'est la meilleure réponse que j'ai trouvée, par ramaral. https://stackoverflow.com/a/20480741/2258389
Fonctionne très bien pour la galerie ou la caméra

2
Jason

J'ai le même problème avec S1 et j'ai remarqué que même si vous ouvrez l'image à l'aide de l'application Galerie d'actions, celle-ci s'ouvrira en mode paysage (le téléphone ne connaît pas l'orientation correcte de la photo).
Et si vous faites pivoter le téléphone en mode portrait dans l'appareil photo, les icônes (prendre des photos, faire la mise au point et paramètres) ne seront pas pivotées, essayez-le dans S2 ou dans tout appareil photo de paysage/portrait prenant en charge l'appareil, ces icônes pivoteront.

Ce que je suis sûr que l’appareil photo courant ne prend pas en charge la prise de photos en mode proportionnel.

1
JafarKhQ
Matrix matrix = new Matrix();

ExifInterface exifReader = new ExifInterface(filePath);

int orientation = exifReader.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);

if (orientation ==ExifInterface.ORIENTATION_NORMAL) {

      // Do nothing. The original image is fine.

} else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {

       matrix.postRotate(90);

} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {

       matrix.postRotate(180);

} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {

      matrix.postRotate(270);

}
1
Anh Duy

Vous devez d'abord créer l'objet galerie à l'aide de contentresolver, puis transmettre l'URI créé à l'intention de capture d'image. Ensuite, vous pouvez regarder les données exif, PAS les données d'orientation de la galerie. 

1
Eric Novins

Cela ressemble au même problème qui a été résolu dans cette question: Android: les bitmaps chargés depuis la galerie sont pivotés dans ImageView

0
Loktar

Je l'avais déjà fait pour un projet, car j'avais le même problème (Android pensant que vous ne feriez qu'une photo sur paysage). Ce que j'ai fait, c'est détecter l'orientation du téléphone à ce moment-là, puis faire pivoter l'image. Cela suppose que l'orientation soit toujours la même lorsque l'intention est reçue.

0
Valentin Rocher

Utilisez-le de cette façon!

private static int exifToDegrees(int exifOrientation) {
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
        return 90;
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
        return 180;
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
        return 270;
    }
    return 0;
}

Et dans le code,

Bitmap newImage = Bitmap.createBitmap(actualImage, 0, 0, width, height, matrix, true);

Simple!

0
nithinreddy

Ce que je fais: Vérifie d’abord l’orientation de l’image prise par la caméra en utilisant ses métadonnées, et si nous trouvons cela en portrait, nous devons faire pivoter l’image de 90 et l’afficher autrement.

Pour obtenir les informations sur l'orientation de l'image, nous pouvons utiliser l'interface Exif .

0
g4gaj

Les réponses simples exiftodegree ne fonctionnent de manière cohérente que lorsque vous avez pris une photo et que je l’utilise pour de telles choses. Pour ceux d’entre vous qui rencontrent des difficultés pour choisir une photo et obtenir la bonne orientation, voyez ma réponse ici: Orientation de l’image - Android

0
A.Sanchez.SD