Lorsque je charge une image de la galerie multimédia dans un Bitmap, tout fonctionne correctement, sauf que les images qui ont été prises avec l'appareil photo tout en tenant le téléphone verticalement, sont pivotées de sorte que j'obtienne toujours une image horizontale même si elle apparaît verticalement dans le Galerie. Pourquoi cela et comment puis-je le charger correctement?
138
Réponses:
Avez-vous regardé les données EXIF des images? Il peut connaître l'orientation de l'appareil photo lorsque la photo a été prise.
la source
Donc, à titre d'exemple ...
Vous devez d'abord créer une ExifInterface:
Vous pouvez ensuite saisir l'orientation de l'image:
Voici ce que signifient les valeurs d'orientation: http://sylvana.net/jpegcrop/exif_orientation.html
Ainsi, les valeurs les plus importantes sont 3, 6 et 8. Si l'orientation est
ExifInterface.ORIENTATION_ROTATE_90
(qui est 6), par exemple, vous pouvez faire pivoter l'image comme ceci:C'est juste un exemple rapide, cependant. Je suis sûr qu'il existe d'autres façons d'effectuer la rotation réelle. Mais vous les trouverez également sur StackOverflow.
la source
OutOfMemoryError
lorsque vous utilisez cette approche car vous tenez deux bitmaps en mémoire en même temps.Il s'agit d'une solution complète (trouvée dans l'exemple Hackbook du SDK Facebook). Il a l'avantage de ne pas avoir besoin d'accéder au fichier lui-même. Ceci est extrêmement utile si vous chargez une image à partir du résolveur de contenu (par exemple, si votre application répond à une intention de partage de photo).
Et puis vous pouvez obtenir un Bitmap pivoté comme suit. Ce code réduit également l'image (malheureusement malheureusement) à MAX_IMAGE_DIMENSION. Sinon, vous risquez de manquer de mémoire.
la source
ExifInterface exif = new ExifInterface(photoUri.getPath());
etexif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1)
d'obtenir l' orientation (par exempleORIENTATION_ROTATE_90
,ORIENTATION_ROTATE_180
)Résolu dans mon cas avec ce code à l'aide de cet article:
J'espère que cela fera gagner du temps à quelqu'un!
la source
Utilisez un utilitaire pour faire le levage lourd.
9re a créé un utilitaire simple pour gérer les tâches lourdes de traitement des données EXIF et de rotation des images dans leur bonne orientation.
Vous pouvez trouver le code utilitaire ici: https://gist.github.com/9re/1990019
Téléchargez simplement ceci, ajoutez-le au
src
répertoire de votre projet et utilisezExifUtil.rotateBitmap()
pour obtenir la bonne orientation, comme ceci:la source
C'est parce que la galerie affiche correctement les images pivotées mais pas ImageView, regardez ici:
et vous en avez besoin:
la source
Je l'ai fait fonctionner après de nombreuses tentatives grâce à un message que je ne trouve plus :-(
Exif semble toujours fonctionner, la difficulté était d'obtenir le chemin du fichier. Le code que j'ai trouvé fait une différence entre les API antérieures à 4.4 et ultérieures à 4.4. Fondamentalement, l'URI d'image pour 4.4+ contient "com.android.providers". Pour ce type d'URI, le code utilise DocumentsContract pour obtenir l'ID d'image, puis exécute une requête à l'aide de ContentResolver, tandis que pour les anciens SDK, le code interroge directement l'URI avec ContentResolver.
Voici le code (désolé, je ne peux pas créditer qui l'a publié):
la source
Vous pouvez simplement lire le chemin de la carte SD et faire le code suivant ... cela remplacera la photo existante après l'avoir fait pivoter.
Non: Exif ne fonctionne pas sur la plupart des appareils, il donne les mauvaises données, il est donc bon de coder en dur la rotation avant d'enregistrer à n'importe quel degré que vous voulez, il vous suffit de changer la valeur de l'angle dans postRotate à ce que vous voulez.
la source
Code Kotlin:
la source
J'ai amélioré la réponse de Teo Inke. Il ne fait plus pivoter l'image à moins que cela ne soit réellement nécessaire. Il est également plus facile à lire et devrait fonctionner plus rapidement.
la source
La première chose dont vous avez besoin est le vrai chemin du fichier.Si vous l'avez bien, si vous utilisez l'URI, utilisez cette méthode pour obtenir le vrai chemin:
extrayez votre Bitmap par exemple:
vous pouvez utiliser decodeFile () à la place si vous le souhaitez.
Maintenant que vous avez le Bitmap et le vrai chemin, obtenez l'orientation de l'image:
et enfin le faire pivoter dans la bonne position comme ceci:
Voilà, vous avez maintenant le bitmap tourné à la bonne position.
à votre santé.
la source
Cela fonctionne, mais ce n'est probablement pas la meilleure façon de le faire, mais cela pourrait aider quelqu'un.
la source
peut-être que cela aidera (tourner à 90 degrés) (cela a fonctionné pour moi)
la source
Le curseur doit être fermé après son ouverture.
Voici un exemple.
la source
J'ai fondu la réponse @Timmmm et @Manuel. Si vous faites cette solution, vous n'obtiendrez pas d'exception de manque de mémoire.
Cette méthode récupère l'orientation de l'image:
Par conséquent, vous utiliserez cette méthode pour redimensionner l'image avant de la charger en mémoire. De cette façon, vous n'obtiendrez pas d'exception de mémoire.
Cela fonctionne parfaitement pour moi. J'espère que cela aide quelqu'un d'autre
la source
Amélioration de la solution ci-dessus par Timmmm pour ajouter une mise à l'échelle supplémentaire à la fin pour garantir que l'image s'insère dans les limites:
la source
Utilisez le code suivant pour faire pivoter correctement une image:
la source
Les méthodes ci-dessous mettent à l'échelle ET font pivoter le bitmap en fonction de l'orientation:
Exemple:
la source
J'ai résolu le problème avec la solution de contournement suivante. Notez que je redimensionne également l'image, ce qui était nécessaire pour éviter les OutOfMemoryExceptions.
Attention, cette solution ne fonctionnera pas correctement avec des images de portrait ou des images à l'envers (merci Timmmm de l'avoir noté). La solution de Timmmm ci-dessus pourrait être le meilleur choix si cela est nécessaire et elle a également l'air plus élégante: https://stackoverflow.com/a/8914291/449918
À votre santé
la source