web-dev-qa-db-fra.com

Convertissez des milliers de fichiers .pngs en fichiers .gif animés, `convert` utilise trop de mémoire

Beaucoup des questions posantcomment créern gif animéà partir d'un ensemblesur des images png suggère d'utiliser une variante de la commande convert d'ImageMagick:

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

Cependant, j'ai quelques milliers d'images et donc convert utilise toute ma mémoire, mon swap, puis mon ordinateur plante. Quel logiciel alternatif existe, qui est plus soucieux de la mémoire? Je pourrais utiliser un autre format ouvert si .gif n'est pas pris en charge, et je préfère un outil de ligne de commande.

28
dotancohen

On dirait que vous essayez de faire une vidéo. Si c'est le cas, j'utiliserais un format vidéo approprié.

Dans ce cas, je voudrais utiliser ffmpeg pour convertir les fichiers PNG individuels en vidéo H.264. Ffmpeg étant conçu pour fonctionner avec des vidéos pouvant durer des heures, vos milliers d'images ne devraient pas poser de problèmes. L'utilisation de H.264 au lieu de gif animé entraînera une amélioration considérable de la qualité de l'image.

Quelque chose comme ça devrait marcher pour vous:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2: Ceci règle le framerate à un demi-seconde images par seconde ou à 2 secondes par image.
  • -i img%04d.png: Ceci indique à ffmpeg de lire les fichiers img0000.png bien que img9999.png.
  • -c:v libx264: utilise le codec vidéo libx264.
    • Vous pouvez spécifier ici les paramètres de compression vidéo, si vous le souhaitez:
    • -crf <number>: paramètre de qualité. 0 à 51. 23 est la valeur par défaut. 0 est le véritable encodage sans perte, qui aura une bande passante assez élevée. 18 est presque sans perte visuelle.
  • -r 30: définissez le nombre d'images par seconde en sortie par 30 images par seconde. Chacune des images en entrée sera dupliquée pour donner à la sortie ce que vous spécifiez ici. Vous pouvez laisser ce paramètre désactivé et le fichier de sortie sera dans le framerate d'entrée, mais le film résultant ne s'est pas affiché correctement lorsque je l'ai essayé tout à l'heure.
  • out.mp4: Nom du fichier de sortie.

Références:

33
David Yaw

Personnellement, je voudrais juste le lancer sur un nombre limité de fichiers au lieu de tout à la fois. Par exemple, quelque chose comme ceci:

#!/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
11
terdon

Utilisez -limit memory 1GiB pour limiter la quantité de mémoire utilisée par convert.

Des milliers d'images créeraient un énorme GIF que la plupart des ordinateurs auront du mal à afficher. Je garde mes GIF animés en dessous de 200 images lorsque cela est possible. Le moins le mieux. Si vous numérotez vos images, cette commande supprimera les images impaires numérotées rm *[13579].png.

Voici donc mon flux de travail typique pour la création d'un fichier GIF animé à partir d'une scène de 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
7
PLA

Je pourrais utiliser un autre format ouvert si .gif n'est pas supporté

Peut-être que APNG vous est utile. Il est supporté par certains navigateurs , y compris Firefox, mais exclut pour le moment Chrome et IE. Puisqu'il ne s'agit que d'une extension PNG, il est très simple de convertir des fichiers PNG en APNG. L'outil apngasm peut le faire. Mais le format est si simple que j'ai récemment écrit moi-même un assembleur APNG pour Sage. Adapter ce code serait une alternative.

4
MvG

Si vous avez des milliers de png-s, le format anigif est bizarre. Je le ferais de cette manière, en utilisant avconv:

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov
3
Frantique

En plus d’autres réponses: puisque vous voulez produire un fichier GIF, je suppose que vous voulez afficher l’image sur une page Web. Si tel est le cas, je ne voudrais pas du tout convertir vos PNG. Juste Google pour "diaporama javascript" et utiliser l'un des millions de scripts gratuits. Ou écrivez le vôtre, c'est vraiment trivial.

Les avantages de le faire de cette façon sont les suivants:

  • une seule image est chargée dans le navigateur à tout moment, le diaporama démarre rapidement et ne consomme pas beaucoup RAM sur la machine de l'utilisateur.

  • la solution s'adapte à des millions d'images. Ou des milliards, si vous êtes assez patient pour les regarder tous :)

  • Vous pouvez ajouter des contrôles à votre page pour suspendre, revenir en arrière, modifier le délai ou accéder à une image particulière.

2
Sergey

gifsicle est un utilitaire de ligne de commande permettant de gérer les animations GIF. Si vous souhaitez échanger de la mémoire pour gagner de la vitesse, vous pouvez utiliser le commutateur --conserve-memory.

2
codehead