Antworten:
erster Lauf:
convert do.gif -coalesce temporary.gif
dann
convert -size <original size> temporary.gif -resize 24x24 smaller.gif
gifsicle --resize 24x24 > do-24.gif
kann auch dazu
-coalesce
+ -deconstruct
Danach -coalesce
mö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.
-coalesce
Dann 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 -deconstruct
erfordert.
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
out-coalesce.gif
out-deconstruct.gif
Zuerst sehen wir, wie man eine Datei eingibt, die out-convert.gif
tatsächlich komprimiert wurde, da Frame 2 nur 516x516
versetzt 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 256x256
größer oder größer und haben eine Größe von ca. 5 MB. Warum?
Optisch falsch, da diese ungefähren 256x256
Frames einen Offset ungleich Null haben, z. B. 125+128
für Frame 2!
out-coalesce.gif
: Alle Bilder sind 256x256
und 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.
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
-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."