web-dev-qa-db-fra.com

Comment puis-je redimensionner un fichier GIF animé avec ImageMagick?

Je veux redimensionner un tel fichier GIF animé do.gif enter image description here

Si je fais convert do.gif -resize 24x24\! do-24.gif je le redimensionner dans do-24.gif mais pas animé enter image description here

Comment redimensionner correctement pour obtenir la même animation?

45
zuba

première exécution:

convert do.gif -coalesce temporary.gif

puis

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

Je cherchais une solution imagemagick car je la connais bien, mais je suis finalement allée avec la suggestion de @ sam de gifsicle ( https://www.lcdf.org/gifsicle/ ). Il a fait juste ce que je voulais, pas de soucis.

Peut optimiser la taille du fichier résultant de nombreuses façons différentes, mais j'ai simplement réduit la taille et réduit le nombre de couleurs. Travaillé comme un charme:

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

3
Peter Perháč

-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é: GIF permet à la prochaine image d'être uniquement le rectangle modifié du précédent à un décalage.

-coalesce agrandit alors tous les cadres à la taille originale, ce qui facilite le redimensionnement, mais ne recompose pas les cadres car 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)? on peut 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

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

Ensuite, si nous comparons les trois conversions:

  • out.gif: Toutes les images sont 256x256 ou plus, et sont énormes à environ 5 Mo, TODO pourquoi?

    Visuellement incorrect, car ces trames d'environ 256x256 ont un décalage autre que zéro, par exemple. 125+128 pour l'image 2!

  • out-coalesce.gif: toutes les images sont 256x256 et ont le décalage correct 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 qu'il 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.