Bagaimana cara membuat gif animasi dari gambar foto (lebih disukai dengan baris perintah)?

78

Saya ingin membuat .gifgambar animasi dari serangkaian gambar yang diberikan .jpg.

Saya lebih suka melakukannya dari baris perintah, jadi alat baris perintah akan sangat diterima.

Maythux
sumber

Jawaban:

87

Anda dapat menggunakan paket ImageMagick . Instal menggunakan perintah:

sudo apt-get install imagemagick

Sekarang Anda dapat membuat gifdari dari sejumlah gambar ( jpg) menggunakan:

convert -delay 20 -loop 0 *.jpg myimage.gif
Maythux
sumber
6
Tolong, sertakan di sini bagaimana Anda mengubah ukuran animasi gif dll sebesar 50%. Dll -resize 50%.
Léo Léopold Hertz 준영
Ubuntu 18.10 gagal dengan "sumber daya cache habis" untuk gambar-gambar ini: github.com/cirosantilli/media/blob/master/… terkait: superuser.com/questions/1178666/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Pengguna ImageMagick mungkin akan juga ingin: -deconstruct. Saya juga menemukan bahwa ImageMagick sangat haus akan memori, lihat benchmark: askubuntu.com/a/1102183/52975
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
convert -delay 0 -loop 0 *.tif myanimated.gifbekerja dengan baik, pada 720 file tif
ron
46

Untuk menyelesaikan jawaban @ Mayayux:

Untuk menghindari menghasilkan file yang sangat besar, Anda dapat menggunakan -resizeopsi:

Dalam kasus saya, saya memiliki 4608x3456 gambar dan gif yang dihasilkan lebih dari 300M untuk 32 gambar

convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif

atau

convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif

Jaga * .jpg

*.jpg menyebalkan sedikit ketika berhadapan dengan nilai numerik, Anda dapat menghasilkan gif dengan foto yang tidak disortir.

$ ls|cat
21-33-26_1.jpg
21-33-26_10.jpg   // <--- this one
21-33-26_2.jpg
21-33-26_3.jpg
21-33-26_4.jpg
21-33-26_5.jpg
21-33-26_6.jpg
21-33-26_7.jpg
21-33-26_8.jpg
21-33-26_9.jpg
21-33-28_1.jpg    // <--- should be here    
21-33-28_2.jpg
21-33-28_3.jpg
...

Karena pemotretan diambil dengan sangat cepat (10 / dtk) mereka semua memiliki waktu modifikasi yang sama dan Anda tidak dapat memperdayainya ls -tmisalnya. Di ubuntu, Anda dapat menggunakan ls -vsesuatu, seperti:

convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif

Mengurutkan secara numerik cukup rumit pada Mac OS X, saya kira Anda harus membuat skrip khusus.

Ninsuo
sumber
4
Anda dapat menghindari masalah * .jpg dengan meneruskan angka padding dengan nol. "01.jpg" bukan "1.jpg", dan seterusnya. Jika Anda mendapatkan tiga digit, maka "001.jpg", "010.jpg", dll.
bigreddmachine
2
Ada beberapa cara di sekitar masalah urutan nama file. Termasuk find,, sortbrace ekspansi, dan sebagainya. The lsAlat ini sangat cocok untuk hal semacam ini. Gunakan find. Ada sedikit kurva belajar, tetapi itu sepadan.
Suara
Beberapa pengguna mungkin tertarik mengedit nama file dengan massren: github.com/laurent22/massren
Graham P Heath
butuh waktu lama untuk menyelesaikannya. Apakah ada opsi verbose?
ouranos
21

Saya tidak memiliki reputasi yang cukup untuk berkomentar tetapi alih-alih memodifikasi nama file Anda dapat menggunakan globbing untuk membuat shell Anda memperluas nama file

convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif
shanksk
sumber
11

GIMP

Anda dapat dengan mudah melakukan ini dengan GIMP. Pertama instal jika belum diinstal dengan

sudo apt-get install gimp

Menciptakan gif

Dari GIMP, buka File -> Open as Layers untuk membuka semua png pada layer mereka sendiri.

Buka sebagai Layer

Dari sini Anda dapat melakukan pengeditan pada layer dan, setelah selesai, buka File -> Export As . Dari dialog pastikan untuk mengatur jenis file ke GIF.

Setel jenis file ke GIF

Dari sana Anda akan pergi ke opsi ekspor GIF. Centang opsi ' As Animation ' dan atur parameter sesuai kebutuhan.

Opsi ekspor GIF

chesedo
sumber
7

solusi ffmeg + data uji

Pada Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8, saya telah menemukan bahwa ffmpeg jauh lebih cepat dan menggunakan lebih sedikit memori .

Perintah konversi yang paling sederhana adalah:

ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

Anda bisa mendapatkan data pengujian saya dengan:

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

Data pengujian dihasilkan dengan: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292 dan berisi 256 1024x1024 gambar PNG.

Dan berikut ini adalah data uji yang dapat Anda hasilkan langsung di peramban Anda sekarang juga! https://stackoverflow.com/questions/19235286/convert-html5-canvas-afterence-to-a-video-file/57153718#57153718

masukkan deskripsi gambar di sini

