IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Déploiement/Installation Python Discussion :

Problème avec py3exiv2 pour créer le tag Exif.Image.XPAuthor


Sujet :

Déploiement/Installation Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2013
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Problème avec py3exiv2 pour créer le tag Exif.Image.XPAuthor
    Bonjour,

    Avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        metadata = pyexiv2.ImageMetadata(file)
        metadata.read()
        # Exif
        metadata['Exif.Image.Artist'] = theAuthor
        metadata['Exif.Image.Copyright'] = theCopyright
        print(type(theAuthor))
        print(type(theAuthor.encode()))
        print (theAuthor)
        str= bytes(theAuthor, 'utf-8')
        metadata['Exif.Image.XPAuthor'] = pyexiv2.ExifTag('Exif.Image.XPAuthor', theAuthor.encode('ascii'))
        # metadata['Exif.Image.XPAuthor'] = pyexiv2.ExifTag('Exif.Image.XPAuthor', str)
        # metadata['Exif.Image.XPAuthor'] = pyexiv2.ExifTag('Exif.Image.XPAuthor', theAuthor.encode())
        #metadata['Exif.Image.XPAuthor'] = theAuthor
    j'ai le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ ./setCopyright.py -a 'Prenom Auteur' -y 2000  -p Paris X.jpg
    <class 'str'>
    <class 'bytes'>
    Prenom Auteur
    Traceback (most recent call last):
      File "./setCopyright.py", line 91, in <module>
        metadata['Exif.Image.XPAuthor'] = pyexiv2.ExifTag('Exif.Image.XPAuthor', theAuthor.encode('ascii'))
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/exif.py", line 103, in __init__
        self._set_value(value)
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/exif.py", line 212, in _set_value
        self.raw_value = self._convert_to_string(value)
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/exif.py", line 175, in _set_raw_value
        self._tag._setRawValue(value)
    ValueError: Invalid value
    $
    Les lignes de code en commentaire sont des essais (désespérés...) qui donnent un résultat identique.
    alors que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat exiv2.prm
    set Exif.Image.XPAuthor Ascii prenom et nom de l auteur
    $ exiv2 -m exiv2.prm X.jpg 
    $ exiv2 -p a pr X.jpg | grep auteur
    Exif.Image.XPAuthor                          Ascii      26  prenom et nom de l auteur
    Il semblerait que le module pyexiv2 soit concerné comme semble l'indiquer le dump.
    A moins qu'il ne s'agisse d'un autre format que je n'ai pas repéré.

    Si vous avez une idée ....
    Merci de votre aide.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2013
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Il semble que le problème soit récurrent pour d'autres tags.
    Ainsi tous ceux qui sont en commentaires ci-dessous ont provoqué le même type d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        metadata['Exif.Image.ImageDescription'] = theComment
        metadata['Exif.Photo.UserComment'] = theComment
        #metadata['Exif.Image.XPTitle'] = theComment.encode('ascii')
        #metadata['Exif.Image.XPComment'] = theComment
        metadata['Xmp.dc.subject'] = [theComment]
        metadata['Xmp.dc.title'] = {'ascii': theComment}
        metadata['Xmp.dc.description'] = theComment
        metadata['Iptc.Application2.Caption'] = [theComment]
        metadata['Iptc.Application2.ObjectName'] = [theComment]
    l'erreur est à nouveau (avec ou sans encode('ascii') :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ ./setComment.py -c 'Photo de test' X.jpg 
    Traceback (most recent call last):
      File "./setComment.py", line 78, in <module>
        metadata['Exif.Image.XPTitle'] = theComment.encode('ascii')
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/metadata.py", line 330, in __setitem__
        return getattr(self, '_set_%s_tag' % family)(key, tag_or_value)
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/metadata.py", line 263, in _set_exif_tag
        tag = ExifTag(key, tag_or_value)
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/exif.py", line 103, in __init__
        self._set_value(value)
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/exif.py", line 212, in _set_value
        self.raw_value = self._convert_to_string(value)
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/exif.py", line 175, in _set_raw_value
        self._tag._setRawValue(value)
    ValueError: Invalid value
    $

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    L'erreur n'est pas levée par pyexiv2 mais par libexiv2 et cela concerne tous les tags Exif.Image.XP... dont l'encodage n'est pas prit en charge par la librairie elle-même.

    Ces tags doivent être encodés UCS2 soit utf-16 en Python mais ce n'est pas suffisant.

    Il y a abondamment de discussions sur le sujet depuis de nombreuses années, certains ayant une solution en encodant d'abord le texte dans un éditeur sous Windows [0] tandis que d'autres demandent aux développeurs d'exiv2 de mettre ces tags en read-only.

    C'est une limitation de la lib, je suppose que exiv2, le front-end, implémente le code qu'il faut pour encoder convenablement la chaîne de texte.

    [0] http://dev.exiv2.org/boards/3/topics/530

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2013
    Messages : 21
    Points : 11
    Points
    11
    Par défaut même aevc utf-16
    Malheureusement, coder en utf-16 n'est pas la solution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    metadata['Exif.Image.XPComment'] = theComment.encode('utf-16')
    Provoque les mêmes erreurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ ./setComment.py -c 'Photo de test' X.jpg 
    1114111
    Traceback (most recent call last):
      File "./setComment.py", line 79, in <module>
        metadata['Exif.Image.XPTitle'] = theComment.encode('utf-16')
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/metadata.py", line 330, in __setitem__
        return getattr(self, '_set_%s_tag' % family)(key, tag_or_value)
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/metadata.py", line 263, in _set_exif_tag
        tag = ExifTag(key, tag_or_value)
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/exif.py", line 103, in __init__
        self._set_value(value)
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/exif.py", line 212, in _set_value
        self.raw_value = self._convert_to_string(value)
      File "/usr/local/lib/python3.7/site-packages/pyexiv2/exif.py", line 175, in _set_raw_value
        self._tag._setRawValue(value)
    ValueError: Invalid value
    L'UTF-16 ne doit pas être confondu avec l'UCS-2 qui est le codage, plus simple, de chaque caractère sur deux octets.
    Et apparemment, même si l'on reste dans les limites indiquees sur la page wikipedia :
    https://fr.wikipedia.org/wiki/UTF-16
    Il semble qu'il y ait une différence entre les bytes provenant de utf-16 et ceux de UCS-4 par exemple (UCS-2 étant considéré comme obsolète)
    Raison pour laquelle le problème demeure.
    Je continue à chercher....


    PS: Et le problème semble récurrent depuis 8 ans !!!

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Ben oui, comme je l'ai dit, convertir en utf-16 n'est pas suffisant.

    J'ai vérifié le code source du front-end et il implémente effectivement cet encodage en utilisant MultiByteToWideChar() qui provient de <windows.h>

    Si ça t'intéresse, c'est là exiv2/trunk/src/convert.cpp

    Ceci dit, qui utilise ces tags ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2013
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Fin de l'aventure ....
    Ben moi ..... jusqu'à présent.
    Et puis j'aime bien ne pas laisser de choses de côté.
    J'ai essayé toute sorte de conversions, y compris une tentative en python vers le format indiqué dans un post sur le sujet http://dev.exiv2.org/boards/3/topics/530.
    Ce matin matin, je n'avais pas encore lu ta réponse et je suis parti dans les sources de exiv2
    J'ai aussi retrouvé les sources de exiv2 ce matin et la fonction bool utf8ToUcs2le(std::string& str) ==> bool mb2wc(UINT cp, std::string& str)
    ==> int len = MultiByteToWideChar(cp, 0, str.c_str(), (int)str.size(), 0, 0); et j'ai dû m'arrêter là car il y a un include de windows.h dans lequel il y a sans doute référence à cette dernière fonction car je ne l'ai pas trouvé dans les sources ni les include.
    D'ailleurs il n'y a pas de windows.h dans les fichiers source de exiv2.

    Donc je suis contraint de m'arrêter là.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/09/2015, 10h11
  2. Réponses: 1
    Dernier message: 22/12/2005, 09h39
  3. problème avec strtok pour récupérer les vides
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 02/06/2005, 20h08
  4. Réponses: 5
    Dernier message: 27/08/2003, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo