Je cherche une sorte de méthode en nature pour obtenir un numéro de cadres GIF. Je regarde sur Google, Stackoverflow et tout autre site et je ne trouve que des ordures! Quelqu'un sait comment faire? Je n'ai besoin que d'un nombre simple de cadres GIF. P>
6 Réponses :
Quelle méthode utilisez-vous pour charger / manipuler le cadre? Utilisez-vous PIL? Si non, je suggère de vérifier: Library d'imagerie Python et spécifiquement Maintenant, en supposant que vous utilisiez PIL pour lire dans la GIF, c'est une question assez simple de déterminer quel cadre vous regardez. recherche em> ira à un cadre spécifique et dire em> retournera quel cadre vous regardez. p> sinon, je Croyez que vous ne pouvez trouver que le nombre de cadres dans le GIF en recherchant jusqu'à une exception (eoferror) étant augmenté. p> p>
Je devais changer "Importer une image" dans "de l'image d'importation de PIL" pour le faire fonctionner (je suppose que j'ai une dernière version d'oreiller installée)
Voir mon Répondre ci-dessous si vous devez charger un image d'un tableau d'octets.
Je veux juste ajouter que vous devriez pouvoir obtenir le nombre de cadres à l'aide de iM.n_frames (afin que le code ci-dessus puisse simplement utiliser une "boucle" à la place).
Paysez simplement le fichier, les gifs sont assez simples:
class GIFError(Exception): pass def get_gif_num_frames(filename): frames = 0 with open(filename, 'rb') as f: if f.read(6) not in ('GIF87a', 'GIF89a'): raise GIFError('not a valid GIF file') f.seek(4, 1) def skip_color_table(flags): if flags & 0x80: f.seek(3 << ((flags & 7) + 1), 1) flags = ord(f.read(1)) f.seek(2, 1) skip_color_table(flags) while True: block = f.read(1) if block == ';': break if block == '!': f.seek(1, 1) elif block == ',': frames += 1 f.seek(8, 1) skip_color_table(ord(f.read(1))) f.seek(1, 1) else: raise GIFError('unknown block type') while True: l = ord(f.read(1)) if not l: break f.seek(l, 1) return frames
Je suppose que cela a besoin de PIL, j'ai essayé d'utiliser ceci sur un fichier gif code> 44, et il est retourné 0 sur moi ... (J'ai compté les cadres à l'aide de la prévisualisation, mais j'ai besoin de code pour obtenir moi les informations sur plus de 2500 images) ...
@ Zizouz212: cela a fonctionné pour moi avec le fichier petit_globe.gif code> Fichier de test J'ai utilisé dans Ma réponse à une autre question à vous. Veuillez télécharger votre fichier image GIF de 44 images quelque part (comme dans l'une de vos questions), puis laissez-moi savoir afin que je puisse le télécharger et voir si je peux comprendre ce qui cause le problème.
En Python 3+, vous devez modifier les chaînes des chaînes d'octets ou les comparaisons retourneront false code>. Par exemple.
'gif87a' code> >>
b'gif87a ' code>,
' ',' code> >>
b ',' code>, etc.
J'ai été confronté au même problème récemment et j'ai trouvé la documentation sur les GIF qui manque particulièrement. Voici ma solution à l'aide de Get_Reader /a> pour lire les octets d'un image (utile si vous venez de extraire l'image via http , par exemple) qui stocke facilement des cadres dans MATRICES NUMPLY :
gif = imageio.get_reader('cat.gif')
Si vous utilisez PIL ( Bibliothèque d'imagerie Python ) Vous pouvez utiliser le n_frames code>
attribut d'un objet image. p>
voir Cette réponse . P>
OK, 9 ans peut-être sont un peu trop de temps, mais voici ma réponse
Voici un code qui vous obtiendra une liste avec la valeur de durée de chaque image dans le gif: Vous pouvez modifier le code ci-dessus pour capturer également d'autres données de chaque image telle que Index de couleur de fond, transparence ou version. Le dictionnaire info code> sur chaque image ressemble à ceci: p>