2017-07-01 6 views
1

J'ai fait une application qui prend des photos (portrait, paysage ou selfie) en utilisant le Google Camera2 sample, tout fonctionne, je peux prendre les photos, ils sont sauvés, etc.pcitures Android camera2 semblent tournés dans la galerie

Mais quand J'ouvre la galerie (Samsung S7) de mon téléphone puis tous les selfies et les portraits sont pivotés à 90 degrés. Les images de paysage sont bien cependant. J'ai vu beaucoup de post sur comment lire images dans la bonne orientation, mais qu'en est-il de les enregistrer correctement? J'ai ma propre galerie dans mon application et là les images sont chargées correctement (en utilisant Glide) sans aucune fixation de rotation spéciale, donc je ne suis pas sûr de ce que j'ai fait de mal et le plus important, comment puis-je résoudre ce problème?

+0

Tirez l'une des images hors de votre appareil et d'examiner en utilisant 'exiftool' ou quelque chose. Vous pouvez également mélanger du code qui utilise l'édition 'com.android.support: exifinterface' de' ExifInterface'. Dans les deux cas, vous cherchez à voir s'il existe une balise EXIF ​​d'orientation avec la valeur attendue. Si tel est le cas, le problème n'est pas de sauvegarder l'image, mais un bogue dans l'application de la galerie que vous utilisez. Nous vous invitons à essayer de faire pivoter l'image manuellement avant de l'enregistrer (et de supprimer la balise d'orientation), mais vous n'avez peut-être pas assez d'espace pour le faire. – CommonsWare

+0

Si, OTOH, cette balise est manquante, alors il y a peut-être quelque chose qui ne va pas dans la façon dont vous sauvegardez l'image, et cela nécessiterait un [mcve]. – CommonsWare

+0

J'ai couru exiftool sur l'un des selfies et je reçois une orientation Tag: 'Rotate 270 CW'. Donc je suppose que c'est quelque chose qui ne va pas avec la galerie? – barouf

Répondre

0

Une visionneuse d'image est censée examiner l'étiquette EXIF ​​et faire pivoter l'image en fonction de l'étiquette d'orientation. Cela permet aux applications d'appareil photo et aux logiciels similaires de sauvegarder les images dans n'importe quelle orientation, sans avoir à faire pivoter l'image avant de l'enregistrer.

Les bibliothèques comme Glide et Picasso fera pour vous, si vous leur donnez accès à la pleine JPEG (par exemple, fileUri, contentUri, https URL). C'est parce qu'ils ont accès à la fois les étiquettes EXIF ​​et le ImageView résultant, et ainsi ils peuvent dire le ImageView pour faire pivoter l'image.

Cependant, tout le monde n'utilise pas de telles bibliothèques. ImageView à lui seul traite des choses comme Bitmap, où ces étiquettes EXIF ​​ont été perdues dans le processus de décodage.

Vous, comme l'auteur d'une application de la caméra, ont deux principales options ici:

  1. Vous pouvez examiner les balises EXIF, voir que l'image doit être tournée, faites tourner vous-même, et enregistrez le rotation de l'image (suppression de l'étiquette d'orientation mais organisation pour retenir les autres). Cependant, cela peut échouer avec un , en particulier pour les images d'appareil photo, car ces images ont tendance à être grandes.

  2. Vous pourriez hausser les épaules et passer à autre chose, car ce n'est vraiment pas votre problème. Comme vous le constatez, les autres applications de galerie ne présentent pas le problème, car elles ont été testées correctement et l'application de galerie d'origine que vous avez essayée ne l'a pas été.

Si vous allez avec l'option # 1, il se transforme en option # 2 si vous obtenez le OutOfMemoryError.

+0

Je tiens à mentionner également que, même avec l'option 1, il semble que cela diffère d'un téléphone à l'autre car les fabricants semblent enregistrer des images de différentes manières. Je pense que je vais juste ignorer alors. Merci de votre aide! – barouf

+0

@barouf: "il semble que cela diffère d'un téléphone à l'autre car les fabricants semblent enregistrer des images de différentes manières" - oh, absolument. D'après ce que j'ai vu, je pense que c'est lié au chipset de l'appareil photo autant qu'autre chose. Certains vont faire pivoter l'image pour vous. D'autres viennent de définir la balise EXIF. Quelques-uns seront bogués et ne feront ni l'un ni l'autre, et vous êtes obligé d'essayer d'utiliser des capteurs pour déterminer comment l'appareil était tenu à ce moment-là. – CommonsWare

+0

En choisissant l'option 1, vous n'avez pas nécessairement besoin d'examiner EXIF. Votre application contrôlant la capture, vous avez accès aux capteurs d'orientation, et parfois cela peut aider. –

1

Utilisez-vous le contrôle JPEG_ORIENTATION dans votre demande de capture d'images fixes? Si ce n'est pas le cas, c'est peut-être le problème - ce contrôle indique à l'appareil photo comment faire pivoter l'image JPEG finale pour qu'elle soit à droite.

Vous devez donc mettre à jour la valeur de ce contrôle pour décrire la façon dont le capteur d'image s'aligne actuellement par rapport au monde.

Pour faire ce calcul, vous aurez besoin d'entrée de l'accéléromètre (qui vous indique dans quel sens est vers le bas), puis un peu de mathématiques de base - reproduisant ce à partir du lien ci-dessus:

private int getJpegOrientation(CameraCharacteristics c, int deviceOrientation) { 
    if (deviceOrientation == android.view.OrientationEventListener.ORIENTATION_UNKNOWN) return 0; 
    int sensorOrientation = c.get(CameraCharacteristics.SENSOR_ORIENTATION); 

    // Round device orientation to a multiple of 90 
    deviceOrientation = (deviceOrientation + 45)/90 * 90; 

    // Reverse device orientation for front-facing cameras 
    boolean facingFront = c.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT; 
    if (facingFront) deviceOrientation = -deviceOrientation; 

    // Calculate desired JPEG orientation relative to camera orientation to make 
    // the image upright relative to the device orientation 
    int jpegOrientation = (sensorOrientation + deviceOrientation + 360) % 360; 

    return jpegOrientation; 
} 

où l'entrée deviceOrientation provient de l'API des capteurs.