Membuat animasi GIF dari file PNG


83

Apakah ada alat untuk membuat gifanimasi dari sekumpulan pngfile?

Saya mencoba convertperintah dari suite ImageMagick , tetapi ini tidak selalu berhasil. Juga, saya memiliki beberapa masalah dengan ini:

  1. Saya tidak tahu apa kemajuannya.
  2. Tidak peduli apa yang saya coba, -delayflag tidak mengubah frame rate dari animasi gif.
  3. convertmenentukan urutan bingkai berdasarkan urutan alfabet nama file. Ini berarti bahwa name500.pngakan ditempatkan tepat setelah name50.pngdan bukan setelah name450.pngsaya dapat memperbaikinya dengan menambahkan 0 tetapi ini menjengkelkan.

[Berita] Ada tumpang tindih besar antara Ubuntu Stackexchange dan Unix Stackexchange. Saya mencoba mengategorikan beberapa utas di sini .
hhh

Mengenai item 3., Anda masih dapat menggunakan convertsetelah menyortir file. Mungkin, sesuatu seperti ini berfungsifiles=$(ls name*png | sort -n -tname -k1); convert $files animation.gif
altroware

Untuk Poin 1: convert memiliki -monitorparameter yang melacak proses
Curlew

@ hhc - semua kategorisasi hanyalah tautan ke jawaban dengan 5 tautan; hanya satu dari mereka yang tampaknya terkait, tetapi hanya tautan ke pertanyaan di atas. - Sebuah komentar oleh @Luke memberikan solusi sederhana: convert -delay 200 -loop 0 *.jpg output.gif.
cipricus

Jawaban:


50

Versi ffmpeg yang lebih baru tidak memiliki -sameq ( lihat faq ) tetapi memiliki dukungan GIF.

ffmpeg -i %03d.png output.gif

Di mana% 03d adalah ID bingkai dalam 3 digit.

Anda juga dapat mencoba menggunakan ffmpeguntuk membuat film dari urutan gambar dan kemudian mengonversi film ke animasi GIF (menggunakan lagi ffmpeg).

# cf. http://pages.uoregon.edu/noeckel/MakeMovie.html

# first convert an image sequence to a movie
ffmpeg -sameq -i %03d.jpg output.mp4

# ... and then convert the movie to a GIF animation
ffmpeg -i output.mp4 -pix_fmt rgb24 -s qcif -loop_output 0 output.gif

10
Instruksi ini sudah usang.
Perawatan tinggi

3
The sameqopsi ini tidak tersedia lagi. Lebih jauh, bagi saya, ini menimpa file gambar asli dan tidak menghasilkan file film yang valid.
Lode

Apa gunanya meninggalkan -sameqkode di sana? Mengapa Anda ingin menggunakan format video lossy ( output.mp4) sebagai sementara? Dan jika demikian, mengapa "kualitas yang sama" dengan input, daripada bitrate yang sangat tinggi? Artefak dari itu hanya akan membuat segalanya lebih buruk untuk pembuat kode GIF. Jika Anda memang perlu menggunakan video sebagai sementara, Anda ingin menggunakan sesuatu yang tidak ada salahnya seperti huffyuv. Atau MJPEG tanpa transcoding, cukup remux input jpeg menjadi MJPEG. ( -codec:video copy).
Peter Cordes

80

convertadalah alat baris perintah yang berguna untuk melakukan itu. cdke folder yang berisi png -files Anda dan jalankan perintah ini:

convert -delay 10 -loop 0 *.png animation.gif

Sumber: http://ubuntuforums.org/showthread.php?t=1132058


5
Pertanyaan itu menyebutkan convertdan beberapa masalah menggunakannya. Jawaban Anda tidak membahas salah satunya.
Mat

3
Pada versi ImageMagick 6.8.7-4 2013-11-02 Q16ini berfungsi untuk saya.
Rudy Matela

7
Ini bekerja, tetapi 10berarti 10 * 10 ms, sangat cepat. Penundaan a 100adalah 1 detik.
Anne van Rossum

