Je capture une image et la mets en vue image.
public void captureImage() {
Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
File filePhoto = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
imageUri = Uri.fromFile(filePhoto);
MyApplicationGlobal.imageUri = imageUri.getPath();
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentCamera, TAKE_PICTURE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intentFromCamera) {
super.onActivityResult(requestCode, resultCode, intentFromCamera);
if (resultCode == RESULT_OK && requestCode == TAKE_PICTURE) {
if (intentFromCamera != null) {
Bundle extras = intentFromCamera.getExtras();
if (extras.containsKey("data")) {
bitmap = (Bitmap) extras.get("data");
}
else {
bitmap = getBitmapFromUri();
}
}
else {
bitmap = getBitmapFromUri();
}
// imageView.setImageBitmap(bitmap);
imageView.setImageURI(imageUri);
}
else {
}
}
public Bitmap getBitmapFromUri() {
getContentResolver().notifyChange(imageUri, null);
ContentResolver cr = getContentResolver();
Bitmap bitmap;
try {
bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, imageUri);
return bitmap;
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
Mais le problème est que l'image sur certains appareils à chaque rotation. Par exemple, sur un appareil Samsung, cela fonctionne bien, mais sur un Sony Xperia, l'image pivote de 90 degrés et sur Toshiba Thrive (tablette) de 180 degrés.
Réponses:
La plupart des appareils photo du téléphone sont en mode paysage, ce qui signifie que si vous prenez la photo en mode portrait, les photos résultantes seront pivotées de 90 degrés. Dans ce cas, le logiciel de l'appareil photo doit remplir les données Exif avec l'orientation dans laquelle la photo doit être affichée.
Notez que la solution ci-dessous dépend du fabricant du logiciel / appareil photo de l'appareil photo qui remplit les données Exif, donc cela fonctionnera dans la plupart des cas, mais ce n'est pas une solution fiable à 100%.
Voici la
rotateImage
méthode:la source
exif.getAttributeInt
utilisationExifInterface.ORIENTATION_UNDEFINED
est presque la même, car le deuxième paramètre est la valeur par défaut au cas où la fonction ne fournirait pas la valeur.En combinant Jason Robinson « s réponse avec Felix » s réponse et remplir les pièces manquantes, voici la solution finale et complète de cette question qui fera ce qui suit après l' avoir testé sur Android Android 4.1 ( Jelly Bean ), Android 4.4 ( KitKat ) et Android 5.0 ( Lollipop ).
Pas
Réduisez l'image si elle était supérieure à 1024x1024.
Faites pivoter l'image dans le bon sens uniquement si elle a été pivotée de 90, 180 ou 270 degrés.
Recyclez l'image pivotée à des fins de mémoire.
Voici la partie code:
Appelez la méthode suivante avec le courant
Context
et l'imageURI
que vous souhaitez corrigerVoici la
CalculateInSampleSize
méthode de la source précitée :Vient ensuite la méthode qui vérifiera l'orientation actuelle de l'image pour décider de l'angle de rotation
Enfin la méthode de rotation elle-même
-N'oubliez pas de voter pour les réponses de ces gars pour leurs efforts et Shirish Herwade qui a posé cette question utile.
la source
Il est facile de détecter l'orientation de l'image et de remplacer le bitmap à l'aide de:
Pour éviter de manquer de souvenirs avec de grandes images, je vous recommande de redimensionner l'image en utilisant:
Il n'est pas possible d'utiliser ExifInterface pour obtenir l'orientation en raison d'un problème de système d'exploitation Android: https://code.google.com/p/android/issues/detail?id=19268
Et voici
calculateInSampleSize
la source
Solution en une ligne:
Ou
Cela détectera automatiquement la rotation et placera l'image dans la bonne orientation
Picasso est une bibliothèque très puissante pour gérer les images dans votre application comprend: Transformations d'images complexes avec une utilisation minimale de la mémoire.
la source
J'ai passé beaucoup de temps à chercher une solution pour cela. Et finalement réussi à le faire. N'oubliez pas de voter pour @Jason Robinson, car ma réponse est basée sur la sienne.
Donc, premièrement, vous devez savoir que depuis Android 7.0, nous devons utiliser
FileProvider
et quelque chose appeléContentUri
, sinon vous obtiendrez une erreur ennuyeuse en essayant d'invoquer votreIntent
. Voici un exemple de code:Méthode
getUriFromPath(Context, String)
basée sur la version utilisateur d'Android createFileUri (file://...)
ouContentUri (content://...)
et voilà:Une fois que
onActivityResult
vous pouvez attraper làuri
où l'image est enregistrée par la caméra, mais maintenant vous devez détecter la rotation de la caméra, ici nous utiliserons la réponse @Jason Robinson modifiée:Nous devons d'abord créer
ExifInterface
sur la baseUri
Le code ci-dessus peut être simplifié, mais je veux tout montrer. Donc, à partir de ce que
FileUri
nous pouvons créerExifInterface
sur la baseString path
, mais à partir deContentUri
nous ne pouvons pas, Android ne prend pas en charge cela.Dans ce cas, nous devons utiliser un autre constructeur basé sur
InputStream
. N'oubliez pas que ce constructeur n'est pas disponible par défaut, vous devez ajouter une bibliothèque supplémentaire:Maintenant, nous pouvons utiliser la
getExifInterface
méthode pour obtenir notre angle:Vous avez maintenant Angle pour faire pivoter correctement votre image :).
la source
activity_main.xml
MainActivity.java
la source
Vous pouvez simplement lire l'orientation du capteur de la caméra comme indiqué par Google dans la documentation: https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html
Exemple de code:
la source
Jason Robinson réponse et Sami Eltamawy réponse sont excelent.
Juste une amélioration pour terminer l'approche, vous devez utiliser compat ExifInterface.
com.android.support:exifinterface:${lastLibVersion}
Vous pourrez instancier l'ExifInterface (pior API <24) avec
InputStream
(deContentResolver
) au lieu des chemins uri en évitant les «exceptions de fichier introuvable»https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html
la source
Normalement, il est recommandé de résoudre le problème avec ExifInterface , comme l'a suggéré @Jason Robinson. Si cette approche ne fonctionne pas, vous pouvez essayer de rechercher l' orientation de la dernière image prise ...
la source
Malheureusement, la réponse @ jason-robinson ci-dessus n'a pas fonctionné pour moi.
Bien que la fonction de rotation fonctionne parfaitement:
J'ai dû faire ce qui suit pour obtenir l'orientation car l'orientation Exif était toujours 0
la source
Mieux vaut essayer de prendre la photo dans une orientation spécifique.
Pour de meilleurs résultats, donnez une orientation paysage à l'activité de la vue caméra.
la source
Si des expériences de quelqu'un avec des problèmes
ExifInterface
sur Android 4.4 (KitKat) pour obtenir l'orientation, il pourrait être à cause de mauvais chemin obtenu à partir de l'URI. Voir une solution pour propoergetPath
dans la question Stack Overflow Obtenez le chemin réel à partir de l'URI, du nouveau framework d'accès au stockage Android KitKatla source
Trouvez ci-dessous le lien cette solution est le meilleur https://www.samieltamawy.com/how-to-fix-the-camera-intent-rotated-image-in-android/
la source
La réponse sélectionnée utilise la méthode la plus courante pour répondre à cette question et à des questions similaires. Cependant, cela ne fonctionne pas avec les caméras avant et arrière de Samsung. Pour ceux qui recherchent une solution qui fonctionne à la fois avec des caméras avant et arrière pour Samsung et d'autres grands fabricants, cette réponse de nvhausid est impressionnante:
https://stackoverflow.com/a/18915443/6080472
Pour ceux qui ne veulent pas cliquer, la magie appropriée consiste à utiliser CameraInfo plutôt que de s'appuyer sur EXIF.
Code complet dans le lien.
la source
Cela va peut-être de soi, mais n'oubliez pas que vous pouvez gérer certains de ces problèmes de gestion d'image sur votre serveur. J'ai utilisé des réponses comme celles contenues dans ce fil pour gérer l'affichage immédiat de l'image. Cependant, mon application nécessite que les images soient stockées sur le serveur (c'est probablement une exigence courante si vous voulez que l'image persiste lorsque les utilisateurs changent de téléphone).
Les solutions contenues dans de nombreux threads concernant ce sujet ne traitent pas du manque de persistance des données EXIF qui ne survit pas à la compression d'image du bitmap, ce qui signifie que vous devrez faire pivoter l'image chaque fois que votre serveur la charge. Vous pouvez également envoyer les données d'orientation EXIF à votre serveur, puis y faire pivoter l'image si nécessaire.
Il était plus facile pour moi de créer une solution permanente sur un serveur car je n'avais pas à me soucier des chemins de fichiers clandestins d'Android.
la source
La solution la plus simple à ce problème:
J'enregistre l'image au format jpg.
la source
Voici la
Xamarin.Android
version:De la réponse de @Jason Robinson :
Puis
calculateInSampleSize
méthode:De la réponse de @Sami Eltamawy :
la source
Si vous utilisez Fresco, vous pouvez utiliser ceci -
Cela fait automatiquement pivoter les images en fonction des données Exif.
Source: https://frescolib.org/docs/rotation.html
la source
Le code ci-dessous a fonctionné avec moi, il a obtenu le bitmap de fileUri et fait la correction de rotation si nécessaire:
la source
Vous avez une réponse à ce problème sans utiliser ExifInterface . Nous pouvons obtenir la rotation de la caméra, soit la caméra avant ou la caméra arrière, selon ce que vous utilisez, puis lors de la création du bitmap, nous pouvons faire pivoter le bitmap à l'aide de Matrix.postRotate (degré)
Après avoir calculé la rotation, vous pouvez faire pivoter votre bitmap comme ci-dessous:
Herare bm devrait être votre bitmap.
Si vous souhaitez connaître la rotation de votre caméra avant, remplacez Camera.CameraInfo.CAMERA_FACING_BACK par Camera.CameraInfo.CAMERA_FACING_FRONT ci-dessus.
J'espère que ça aide.
la source
J'ai créé une fonction d'extension Kotlin qui simplifie l'opération pour les développeurs Kotlin basée sur la réponse de @Jason Robinson. J'espère que ça aide.
la source
Il existe une commande plus simple pour corriger cette erreur.
Ajoutez simplement après votreImageView.setBitmap (bitmap); ce yourImageView.setRotation (90);
Cette mine fixe. J'espère que cela aide !
la source
cela a fonctionné pour moi
la source