45 votes

Rotation d'une image avec l'orientation spécifiée dans l'EXIF en utilisant Python sans PIL y compris la vignette

J'ai le scénario suivant :

  • J'envoie une image de l'iPhone avec les informations EXIF à mon serveur de socket Pyhon.
  • J'ai besoin que l'image soit correctement orientée en fonction de l'orientation réelle au moment où l'image a été prise. Je sais qu'IOS enregistre toujours l'image en tant que paysage à gauche et ajoute l'orientation réelle comme champ EXIF (EXIF.Image.Orientation).
  • Je lis le champ EXIF pour voir l'orientation réelle. Puis je fais pivoter l'image à l'aide de wxpython pour obtenir l'orientation correcte.

J'utilise pyexiv2 pour la manipulation des données EXIF.

Problème : Les informations EXIF, y compris les vignettes, sont perdues lors de la rotation de l'image à l'aide de wxpython.

Ce que j'ai fait : Je lis l'EXIF avant de faire pivoter l'image. Je réinitialise le champ d'orientation dans l'EXIF. Puis je le remets en place après la rotation.

Le problème :

La vignette à l'intérieur de l'EXIF n'est pas tournée. Ainsi, l'image et la vignette ont des orientations différentes.

Des questions ?

Existe-t-il un module autre que PIL pour faire pivoter une image en conservant ses informations EXIF ?

Existe-t-il un champ EXIF distinct pour l'orientation des vignettes ?

Existe-t-il un moyen de faire pivoter la vignette seule ?

Merci pour votre aide...

0voto

user136036 Points 101

Puisqu'il s'agit de la réponse la plus fréquente à la question "python exif rotate", j'aimerais ajouter un addendum. dans le cas où vous n'avez besoin que de la valeur de rotation et non de faire tourner l'image par PIL - dans mon cas, j'ai utilisé QPixmap pour faire pivoter l'image sur un QGraphicsView, donc je n'avais besoin que de l'angle pour la transformation QPixmap.
Le site réponse ci-dessus en utilisant Le LIP pour obtenir l'exif est plutôt lent . Dans mon essai, il a pris 6x plus de temps que le piexif (6 ms contre 1 ms) parce que la création/ouverture de la bibliothèque PIL.Image prend beaucoup de temps. Je recommande donc d'utiliser piexif dans ce cas.

import piexif

def get_exif_rotation_angle(picture)

    exif_dict = piexif.load(picture)
    if piexif.ImageIFD.Orientation in exif_dict["0th"]:
        orientation = exif_dict["0th"][piexif.ImageIFD.Orientation]
        if orientation == 3:
            return 180
        elif orientation == 6:
            return 90
        elif orientation == 8:
            return 270
        else:
            return None
    else:
        return None

picture peut être chemin d'accès au fichier ou objet octets.

Réf : https://piexif.readthedocs.io/en/latest/sample.html#rotate-image-by-exif-orientation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X