11
votes

Python, comment je peux obtenir des cadres gif

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.


0 commentaires

6 Réponses :


20
votes

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 La page PIL GIF .

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 ira à un cadre spécifique et dire retournera quel cadre vous regardez. xxx

sinon, je Croyez que vous ne pouvez trouver que le nombre de cadres dans le GIF en recherchant jusqu'à une exception (eoferror) étant augmenté.


3 commentaires

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).



13
votes

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


3 commentaires

Je suppose que cela a besoin de PIL, j'ai essayé d'utiliser ceci sur un fichier gif 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 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 . Par exemple. 'gif87a' >> b'gif87a ', ' ',' >> b ',' , etc.



4
votes

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')


0 commentaires

1
votes

Si vous utilisez PIL ( Bibliothèque d'imagerie Python ) Vous pouvez utiliser le n_frames attribut d'un objet image.

voir Cette réponse .


0 commentaires

1
votes

OK, 9 ans peut-être sont un peu trop de temps, mais voici ma réponse xxx


0 commentaires

0
votes

Voici un code qui vous obtiendra une liste avec la valeur de durée de chaque image dans le gif: xxx

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 sur chaque image ressemble à ceci: xxx


0 commentaires