30 votes

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

Je suis prise en photo pour mon application à partir de l'appareil photo / galerie d'intention. Dans de nombreux téléphones image que j'ai lu de l'intention de l' / Uri est déjà tourné à l'orientation correcte. Par exemple N1, selon la Légende, le Désir qui est le cas.

Mais alors, sur certains téléphones ( par exemple Milestone1, GalaxyS) l'image est toujours dans le paysage plus peu importe la façon dont la photo a été prise. Cela signifie que, dans mon application portrait photo est présenté de manière erronée à l'utilisateur. J'ai essayé de lire les infos EXIF de la photo, mais l'orientation de la balise est toujours 0. Il y a un moyen de trouver la bonne orientation de l'image parce que dans Milestone1 l'application galerie montre le portrait, les photos correctement.

Comment puis-je savoir si j'ai besoin de faire pivoter l'image de moi-même avant de le montrer à l'utilisateur?

Je vous remercie pour votre aide!

25voto

eric.itzhak Points 5261

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.

15voto

Florian Points 1903

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();
    }
}
 

3voto

vineet pal Points 41
        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);

2voto

Jason Points 18

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

1voto

Eric Novins Points 348

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X