7
gunakan opsi -dispose previousatau -dispose 2jika Anda bekerja dengan PNG transparan
Hải Phong

4
catatan untuk diri saya sendiri: ekspansi brace dapat membantu untuk menentukan daftar gambar sebagai argumen, misalnya pic_{0..20..2}.pngmemperluas pic_0.png, pic_2.pngsampai kepic_20.png
Yibo Yang

19

The convert's --delaypilihan hanya berlaku untuk gambar berikutnya pada baris perintah. Jadi convert -delay 10 *hanya akan mengatur penundaan frame pertama ke 0,1 detik. Opsi perlu diulang:

convert $(for a in *; do printf -- "-delay 10 %s " $a; done; ) result.gif

Untuk kebutuhan pemilahan Anda, konversi tidak mengurutkan bingkai, shell globing *melakukannya. Jika Anda tahu frame Anda diberi nomor dari 0 hingga 700, Anda bisa menghitung sendiri jumlahnya:

convert $(for ((a=0; a<700; a++)); do printf -- "-delay 10 name%s.png " $a; done;) result.gif

5
Saya tidak mengalami perilaku ini convert, karena saya convert -delay 1000 -loop 0 *.png animation.gifmenambahkan 10s keterlambatan antara setiap gambar.
Lode

1
Anda juga dapat menggunakan versi semacam dari lsperintah. Yaitu:convert -delay 1000 $(ls -v name*png) output.gif
erik

7

Memperbarui:

Gunakan convertuntuk png-to-gif, lalu gunakan gifsicle untuk animasi. Ini bukan solusi One App To Do It All, tapi pasti skrip.


GIMP dapat membuat animasi gif dan menyediakan kontrol untuk waktu / penundaan dan ulangi, dll


4
Saya tahu tentang gimp tetapi saya tidak tahu cara menulisnya. Selain itu, menggunakan gimp untuk membuat animasi seperti membunuh lalat dengan meriam
Yotam

1
Itu ide yang buruk; kualitasnya akan mengerikan, karena setiap frame akan dikuantisasi secara terpisah.
Clément

2

ImageMagick dapat menghasilkan animasi gif berkualitas baik. Lihat video ini - http://www.youtube.com/watch?v=OFusYizJ-bA


6
Selamat datang di Unix & Linux! Secara umum kami menyukai jawaban di situs untuk dapat berdiri sendiri - Tautan bagus, tetapi jika tautan itu putus, jawabannya harus memiliki informasi yang cukup untuk tetap membantu. Silakan pertimbangkan untuk mengedit jawaban Anda untuk memasukkan lebih detail. Lihat FAQ untuk info lebih lanjut.
slm

Sungguh komentar yang bermanfaat di atas ....
Lukas

1
convert -delay 200 -loop 0 *.jpg output.gif
Lukas

@ Lukas - dari semua kekacauan yang diposting di bawah pertanyaan ini komentar Anda paling berguna
cipricus

2

ffmeg opsi GIF penting + data uji

Untuk melengkapi jawaban ini :

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i 'tmp.*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

Data pengujian dihasilkan dengan: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

ffmpegOpsi penting yang ingin saya soroti adalah:

  • -patter_type glob: cara mudah untuk memilih gambar
  • -framerate 60dan -r 15: anggap 60 FPS pada gambar input ( ffmpegtidak dapat mengetahui sebaliknya karena tidak ada data FPS dalam gambar seperti dalam format video), pilih satu setiap 4 gambar sehingga kurangi ukuran ( 4 == 60 / 15)
  • -vf scale=512:-1: mengatur lebar, skala tinggi secara proporsional, biasanya untuk mengurangi ukuran dan menghemat ruang

Lihat juga:

Diuji di Ubuntu 18.10, ffmpeg 4.0.2.


-1

Sehubungan dengan poin 2

Versi ImageMagick "display" yang saya miliki (ImageMagick 6.7.2-7 2017-01-12) mengabaikan frame rate yang ditetapkan menggunakan perintah convert untuk menghasilkan gif animasi. Coba program lain untuk melihat gif animasi seperti firefox.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.