Comment puis-je redimensionner un fichier GIF animé à l'aide d'ImageMagick?

46

Je veux redimensionner un tel fichier GIF animé do.gif entrez la description de l'image ici

Si je le fais convert do.gif -resize 24x24\! do-24.gifje le redimensionner en do-24.gif mais pas animéentrez la description de l'image ici

Comment redimensionner correctement pour obtenir la même animation?

zuba
la source

Réponses:

56

première exécution:

convert do.gif -coalesce temporary.gif

ensuite

convert -size <original size> temporary.gif -resize 24x24 smaller.gif
phipsalabim
la source
2
-coalesce"crée une vue complète de l'animation à chaque point, un peu comme une vraie bande de film, plutôt qu'une séquence d'animation. Une telle séquence, appelée Animation coalescée, est beaucoup plus facile à étudier, à éditer, à modifier et à réoptimiser."
Sam
28
gifsicle --resize 24x24 > do-24.gifpeut à cela aussi
sam
2
Notez que la vue fusionnée est beaucoup plus grande que la vue optimisée (3,2 fois dans mon test) et que le redimensionnement produit une image fusionnée, qui peut également être plus grande que la taille originale du fichier (2,3 fois dans mon test), même si la résolution est plus petit. Lorsque j'essaie de redimensionner directement, il a l'air bien et a une petite taille de fichier, même si cela fonctionne peut-être pour cette image.
endolith
1
gifsicle a produit une sortie bien meilleure et optimisée pour mon cas d'utilisation. Merci @sam!
sj26
4
convert temporaire.gif -resize 24x24 smaller.gif fonctionne pour moi., sans spécifier la taille de l'entrée.
AMB
5

Je cherchais une solution imagemagick car je la connais bien, mais je suis finalement allé avec la suggestion de @ sam gifsicle. Il a fait juste ce que je voulais, pas de soucis.

Peut optimiser la taille du fichier résultant à bien des égards, mais j’ai simplement choisi de réduire la taille et le nombre de couleurs. Travaillé comme un charme:

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
Peter Perháč
la source
3

-coalesce + -deconstruct

Après -coalesce, vous voudrez probablement ajouter un -deconstruct:

convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif

La cause première du problème réside dans le fait que votre GIF en entrée a été correctement minimisé: il permet à la prochaine image d'être uniquement le rectangle modifié du précédent par un décalage.

-coalesceétend ensuite tous les cadres à la taille originale, ce qui facilite le redimensionnement, mais ne recompose pas les cadres à nouveau comme image d'entrée: elle -deconstructest nécessaire pour cela!

Utilisation des données de test de cette réponse: Comment créer un gif animé à partir d’images fixes (de préférence avec la ligne de commande)? nous pouvons le voir clairement avec identify:

$ identify out-convert.gif | head -n 3
out-convert.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.020u 0:00.019
out-convert.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
out-convert.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019

$ convert out-convert.gif -resize 256x out.gif
$ identify out.gif | head -n 3
out.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[1] GIF 256x256 256x256+125+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[2] GIF 256x258 256x256+123+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x out-coalesce.gif
$ identify out-coalesce.gif | head -n 3
out-coalesce.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[1] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[2] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
$ identify out-deconstruct.gif | head -n 3
out-deconstruct.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[1] GIF 135x135 256x256+60+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[2] GIF 135x136 256x256+59+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010

out.gif

entrez la description de l'image ici

out-coalesce.gif

entrez la description de l'image ici

out-deconstruct.gif

entrez la description de l'image ici

Premièrement, nous voyons comment entrer le fichier, out-convert.gifétait en fait compressé, car l’image 2 n’est que 516x516décalée 252+257, alors que l’image 1 de taille normale l’est 1024x1024.

Ensuite, si nous comparons les trois conversions:

  • out.gif: Tous les cadres sont 256x256ou plus grandes, et énorme à environ 5 Mo, TODO pourquoi?

    Visuellement incorrect, car ces 256x256trames environ ont un décalage non nul, par exemple 125+128pour la trame 2!

  • out-coalesce.gif: toutes les images sont 256x256et ont le bon décalage 0+0.

    La sortie est visuellement correcte, mais la taille du fichier de sortie est de 2,0 Mo, ce qui est supérieur à out-deconstruct.gif

  • out-deconstruct.gif: images compressées, taille de sortie finale de 1,9 Mio.

    Pas beaucoup plus petit que out-coalesce.gif, mais je pense que c'est simplement parce que le sol noir compresse très bien, et cela pourrait être très important en général.

ffmpeg et gifsicle

J'ai aussi essayé les commandes suivantes:

ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif

et les deux ont produit une sortie encore plus petite de 1,5 Mio correctement recherchée.

Voir aussi: Comment créer un gif animé à partir d'images fixes (de préférence avec la ligne de commande)?

TODO: pourquoi peuvent-ils le rendre plus petit que convert? Sont-ils simplement en train de sélectionner des rectangles de diff plus minimes ou mieux?

Testé sous Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8.

Ciro Santilli 改造 中心 六四 事件
la source