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

Calcul scientifique Python Discussion :

Agrandir les dimensions d'une image Gif animé à l'aide de Pillow ou autre


Sujet :

Calcul scientifique Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2020
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Agrandir les dimensions d'une image Gif animé à l'aide de Pillow ou autre
    Bonjour,

    Je cherche depuis pas mal de temps un moyen de changer les dimensions d'une image gif animé, j'ai déjà trouvé des sources sur internet mais je n'arrive pas à agrandir cette fameuse image.

    Pour le script qui s'en rapproche le plus j'ai trouvé celui ci :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    from PIL import Image, ImageTk
     
    def resize_gif(path, save_as=None, resize_to=None):
        """
        Resizes the GIF to a given length:
     
        Args:
            path: the path to the GIF file
            save_as (optional): Path of the resized gif. If not set, the original gif will be overwritten.
            resize_to (optional): new size of the gif. Format: (int, int). If not set, the original GIF will be resized to
                                  half of its size.
        """
        all_frames = extract_and_resize_frames(path, resize_to)
     
        if not save_as:
            save_as = path
     
        if len(all_frames) == 1:
            print("Warning: only 1 frame found")
            all_frames[0].save(save_as, optimize=True)
        else:
            all_frames[0].save(save_as, optimize=True, save_all=True, append_images=all_frames[1:], loop=1000)
     
     
    def analyseImage(path):
        """
        Pre-process pass over the image to determine the mode (full or additive).
        Necessary as assessing single frames isn't reliable. Need to know the mode
        before processing all frames.
        """
        im = Image.open(path)
        results = {
            'size': im.size,
            'mode': 'full',
        }
        try:
            while True:
                if im.tile:
                    tile = im.tile[0]
                    update_region = tile[1]
                    update_region_dimensions = update_region[2:]
                    if update_region_dimensions != im.size:
                        results['mode'] = 'partial'
                        break
                im.seek(im.tell() + 1)
        except EOFError:
            pass
        return results
     
     
    def extract_and_resize_frames(path, resize_to=None):
        """
        Iterate the GIF, extracting each frame and resizing them
     
        Returns:
            An array of all frames
        """
        mode = analyseImage(path)['mode']
     
        im = Image.open(path)
     
        if not resize_to:
            resize_to = (im.size[0] // 2, im.size[1] // 2)
     
        i = 0
        p = im.getpalette()
        last_frame = im.convert('RGBA')
     
        all_frames = []
     
        try:
            while True:
                # print("saving %s (%s) frame %d, %s %s" % (path, mode, i, im.size, im.tile))
     
                '''
                If the GIF uses local colour tables, each frame will have its own palette.
                If not, we need to apply the global palette to the new frame.
                '''
                if not im.getpalette():
                    im.putpalette(p)
     
                new_frame = Image.new('RGBA', im.size)
     
                '''
                Is this file a "partial"-mode GIF where frames update a region of a different size to the entire image?
                If so, we need to construct the new frame by pasting it on top of the preceding frames.
                '''
                if mode == 'partial':
                    new_frame.paste(last_frame)
     
                new_frame.paste(im, (0, 0), im.convert('RGBA'))
     
                new_frame.thumbnail(resize_to, Image.ANTIALIAS)
                all_frames.append(new_frame)
     
                i += 1
                last_frame = new_frame
                im.seek(im.tell() + 1)
        except EOFError:
            pass
     
        return all_frames
    Ce code me permet de diminuer les dimensions mais malheureusement, je n'arrive pas à agrandir l'image davantage que ses dimensions initiales, si j'ai bien compris, la redimension de chaque frame se trouve dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new_frame.thumbnail(resize_to, Image.ANTIALIAS)
    , ma question est donc ; est ce impossible de mettre des dimensions plus élevés que celles de bases?

    Cordialement

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Bonjour,

    lors de tes recherches, es-tu tombé sur ce lien ?

    Resize GIF animation, pil/imagemagick, python

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2020
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Oui j'ai à peu près fait le tour, quand j'essayais avec Images2Gif ça me renvoyait une erreur, je vais y re jeter un coup d’œil

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2020
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    L'erreur que j'ai lorsque j'utilise images2gif est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        images2gif.writeGif(temp_path, frames)
      File "/images2gif.py", line 575, in writeGif
        images, xy, images_info = gifWriter.handleSubRectangles(images, subRectangles)
      File "/images2gif.py", line 298, in handleSubRectangles
        images, xy = self.getSubRectangles(images)
      File "/images2gif.py", line 335, in getSubRectangles
        diff = np.abs(im-prev)
    ValueError: operands could not be broadcast together with shapes (21,100,4) (21,100,3)
    J'ai essayé de redimensionner une image animé avec les dimensions du code de base (100,100) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                temp_path = path[:-4]+"_temp"+path[-4:]
                frames = images2gif.readGif(path,False)
                for frame in frames:
                    frame.thumbnail((100,100), Image.ANTIALIAS)
     
                images2gif.writeGif(temp_path, frames)
                im = Image.open(temp_path)
    L'erreur viendrait de l'écriture du fichier

    Si quelqu'un a une solution je suis preneur

Discussions similaires

  1. comment récupérer les dimensions d'une image
    Par sirius25 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 07/08/2006, 15h47
  2. [ImageMagick] Obtenir les dimensions d'une image externe?
    Par Death83 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 31/01/2006, 09h57
  3. [Image] Connaitre les dimensions d'une image sans la charger
    Par FredN dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 16/01/2006, 12h06

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