2010-09-10 25 views
16

Ho bisogno di qualcosa che possa essere copiato su Windows 7. Questa immagine verrà utilizzata nei banner.Creazione di gif animate da una serie di immagini jpeg

+1

è necessario essere jpeg? jpeg-> anim gif ha probabilmente effetti indesiderati di sfarfallio con un rapporto di compressione peggiore. dovresti usare lossless -> gif o gif-> gif per i migliori risultati di qualità. – tenfour

+1

@tenfour - anche se ciò che hai indicato è perfettamente valido, non è necessariamente una regola empirica. Molto più importante è che i frame condividono colori simili, perché se non lo fanno, la tavolozza di massimo 256 colori di un'immagine GIF condivisa tra i frame produrrà risultati scadenti, indipendentemente dal formato di input e spesso lascerà la gente a chiedersi " perché è venuto fuori granuloso?! " –

risposta

31

Si può fare questo con ffmpeg

prima convertire le immagini in un video:

ffmpeg -f image2 -i image%d.jpg video.avi 

(questo sarà convertire le immagini dalla directory corrente (dal nome image1.jpg, image2.jpg .. .) per un file video chiamato video.avi)

quindi convertire l'avi in ​​gif:.

ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif 

È possibile ottenere windows binaries for ffmpeg here.


si può anche fare una cosa simile con mplayer. Vedi Encoding from multiple input image files.

Penso che la linea di comando sarebbe qualcosa di simile:

mplayer mf://*.jpg -mf w=800:h=600:type=jpg -vf scale=160:120 -vo gif89a:fps=3:output=out.gif 

(dove 800 & 600 sono la larghezza e l'altezza di origine e 160 & 120 sono la larghezza di destinazione e height.out.gif è il vostro file di destinazione nome)


Ho appena testato entrambi ed entrambi funzionano correttamente. Tuttavia ho ottenuto risultati molto migliori da mplayer dato che sono stato in grado di specificare la risoluzione e il framerate. La tua milizia potrebbe variare e sono sicuro che potresti trovare più opzioni per ffmpeg se guardassi.

+0

Usando la versione recente di mplayer, stampa la sua manpage. –

+1

questo ha un buon punteggio google di ricerca, quindi se si vuole anteporre ai numeri con zeri, usare '% 04d' (numero 4 userebbe 4 posizioni numero con prefisso 0) – user151496

+0

nessun file trovato con il nome' image1d.jpg'! cercando utilizzando cmd – user25

10

Il ffmpeg a .avi e .avi a .gif funzionato, ma l'unica cosa da notare è che le immagini devono essere nominati nel perfetto ordine crescente numerico per lavorare, senza lacune. Ho cucinato uno script python rapido per rinominare tutte le mie immagini di conseguenza in modo che questo ffmpeg ricetta avrebbe funzionato:

import os 

files = [ f for f in os.listdir('.') if os.path.isfile(os.path.join('.',f)) and f.endswith('.jpg') ] 
for i, file in enumerate(sorted(files)): 
    os.rename(file, 'image%03d.jpg' % i) 

E poi sono incappato in un approccio molto più semplice di ffmpeg per fare la conversione, che è semplicemente utilizzando lo strumento da riga di comando convert di ImageMagick come questo

convert image%03d.jpg[0-198] animated_gif.gif 

non ottiene molto più semplice di quello gente.

Gist qui: https://gist.github.com/3289840

+1

_ "le immagini devono essere nominati nel perfetto ordine crescente numerico" _ - Immagino che tu non sai di '-pattern_type glob', consente di utilizzare i file con tutti i nomi come input, ad esempio, per convertire tutti i PNG nella directory corrente in GIF: 'ffmpeg -framerate 1/10 -pattern_type glob -i '* .png' output.gif' –

24

Con ImageMagick:

convert *.png a.gif 
+0

anche guardare qui: http: // stackoverflow.com/questions/5508945/imagemagick-animated-gif-size-optimization –

+0

ho avuto problemi di qualità da utilizzare file (a causa di trasparenza e di stratificazione) che sono stati fissati utilizzando .jpg invece – ZG101

+0

È possibile utilizzare '-delay' .png per impostare la durata di ciascuna immagine. Si noti che il valore è dato in 1/100 secondi, cioè "-delay 100" ha una velocità di un fotogramma al secondo. – luator

44

Simon P Stevens' answer quasi mi arrivati:

ffmpeg -f image2 -i image%d.jpg video.avi 
ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif 

Vediamo se siamo in grado di neaten questo.

Andando attraverso un AVI è inutile. Un -pix_fmt di rgb24 non è valido, e l'opzione -loop_output impedisce loop, che io non voglio. Otteniamo:

ffmpeg -f image2 -i image%d.jpg out.gif 

Le mie immagini di ingresso vengono etichettati con un numero zero imbottito a 3 cifre e ho 30 di loro (IMAGE_001.jpg, image_002.jpg, ...), quindi ho bisogno di risolvere il di formato

ffmpeg -f image2 -i image_%003d.jpg out.gif 

mie foto di ingresso sono dalla mia fotocamera del telefono, sono troppo grandi! Devo ridimensionarli.

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299 out.gif 

Ho anche bisogno di ruotare di 90 gradi in senso orario

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif 

Questa gif giocherà con ritardo pari a zero tra i fotogrammi, che probabilmente non è quello che vogliamo. Specificare il framerate delle immagini in ingresso

L'immagine è solo un po 'troppo grande, quindi mi ritagliare le 100 pixel di cielo. La trasposizione rende difficile, io uso le x sul post-ruotato e valori Y:

ffmpeg -f image2 -framerate 9 -i image_%003d.jpg -vf scale=531x299,transpose=1,crop=299,431,0,100 out.gif 

Il risultato finale - arrivare a condividere l'espressione del volto impressionante del mio compagno con il mondo:

Example of an animated gif created with ffmpeg

+4

Grazie per la risposta dettagliata e la spiegazione passo passo. – Ideogram

+0

% 003d ffmpeg lo sostituisce con path - 'image_C:/user/...' – user25

+0

capito, non funzionerà se eseguo il comando con il file cmd – user25

1

sulla base delle risposte di Simon P Stevens e dwurf mi si avvicinò con questa soluzione semplificata:

ffmpeg -f image2 -framerate 1 -i image%d.jpg video.gif 

questo si traduce in un tasso di 1 secondo per immagine. Regola il valore framerate in base alle tue esigenze.

Problemi correlati