Risposte:
prima corsa:
convert do.gif -coalesce temporary.gif
poi
convert -size <original size> temporary.gif -resize 24x24 smaller.gif
gifsicle --resize 24x24 > do-24.gif
anche a questo
Stavo cercando la soluzione di imagemagick perché ne ho familiarità, ma alla fine ho seguito il suggerimento di @ sam gifsicle
. Ha fatto esattamente quello che volevo, senza problemi.
È in grado di ottimizzare le dimensioni del file risultante in molti modi, ma sono andato semplicemente riducendo le dimensioni e riducendo il numero di colori. Ha funzionato come un fascino:
gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
-coalesce
+ -deconstruct
Dopo -coalesce
, probabilmente vorrai aggiungere un -deconstruct
:
convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
La causa principale del problema è che la GIF di input è stata minimizzata correttamente: GIF consente al fotogramma successivo di essere solo il rettangolo modificato dal precedente con un offset.
-coalesce
quindi espande tutti i frame alla dimensione originale, il che rende il ridimensionamento funzionante, ma non ricomprime i frame come immagine di input: -deconstruct
è necessario per quello!
Usando i dati del test da questa risposta: Come posso creare una gif animata da immagini fisse (preferibilmente con la riga di comando)? possiamo vederlo chiaramente con 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
Innanzitutto, vediamo come inserire il file, infatti out-convert.gif
, è stato compresso, poiché il frame 2 è solo 516x516
in offset 252+257
, mentre il frame 1 a dimensione intera lo è 1024x1024
.
Quindi, se confrontiamo le tre conversioni:
out.gif
: Tutti i frame sono 256x256
o più grandi e grandi a circa 5 MiB, TODO perché?
Visivamente errato, poiché quei 256x256
frame approssimativi hanno un offset diverso da zero, ad esempio 125+128
per il frame 2!
out-coalesce.gif
: tutti i frame sono 256x256
e hanno l'offset corretto 0+0
.
L'output appare visivamente corretto, ma la dimensione del file di output è 2,0 MiB, che è maggiore di out-deconstruct.gif
out-deconstruct.gif
: frame compressi, dimensione finale di output 1,9 MiB.
Non molto più piccolo di out-coalesce.gif
, ma penso che sia solo perché il terreno nero si comprime molto bene e potrebbe essere molto significativo in generale.
ffmpeg e gifsicle
Ho anche provato i seguenti comandi:
ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif
ed entrambi hanno prodotto un output di 1,5 MiB ancora più piccolo e dall'aspetto corretto.
Vedi anche: Come posso creare una gif animata da immagini fisse (preferibilmente con la riga di comando)?
TODO: perché possono renderlo più piccolo di convert
? Stanno solo selezionando rettangoli differenziali più minimi o qualcos'altro?
Testato in Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8.
-coalesce
"crea una visione completa dell'animazione in ogni punto, un po 'come una vera striscia di pellicola, piuttosto che una sequenza di animazione. Tale sequenza, nota come Animazione coalescente è molto più facile da studiare, modificare, modificare e riottimizzare."