J'ai un dossier plein de vidéos que je veux convertir en gifs animés. ffmpeg / avconv fait un mauvais travail de le faire directement, donc je convertis plutôt la vidéo en gif en sortant d'abord chaque image au format png puis en les reconvertissant en gif en utilisant imagemagick. Le problème est que cela se traduit par un grand gif en termes de taille de fichier. Pour résoudre ce problème, je veux "supprimer" chaque seconde ou nième image du gif, soit en sautant chaque fichier image lors de la conversion en gif, soit en supprimant les images d'un gif. Comment puis-je faire cela sur Ubuntu (13.04) en utilisant imagemagick ou un autre utilitaire de ligne de commande?
la source
let i=0; while [[ $i -lt $(($numframes / 2)) ]]; do gifsicle $2 --delete "#$i" -o $2; let i=i+1; done
gifsicle "$1" --unoptimize $(seq -f "#%g" 0 2 $numframes) -O2 -o "$2"
fera en un seul appel.chmod +x gifdrop.sh
Voici une solution plus simple utilisant gifsicle que le script de JohnB:
Cette commande devrait fonctionner dans la plupart des shells Unix; Je l'ai testé en bash. Remplacez
input.gif
etoutput.gif
par les noms des fichiers d'entrée et de sortie, et99
par le nombre d'images dans votre animation. (C'est OK d'utiliser un plus grand nombre, mais gifsicle s'en plaindra.)Quelques notes:
Le
-U
commutateur fusionnera les images de l'animation d'entrée avec les précédentes, afin que chaque image soit autonome et ne dépende d'aucune autre. Vous voulez vraiment le faire avant de faire à peu près n'importe quoi avec des animations, sinon vous risquez d'obtenir des résultats désordonnés. (Si votre animation d'entrée n'est pas encore optimisée, gifsicle peut afficher un avertissement à ce sujet, mais cela est également totalement inoffensif.)Inversement, le
-O2
commutateur réoptimise l'animation de sortie pour minimiser la taille du fichier. Avec l'exemple d'animation de JohnB, il réduit la taille de sortie de 27%.La
seq
commande sort juste une séquence de nombres de 0 à 99, en comptant par étapes de 2. Le-f "#%g"
fait imprimer un#
avant chaque numéro, ce qui permet à gifsicle de le comprendre comme une sélection de trame au lieu d'un nom de fichier. Les backticks (`
) autour de la commande seq font que sa sortie est incluse en tant que paramètres dans la ligne de commande gifsicle.Si vous ne voulez pas que le gif accélère, vous pouvez utiliser
gifsicle -I input.gif
pour obtenir le retard d'image actuel, le multiplier par 2 et utilisergifsicle -d ${delay} ...
.la source
gifsicle input.gif `seq -f "#%g" 0 2 $(identify input.gif | tail -1 | cut -d "[" -f2 - | cut -d "]" -f1 -)` --unoptimize -O2 -o output.gif
useless unoptimization-related input option
. Je l'ai donc fait en deux étapes (depuis Git Bash): 1.gifsicle -U -o unoptimized.gif input.gif
2.gifsicle unoptimized.gif `seq -f "#%g" 0 2 99` -O2 -o output.gif
Utilisation de Photoshop
Ce n'est pas une solution open source ou en ligne de commande, mais vous pouvez le faire avec Photoshop:
Fichier ▸ Importer ▸ Cadres vidéo dans les calques ...
" Limit To Every __ Frames " fera l'affaire pour vous
la source
Voici ma solution en utilisant le traitement par script batch ...
Copiez d'abord le gif animé capturé-original dans le fichier input.gif puis lancez l'interpréteur de commandes et tapez:
gifsicle input.gif -I "# -1"> input.txt
regardez input.txt et voyez quelle est la durée de l'animation - combien d'images elle contient ...
input.txt:
puis éditez-créez test.bat et changez la valeur de la variable len = specify_length_number_from_input.txt et enregistrez test.bat ...
test.bat:
puis démarrez enfin process1.bat et process2.bat et l'animation recadrée avec chaque image impaire sera traitée dans le fichier input.gif
process1.bat:
process2.bat:
la source
Je pense que j'ai besoin d'une nouvelle explication plus sophistiquée (le retard de trame est également une chose importante qui doit également être prise en compte) ... Pour ce nouveau processus, vous devrez télécharger JREPL.BAT à partir de ce lien: http://www.dostips.com /forum/viewtopic.php?t=6044
Copiez d'abord le gif capturé dans le fichier input.gif puis lancez l'interpréteur de commandes et tapez:
gifsicle input.gif -I "# -1"> input.txt
regardez dans input.txt et voyez quelle est la durée de l'animation - combien d'images il contient ... regardez également le retard de l'image et si ses 0,07 s cela signifie que vous devez mettre l'option -d14 (7 msec * 2) dans cette ligne dans process.cmd: gifsicle -b -U -d14 input.gif, après modification enregistrer process.cmd
puis éditez test.bat et changez la valeur de la variable 166 à partir de cette ligne pour qu'elle corresponde au nombre d'images d'animation: pour / L %% i IN (1,2,166) FAITES écho "# %% i" >> input.bat, après modifier enregistrer test.bat ...
puis démarrez process.cmd et l'animation recadrée avec chaque image impaire sera traitée dans le fichier input.gif
PS L'avantage de cette méthode est également que vous avez le contrôle total de ce que vous voulez supprimer du gif (chaque seconde trame (1,2,166), ou chaque troisième (1,3,166)), et ainsi de suite il suffit de changer le numéro du milieu dans ligne de traitement par lots, mais sachez que si vous spécifiez (1,3,166), vous devez en conséquence modifier -d14 (option de délai) de process.cmd pour refléter le changement (7 ms * 3/2 = 10), donc au lieu de (7 ms * 2 / 1 = 14), l'option de délai doit être -d10 ...
Autres fichiers (par exemple pour supprimer une trame sur deux): test.bat:
process.cmd:
Et aidez le fichier readme input.txt:
la source