Ich habe einen Ordner voller Videos, die ich in animierte Gifs konvertieren möchte. ffmpeg / avconv macht einen schlechten Job, wenn ich es direkt mache, also konvertiere ich das Video stattdessen in ein GIF, indem ich zuerst jedes Bild als PNG ausgebe und dann mit imagemagick zurück in GIF konvertiere. Das Problem ist, dass dies zu einem großen GIF in Bezug auf die Dateigröße führt. Um dies zu lösen, möchte ich jedes zweite oder n-te Bild aus dem GIF "entfernen", indem ich beim Konvertieren in ein GIF jede Bilddatei überspringe oder Bilder aus einem GIF entferne. Wie kann ich das unter Ubuntu (13.04) mit imagemagick oder einem anderen Befehlszeilenprogramm machen?
quelle
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"
erledigen dies in einem Aufruf.chmod +x gifdrop.sh
Hier ist eine einfachere Lösung mit Gifsicle als JohnBs Skript:
Dieser Befehl sollte in den meisten Unix-Shells funktionieren. Ich habe es in bash getestet. Ersetzen Sie
input.gif
undoutput.gif
durch die Namen der Eingabe- und Ausgabedateien und99
durch die Anzahl der Bilder in Ihrer Animation. (Es ist in Ordnung, eine größere Zahl zu verwenden, aber das Gifsicle wird sich darüber beschweren.)Einige Notizen:
Der
-U
Schalter fügt Frames in der Eingabeanimation mit den vorherigen Frames zusammen, sodass jedes Frame für sich steht und von keinem anderen abhängig ist. Sie möchten dies wirklich tun, bevor Sie so ziemlich alles mit Animationen machen, sonst erhalten Sie wahrscheinlich unordentliche Ergebnisse. (Wenn Ihre Eingabeanimation bereits nicht optimiert ist, gibt Gifsicle möglicherweise eine Warnung darüber aus, aber dies ist auch völlig harmlos.)Umgekehrt
-O2
optimiert der Schalter die Ausgabeanimation neu, um die Dateigröße zu minimieren. Mit der Beispielanimation von JohnB wird die Ausgabegröße um 27% verkleinert.Der
seq
Befehl gibt nur eine Folge von Zahlen von 0 bis 99 aus, die in Schritten von 2 hochgezählt werden. Dadurch wird vor jeder Zahl-f "#%g"
ein gedruckt#
, sodass Gifsicle diese als Rahmenauswahl anstelle eines Dateinamens versteht. Die Backticks (`
) um den Befehl seq bewirken, dass seine Ausgabe als Parameter in die Gifsicle-Befehlszeile eingefügt wird.Wenn Sie nicht möchten, dass das GIF schneller wird, können Sie
gifsicle -I input.gif
mit die aktuelle Frame-Verzögerung ermitteln, sie mit 2 multiplizieren und verwendengifsicle -d ${delay} ...
.quelle
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
. Also habe ich es in zwei Schritten gemacht (aus Git Bash heraus): 1.gifsicle -U -o unoptimized.gif input.gif
2.gifsicle unoptimized.gif `seq -f "#%g" 0 2 99` -O2 -o output.gif
Verwenden von Photoshop
Dies ist keine Open Source- oder Befehlszeilenlösung, aber Sie können dies mit Photoshop tun:
Datei ▸ Importieren ▸ Videorahmen in Ebenen ...
" Limit To Every __ Frames " erledigt den Trick für Sie
quelle
Hier ist meine Lösung mit Batch-Skriptverarbeitung ...
Kopieren Sie zuerst das erfasste animierte GIF in die Datei input.gif, starten Sie dann den Befehlsinterpreter und geben Sie Folgendes ein:
gifsicle input.gif -I "# -1"> input.txt
Schauen Sie in die Datei input.txt und sehen Sie, wie lang die Animation ist - wie viele Frames sie enthält ...
input.txt:
Dann editiere-erstelle test.bat und ändere den Wert der Variablen len = specific_length_number_from_input.txt und speichere test.bat ...
test.bat:
Starten Sie dann schließlich process1.bat und process2.bat und die zugeschnittene Animation mit jedem ungeraden Frame wird in die Datei input.gif verarbeitet
process1.bat:
process2.bat:
quelle
Ich denke, ich brauche eine neue, raffiniertere Erklärung (Frame-Verzögerung ist auch eine wichtige Sache, die ebenfalls berücksichtigt werden sollte) ... Für diesen neuen Prozess müssen Sie JREPL.BAT von diesem Link herunterladen: http://www.dostips.com /forum/viewtopic.php?t=6044
Kopieren Sie zuerst das erfasste GIF in die Datei input.gif, starten Sie dann den Befehlsinterpreter und geben Sie Folgendes ein:
gifsicle input.gif -I "# -1"> input.txt
Schauen Sie in die Datei input.txt und sehen Sie, wie lang die Animation ist - wie viele Frames sie enthält ... Schauen Sie auch in die Verzögerung des Frames und wenn dies 0.07s sind, sollten Sie die Option -d14 (7msec * 2) in diese Zeile setzen in process.cmd: gifsicle -b -U -d14 input.gif, nach der Bearbeitung save process.cmd
Bearbeiten Sie dann test.bat und ändern Sie den Wert der Variablen 166 in dieser Zeile entsprechend der Anzahl der Animationsbilder: Geben Sie für / L %% i IN (1,2,166) nach "# %% i" >> input.bat ein editieren speichern test.bat ...
Starten Sie dann process.cmd und die zugeschnittene Animation mit jedem ungeraden Bild wird in die Datei input.gif verarbeitet
PS Der Vorteil dieser Methode ist auch, dass Sie die volle Kontrolle darüber haben, was Sie aus gif löschen möchten (jedes zweite Bild (1,2,166) oder jedes dritte (1,3,166)), und so weiter, ändern Sie einfach die mittlere Zahl in Batch-Zeile, aber beachten Sie, dass Sie bei Angabe von (1,3,166) -d14 (Verzögerungsoption) von process.cmd entsprechend ändern sollten, um die Änderung (7 ms * 3/2 = 10) widerzuspiegeln, anstatt (7 ms * 2) / 1 = 14), Option für Verzögerung sollte -d10 sein ...
Andere Dateien (zum Beispiel zum Entfernen jedes zweiten Frames): test.bat:
process.cmd:
Und Helfer Readme-Datei input.txt:
quelle