Converti migliaia di .png in file animati .gif, 'convertiti' usa troppa memoria

21

Molti domande che richiedono come creare < a href="https://askubuntu.com/questions/566476/how-can-i-create-a-gif-out-of-a-sequence-of-png-files-without-the-previous-image" > una gif animata da un insieme of immagini png consiglia di usa una variante del comando convert di ImageMagick:

convert -delay 2 -loop 0 *.png animated.gif

Tuttavia, ho qualche migliaio di immagini e quindi convert utilizza tutta la memoria, lo scambio e, quindi, l'arresto anomalo. Che software alternativo esiste, che è più attento alla memoria? Potrei usare un altro formato aperto se .gif non è supportato e preferisco uno strumento CLI.

    
posta dotancohen 14.01.2015 - 14:38
fonte

7 risposte

28

Sembra che tu stia cercando di realizzare un video. Se è così, allora userei un formato video appropriato.

In questo caso, utilizzerei ffmpeg per convertire i singoli file PNG in un video H.264. Dato che ffmpeg è progettato per funzionare con video che possono durare ore, non dovrebbe avere problemi con migliaia di immagini. L'utilizzo di H.264 anziché di gif animate determinerà un miglioramento vasto della qualità dell'immagine.

Qualcosa di simile dovrebbe funzionare per te:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2 : imposta il framerate a metà FPS o a 2 secondi per fotogramma.
  • -i img%04d.png : indica a ffmpeg di leggere i file img0000.png sebbene img9999.png .
  • -c:v libx264 : usa il codec video libx264.
    • Qui puoi specificare i parametri di compressione video, se lo desideri:
    • -crf <number> : impostazione di qualità. Da 0 a 51. 23 è il valore predefinito. 0 è la vera codifica lossless, che avrà una larghezza di banda piuttosto elevata. 18 è quasi visivamente senza perdite.
  • -r 30 : imposta il framerate di uscita su 30 FPS. Ciascuna delle immagini di input verrà duplicata per rendere l'output ciò che viene specificato qui. Puoi lasciare questo parametro spento, e il file di output sarà al framerate dell'input, ma il film risultante non è stato visualizzato correttamente quando l'ho provato proprio ora.
  • out.mp4 : nome file di output.

References:

risposta data David Yaw 15.01.2015 - 03:36
fonte
10

Personalmente, lo lancerei solo su un numero limitato di file anziché su tutti in una volta. Ad esempio, qualcosa di simile:

#!/usr/bin/env bash

## Collect all png files in the files array
files=( *png )
## How many should be done at once
batch=50

## Read the array in batches of $batch
for (( i=0; $i<${#files[@]}; i+=$batch ))
do
    ## Convert this batch
    convert -delay 2 -loop 0 "${files[@]:$i:$batch}" animated.$i.gif
done

## Now, merge them into a single file
convert  animated.*.gif all.gif
    
risposta data terdon 14.01.2015 - 15:42
fonte
7

Utilizza -limit memory 1GiB per limitare la quantità di memoria utilizzata da convert .

1000 di immagini creerebbero una GIF enorme che la maggior parte dei computer fatica a mostrare. Mantengo le mie GIF animate al di sotto di 200 immagini quando possibile. Meno sono e meglio è. Se si numerano le immagini, questo comando eliminerà le immagini con numeri dispari rm *[13579].png .

Ecco quindi il mio tipico flusso di lavoro per la creazione di una GIF animata da una scena del film:

avconv -ss 00:26:00 -i someMovie.mpg %5d.png
rm  *[13579].png
convert -limit memory 1GiB -loop 0 -layers optimize -resize 400 *.png output.gif
    
risposta data PLA 20.01.2015 - 19:59
fonte
3

Se hai migliaia di png-s, il formato anigif è strano. Lo farei in questo modo, usando avconv :

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov
    
risposta data Frantique 14.01.2015 - 14:55
fonte
3
  

Potrei usare un altro formato aperto se .gif non è supportato

Forse APNG ti sono utili. È supportato da alcuni browser , incluso Firefox ma al momento escludendo Chrome e IE. Poiché è solo un'estensione PNG, è molto semplice per convertire i PNG in APNG. Lo strumento apngasm può farlo. Ma il formato è così semplice che ho recentemente scritto un assemblatore di APNG per Sage. Adattare quel codice sarebbe un'alternativa.

    
risposta data MvG 14.01.2015 - 17:27
fonte
2

Oltre alle altre risposte: poiché vuoi produrre un file GIF, presumo che tu voglia visualizzare l'immagine su una pagina web. Se è così, non mi preoccuperei di convertire i tuoi PNG. Basta google per "slideshow javascript" e utilizzare uno dei milioni di script gratuiti. O scrivi il tuo, questo è davvero banale.

I vantaggi di farlo in questo modo sono:

  • solo una immagine è caricata nel browser in qualsiasi momento, la presentazione inizia velocemente e non consuma molta RAM sul computer dell'utente.

  • la soluzione scala a milioni di immagini. O miliardi, se hai la pazienza di guardarli tutti:)

  • Puoi aggiungere controlli alla tua pagina per mettere in pausa, riavvolgere, modificare il ritardo o andare su un particolare fotogramma.

risposta data Sergey 20.01.2015 - 22:01
fonte
1

gifsicle è un'utilità della riga di comando per gestire le animazioni GIF. Se sei disposto a scambiare la memoria per la velocità, puoi usare la sua opzione --conserve-memory.

    
risposta data codehead 15.01.2015 - 03:13
fonte