Android: Comment détecter l'orientation de l'image (portrait ou paysage) choisie dans la galerie lors de la mise en place d'une vue d'image?

je mets une image sur l'imageview choisi dans la galerie (album caméra). Si l'image choisie est orientée paysage, elle s'affiche parfaitement mais si l'image est en mode portrait(I. e l'image a été cliquée en mode portrait) il affiche l'image avec une rotation de 90 degrés. Maintenant j'essaie de trouver l'orientation juste avant de mettre sur imageview, 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

29
demandé sur sarabhai05 2012-10-04 16:02:51

6 réponses

Utiliser ExifInterface pour l'image de rotation. Utilisez cette méthode pour obtenir la valeur correcte d'être tourner l'image capturée de 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 la valeur pour tourner 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);

Espérons que cette aide..

52
répondu Deepak 2017-08-16 13:29:15

C'est aussi en travaillant 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);
4
répondu sarabhai05 2012-10-09 14:47:36
                      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
répondu ultimate 2014-01-08 10:17:47
https://stackoverflow.com/a/34241250/8033090

solution sur une ligne:

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

ou

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

ceci va autodétecter la rotation et placer l'image dans la bonne orientation

Picasso est une bibliothèque très puissante pour gérer les images dans votre application inclut: des transformations d'image Complexes avec une utilisation minimale de mémoire. Il peut prendre une seconde pour charger, mais je viens de mettre un peu de texte derrière le vue d'image qui dit "chargement de l'image" et lorsque l'image est chargée, elle couvre le texte.

1
répondu Andrew Moreau 2017-05-28 05:24:17

une autre solution est d'utiliser L'ExifInterface de la bibliothèque de support: ExifInterface de soutien de la bibliothèque

0
répondu lucasddaniel 2017-05-10 18:19:22

Ce travail pour moi :

private String getOrientation(Uri uri){
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    String orientation = "landscape";
    try{
        String image = new File(uri.getPath()).getAbsolutePath();
        BitmapFactory.decodeFile(image, options);
        int imageHeight = options.outHeight;
        int imageWidth = options.outWidth;
        if (imageHeight > imageWidth){
            orientation = "portrait";
        }
    }catch (Exception e){
        //Do nothing
    }
    return orientation;
}
-1
répondu ilmetu 2013-12-22 08:02:05