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();
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..
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);
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);
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.
Une autre solution consiste à utiliser ExifInterface de la bibliothèque de support: ExifInterface de la bibliothèque de support