come posso ridimensionare un file GIF animato usando ImageMagick?


46

Voglio ridimensionare un simile file GIF animato do.gif inserisci qui la descrizione dell'immagine

Se lo faccio, convert do.gif -resize 24x24\! do-24.giflo ridimensiono in do-24.gif ma non è animatoinserisci qui la descrizione dell'immagine

Come ridimensionarlo nel modo giusto per ottenere la stessa animazione?

Risposte:


56

prima corsa:

convert do.gif -coalesce temporary.gif

poi

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

2
-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."
sam,

28
gifsicle --resize 24x24 > do-24.gifanche a questo
sam

2
Si noti che la visualizzazione a coalescenza è molto più grande di quella ottimizzata (3,2 volte nel mio test) e il ridimensionamento produce un'immagine coalizzata, che può anche essere più grande dell'originale in dimensioni del file (2,3 volte nel mio test) anche se la risoluzione è più piccolo. Quando provo a ridimensionare direttamente, sembra che abbia dimensioni ridotte, anche se forse funziona solo con questa immagine.
endolith

1
gifsicle ha prodotto un output molto migliore e ottimizzato per il mio caso d'uso. Grazie @sam!
sj26,

4
convert temporary.gif -resize 24x24 smaller.gif funziona per me., senza specificare le dimensioni di input.
AMB

5

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

3

-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.

-coalescequindi 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

inserisci qui la descrizione dell'immagine

out-coalesce.gif

inserisci qui la descrizione dell'immagine

out-deconstruct.gif

inserisci qui la descrizione dell'immagine

Innanzitutto, vediamo come inserire il file, infatti out-convert.gif, è stato compresso, poiché il frame 2 è solo 516x516in offset 252+257, mentre il frame 1 a dimensione intera lo è 1024x1024.

Quindi, se confrontiamo le tre conversioni:

  • out.gif: Tutti i frame sono 256x256o più grandi e grandi a circa 5 MiB, TODO perché?

    Visivamente errato, poiché quei 256x256frame approssimativi hanno un offset diverso da zero, ad esempio 125+128per il frame 2!

  • out-coalesce.gif: tutti i frame sono 256x256e 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.