51 votes

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

Je souhaite redimensionner un tel fichier GIF animé faire.gif enter image description here

Si je le fais convert do.gif -resize 24x24\! do-24.gif Je le redimensionne en do-24.gif mais pas animée enter image description here

Comment le redimensionner correctement pour obtenir la même animation ?

61voto

phipsalabim Points 2560

Première manche :

convert do.gif -coalesce temporary.gif

puis

convert -size <original size> temporary.gif -resize 24x24 smaller.gif

14voto

Peter Perháč Points 279

Je cherchais la solution d'imagemagick car je la connais bien, mais j'ai finalement opté pour la suggestion de @sam, à savoir gifsicle . Il a fait exactement ce que je voulais, sans problème.

Il est possible d'optimiser la taille du fichier résultant de bien des façons, mais j'ai choisi de réduire la taille et le nombre de couleurs. Cela a fonctionné comme un charme :

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif

7voto

-coalesce + -deconstruct

Après -coalesce il est probable que vous souhaitiez ajouter un -deconstruct :

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

La cause première du problème est que votre GIF d'entrée a été correctement minimisé : Le GIF permet à l'image suivante d'être juste le rectangle modifié de l'image précédente avec un décalage.

-coalesce étend ensuite toutes les images à la taille d'origine, ce qui permet le redimensionnement, mais ne recompresse pas les images comme votre image d'entrée : -deconstruct est nécessaire pour cela !

En utilisant les 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

enter image description here

out-coalesce.gif

enter image description here

out-deconstruct.gif

enter image description here

Tout d'abord, nous verrons comment introduire un fichier, out-convert.gif a en fait été compressée, puisque la trame 2 n'est que 516x516 à l'offset 252+257 tandis que le cadre de taille normale 1 est 1024x1024 .

Ensuite, si l'on compare les trois conversions :

  • out.gif : Tous les cadres sont 256x256 ou plus grand, et énorme à environ 5MiB, TODO pourquoi ?

    Visuellement incorrecte, puisque ces environ 256x256 ont un décalage non nul, par exemple 125+128 pour le cadre 2 !

  • out-coalesce.gif : tous les cadres sont 256x256 et avoir le bon décalage 0+0 .

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

  • out-deconstruct.gif : images compressées, taille de la sortie finale 1.9 MiB.

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

ffmpeg et gifsicle

J'ai également 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 un résultat encore plus petit et correct de 1,5 MiB.

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

TODO : pourquoi ne peuvent-ils pas le rendre plus petit que convert ? Sélectionnent-ils simplement de meilleurs rectangles de diff plus minimes, ou autre chose ?

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

0voto

Mona Abdelmajeed Points 433
wget https://upload.wikimedia.org/wikipedia/commons/f/f9/STS-132_Liftoff_Space_Shuttle_Atlantis.ogv
ffmpeg -i STS-132_Liftoff_Space_Shuttle_Atlantis.ogv -r 15 -vf scale=512:-1 \
 -ss 00:00:17 -to 00:00:22 STS-132_Liftoff_Space_Shuttle_Atlantis.gif

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X