web-dev-qa-db-fra.com

Android: Comment détecter l'orientation de l'image (portrait ou paysage) sélectionnée dans la galerie lors du réglage sur une image?

Je suis en train de définir une image sur la vue image sélectionnée dans la galerie (album de l'appareil photo). Si l'image sélectionnée a une orientation paysage, elle s'affiche parfaitement, mais si l'image est en mode portrait (l'image a été cliquée en mode portrait), elle affiche l'image avec une rotation de 90 degrés. Maintenant, j'essaie de connaître l'orientation juste avant de définir l'image, mais toutes les images donnent la même orientation et la même largeur/hauteur. Voici mon code: 

Uri selectedImage = intent.getData();
if (selectedImage != null) {
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);

    int str = new ExifInterface(selectedImage.getPath()).getAttributeInt("Orientation", 1000);
    Toast.makeText(this, "value:" + str, Toast.LENGTH_LONG).show();
    Toast.makeText(this, "width:" + bitmap.getWidth() + "height:" + bitmap.getHeight(), Toast.LENGTH_LONG).show();

portrait modelandscape mode

30
sarabhai05

Utilisez ExifInterface pour faire pivoter l'image. Utilisez cette méthode pour obtenir la valeur correcte pour faire pivoter l’image capturée par la caméra.

public 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.i("RotateImage", "Exif orientation: " + orientation);
        Log.i("RotateImage", "Rotate value: " + rotate);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return rotate;
}

Et mettez ce code dans la méthode de résultat d'activité et obtenez une valeur pour faire pivoter l'image ...

String selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};

Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();

int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
filePath = cursor.getString(columnIndex);
cursor.close();

int rotateImage = getCameraPhotoOrientation(MyActivity.this, selectedImage, filePath);

J'espère que cela t'aides..

53
Deepak

Cela fonctionne aussi pour moi:

String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION};
Cursor cur = getContentResolver().query(imageUri, orientationColumn, null, null, null);
int orientation = -1;
if (cur != null && cur.moveToFirst()) {
    orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0]));
}
Matrix matrix = new Matrix();
matrix.postRotate(orientation);
5
sarabhai05
                      if(bm.getWidth() > bm.getHeight())
                        {
                            Bitmap bMapRotate=null;
                            Matrix mat=new Matrix();
                            mat.postRotate(90);
                        bMapRotate = Bitmap.createBitmap(bm, 0, 0,bm.getWidth(),bm.getHeight(), mat, true);
                        bm.recycle();
                        bm=null;
                        imageDisplayView.setImageBitmap(bMapRotate);
                        }else
                        imageDisplayView.setImageBitmap(bm);
3
ultimate

Voici une excellente solution que j'ai trouvée pour cela:> https://stackoverflow.com/a/34241250/8033090

Une solution en ligne:

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

ou

Picasso.with(context).load("file:" + photoPath).into(imageView);

Ceci détectera automatiquement la rotation et placera l'image dans l'orientation correcte

Picasso est une bibliothèque très puissante pour la gestion des images dans votre application. Elle comprend: Des transformations d’images complexes avec une utilisation minimale de la mémoire. Le chargement peut prendre une seconde, mais je place un texte derrière la vue qui dit "Chargement de l’image" et qui, une fois chargé, recouvre le texte.

1
Andrew Moreau

Une autre solution consiste à utiliser ExifInterface de la bibliothèque de support: ExifInterface de la bibliothèque de support

0
lucasddaniel