ffmpegOpsi penting yang ingin saya soroti adalah:

  • -pattern_type glob: cara mudah untuk memilih gambar

  • -framerate 60: asumsikan 60 FPS pada gambar input, dan hasilkan FPS yang sama.

    ffmpeg tidak dapat mengetahui sebaliknya, karena tidak ada data FPS dalam gambar karena ada dalam format video.

    256 frame input membutuhkan waktu sekitar 4 detik untuk selesai.

    -r 15: pilihan. Pilih satu setiap 4 gambar jadi kurangi ukuran ( 4 == 60 / 15).

    Dengannya, identify out.gifdikatakan bahwa GIF hanya berisi 64 frame.

    Masih butuh 4 detik untuk bermain, jadi penundaan diubah untuk membuat semuanya cocok.

  • -vf scale=512:-1: pilihan. Atur lebar, skala tinggi secara proporsional, biasanya untuk mengurangi ukuran dan menghemat ruang.

Agar ImageMagick berfungsi, pertama-tama saya harus memodifikasi batas disk dan memorinya /etc/ImageMagick-6/policy.xmlseperti yang dijelaskan di: https://superuser.com/questions/1178666/imagemagick-convert-quvert-quits-after-some-pages

Lihat juga:

ImageMagick vs ffmpeg benchmark

Saya membandingkan perintah:

/usr/bin/time -v convert *.png -deconstruct -delay 1.6 out-convert.gif
/usr/bin/time -v ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  out-ffmpeg.gif \
;

Perintah dibuat untuk menghasilkan keluaran yang sedekat mungkin agar perbandingan itu valid:

  • /usr/bin/time -v: digunakan untuk menemukan penggunaan memori maksimum seperti yang dijelaskan di: https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process

  • -deconstruct: Gambar GIF dapat berisi hanya persegi panjang yang dimodifikasi minimal dari bingkai sebelumnya untuk membuat GIF lebih kecil.

    ffmpegmenghitung perbedaan tersebut secara default, tetapi ImageMagick tidak, kecuali -deconstructdigunakan.

    Anda pada dasarnya ingin menggunakan opsi itu setiap kali dengan ImageMagick.

    Kita dapat mengamati perbedaannya dengan:

    identify out.gif
    

    Dengan versi terkompresi, semua frame memiliki ukuran lebih kecil dari yang awal, misalnya:

    out.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    

    Dalam contoh ini, frame kedua hanya 516x516bukan 1024x1024 penuh, dan ditempatkan pada offset 252+257. Karena itu hanya mengandung segitiga tengah.

    Lihat juga: bagaimana saya bisa mengubah ukuran file GIF animasi menggunakan ImageMagick?

  • -delay: nilai yang cocok dengan 60FPS dari ffmpeg. Seharusnya tidak masalah untuk kinerja konversi, tetapi saya tidak ingin mengambil risiko itu.

GIF keluaran memiliki ukuran yang sama dan terlihat identik secara visual.

Kami mendapatkan untuk ImageMagick:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:56.16
Maximum resident set size (kbytes): 2676856

dan untuk ffmpeg:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172

dari mana kita melihat bahwa:

  • ImageMagick menggunakan 2.6Gb RAM dan membutuhkan waktu sekitar 1 menit
  • ffmpeg menggunakan 100Mb RAM dan membutuhkan waktu 4 detik

Perangkat keras uji: Laptop Lenovo ThinkPad P51 , Intel Core i7-7820HQ, 32GB (16 + 16) DDR4 2400MHz SODIMM, SSD PCIe TLC OPAL2 512GB.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
Terpilih dan disukai !, jawaban yang bagus, saya punya satu pertanyaan kecil tindak lanjut. Saya belum memiliki banyak gambar berkualitas tinggi, dan saya tidak menggunakan -r dan -vmemerintahkan, masih keluaran gif yang kualitasnya jauh lebih rendah daripada file png asli. Bagaimana menjaga kualitas gif yang sama dengan file png yang diberikan?
astro123
Hai @ astro123 bagaimana kualitasnya lebih rendah? Ukuran gambar yang lebih kecil, atau lebih sedikit frame, atau yang lainnya (GIF tampaknya menggunakan lossless, jadi tidak mungkin kompresi lebih buruk)? Coba -framerate 60 -r 60. Periksa GIF yang dihasilkan dan masukkan gambar dengan alat ImageMagick ingin identifymencoba dan mencari tahu apa yang sedang terjadi.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
4

Anda dapat menggunakan program yang disebut konversi yang disertakan dalam paket imagemagick. Ini adalah command line driven, tetapi sangat mudah digunakan. Instal baik melalui pusat perangkat lunak, atau pergi ke prompt perintah dan ketik

sudo apt-get install imagemagick

Sekarang untuk membuat .gif.

convert -delay 100  -size 100x100 xc:SkyBlue \
          -page +5+10  balloon.gif   -page +35+30 medical.gif  \
          -page +62+50 present.gif   -page +10+55 shading.gif  \
          -loop 0  animation.gif

* Perhatikan contoh di atas langsung dari Contoh Gambar Magick

Scott Goodgame
sumber
1
Bagaimana cara saya melakukan 40 gambar PNG dalam loop GIF? Semua dalam folder / home / fusion809 / Documents / Images
BH2017
1
@ BH2017: convert -delay 20 -loop 0 *.png out.gifmembuat GIF pengulangan.
unutbu