Moustikitos / tyf

Manipulate EXIF and IFD metadata.
19 stars 8 forks source link

Unable to open tif file on Linux but works on Windows #1

Closed domlysz closed 8 years ago

domlysz commented 8 years ago

Salut,

Ce problème n'apparait que sur une machine linux, le même fichier se lit correctement sur windows.

Ci-dessous le message d'erreur:

File "/usr/local/lib/python3.4/dist-packages/Tyf/__init__.py", line 58, in _read_IFD typ = TYPES[typ][0] KeyError: 0

Dispo si besoin d'infos complémentaires

Merci

Moustikitos commented 8 years ago

Salut,

tu as eu ce problème en chargeant quel fichier ? (si tu pouvais me l'envoyer) As-tu essayé sur linux avec une autre image ?

merci

domlysz commented 8 years ago

En PJ, 3 fichiers tests sur une bande, tous ont fonctionnés sous windows. J'ai essayé d'autre type de fichier sous linux (RGBA notamment) mais j'obtiens toujours la même erreur.

gtiff.zip

Moustikitos commented 8 years ago

essaye en remplaçant la ligne 58 : _typ = TYPES[typ][0] par : _typ = TYPES.get(typ, ("H", "UBYTE"))[0]

domlysz commented 8 years ago

ça passe pour cette ligne mais j'ai une nouvelle erreur à la 71

value, = struct.unpack(byteorder+"L", data) struct.error: unpack requires a bytes object of length 4

Moustikitos commented 8 years ago

Si tu utilises directement la fonction _read_IFD ou la fonction from_buffer, fileobj doit être un fichier ouvert en mode "rb".

domlysz commented 8 years ago

Je passe par la fonction open donc le fichier est bien ouvert en mode rb

Moustikitos commented 8 years ago

Je pense que le tag est mal écrit dans le fichier, insère après la ligne 53: print(tag, typ, count) que je puisse voir ce qui et lu...

Moustikitos commented 8 years ago

J'ai fais quelques test et il me semble que c'est un bug de python sur linux 64.

sur Windows 32 et 64 bits ça fonctionne sur linux 32 ça fonctionne sur linux 64 ça reproduit la même erreur

Essaye avec la version 3.5 de python sur Linux

domlysz commented 8 years ago

Bon, j'ai testé sur une version 2.7 et une 3.5 mais toujours la même erreur.

print(tag, typ, count) me renvoi

256 3 1 1 0 170

il plante à la deuxième itération

domlysz commented 8 years ago

Je ne sais pas si ça peut aider, mais je n'ai aucun problème de lecture avec piexif et exifread.

Le 1er projet ne permet pas de lire les geotags (pas de support du type "double") en revanche pour le second, il y a une pull request intéressante "Use struct for all packing/unpacking", du coup j'arrive à lire les geotags en les ajoutant dans la list des exifs

Moustikitos commented 8 years ago

Je pense avoir trouvé la solution. essaye en remplaçant la ligne 55 : data = fileobj.read(struct.calcsize("L")) par : data = fileobj.read(struct.calcsize("=L"))

Le fait d'ajouter le signe '=' impose à python d'utiliser les normes de 'sizeof' du compilateur C (et du coup non liées à la plateforme).

domlysz commented 8 years ago

Super ça fonctionne avec cette modif !

Merci beaucoup pour le support