Wie kann ich mit ImageMagick die Größe einer animierten GIF-Datei ändern?

46

Ich möchte die Größe einer solchen animierten GIF-Datei ändern Bildbeschreibung hier eingeben

In diesem convert do.gif -resize 24x24\! do-24.gifFall wird die Größe in do-24.gif geändert, aber nicht animiertBildbeschreibung hier eingeben

Wie kann man die Größe richtig ändern, um die gleiche Animation zu erhalten?

zuba
quelle

Antworten:

56

erster Lauf:

convert do.gif -coalesce temporary.gif

dann

convert -size <original size> temporary.gif -resize 24x24 smaller.gif
Phipsalabim
quelle
2
-coalesce"Erzeugt an jedem Punkt eine vollständige Ansicht der Animation, ein bisschen wie ein echter Filmstreifen, anstatt einer Animationssequenz. Eine solche Sequenz, die als" Coalesced Animation "bezeichnet wird, ist viel einfacher zu studieren, zu bearbeiten, zu modifizieren und neu zu optimieren."
Sam
28
gifsicle --resize 24x24 > do-24.gifkann auch dazu
sam
2
Beachten Sie, dass die verschmolzene Ansicht viel größer ist als die optimierte (3,2-fach in meinem Test), und die Größenänderung ein verschmolzenes Bild erzeugt, das auch bei einer Auflösung größer sein kann als das Original in der Dateigröße (2,3-fach in meinem Test) ist kleiner. Wenn ich versuche, die Größe direkt zu ändern, sieht es gut aus und hat eine kleine Dateigröße, obwohl es vielleicht nur für dieses Bild funktioniert.
Endolith
1
Gifsicle lieferte eine viel bessere, optimierte Ausgabe für meinen Anwendungsfall. Vielen Dank @sam!
SJ26
4
temporäres.gif konvertieren - Größe 24x24 kleiner.gif funktioniert bei mir ohne Angabe der Eingabegröße.
AMB
3

-coalesce + -deconstruct

Danach -coalescemöchten Sie wahrscheinlich Folgendes hinzufügen -deconstruct:

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

Die Hauptursache für das Problem ist, dass Ihr Eingabe-GIF ordnungsgemäß minimiert wurde: Mit GIF kann der nächste Frame nur das geänderte Rechteck des vorherigen Frame mit einem Versatz sein.

-coalesceDann werden alle Frames auf die ursprüngliche Größe vergrößert, wodurch die Größenänderung funktioniert. Die Frames werden jedoch nicht erneut komprimiert, da Ihr Eingabebild dies -deconstructerfordert.

Verwenden der Testdaten aus dieser Antwort: Wie erstelle ich ein animiertes GIF aus Standbildern (vorzugsweise mit der Befehlszeile)? wir können dies deutlich sehen mit 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

Bildbeschreibung hier eingeben

out-coalesce.gif

Bildbeschreibung hier eingeben

out-deconstruct.gif

Bildbeschreibung hier eingeben

Zuerst sehen wir, wie man eine Datei eingibt, die out-convert.giftatsächlich komprimiert wurde, da Frame 2 nur 516x516versetzt ist 252+257, während Frame 1 in voller Größe ist 1024x1024.

Dann, wenn wir die drei Umrechnungen vergleichen:

  • out.gif: Alle Frames sind 256x256größer oder größer und haben eine Größe von ca. 5 MB. Warum?

    Optisch falsch, da diese ungefähren 256x256Frames einen Offset ungleich Null haben, z. B. 125+128für Frame 2!

  • out-coalesce.gif: Alle Bilder sind 256x256und haben den richtigen Versatz 0+0.

    Die Ausgabe sieht visuell korrekt aus, aber die Ausgabedatei hat eine Größe von 2,0 MiB und ist größer als out-deconstruct.gif

  • out-deconstruct.gif: komprimierte Bilder, endgültige Ausgabegröße 1,9 MiB.

    Nicht wesentlich kleiner als out-coalesce.gif, aber ich denke, das liegt nur daran, dass der schwarze Untergrund wirklich gut komprimiert wird und im Allgemeinen sehr bedeutend sein könnte.

ffmpeg und Gifsicle

Ich habe auch die folgenden Befehle ausprobiert:

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

und beide erzeugten eine noch kleinere, korrekt aussehende 1,5-MiB-Ausgabe.

Siehe auch: Wie erstelle ich ein animiertes GIF aus Standbildern (vorzugsweise mit der Befehlszeile)?

TODO: Warum können sie es kleiner machen als convert? Wählen sie einfach besser minimalere Diff-Rechtecke oder etwas anderes aus?

Getestet in Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8.

Ciro Santilli ist ein Schauspieler
quelle
3

Ich habe nach einer imagemagick-Lösung gesucht, wie ich sie kenne, aber am Ende bin ich dem Vorschlag von @ sam gefolgt gifsicle. Es tat genau das, was ich wollte, kein Ärger.

Kann die resultierende Dateigröße auf so viele Arten optimieren, aber ich habe nur die Größe und die Anzahl der Farben reduziert. Lief wie am Schnürchen:

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