Hareketsiz görüntülerden nasıl animasyonlu bir gif oluşturabilirim (tercihen komut satırıyla)?


78

.gifBelirli bir .jpgresim grubundan animasyonlu bir resim yapmak istiyorum .

Bunu komut satırından yapmayı tercih ederdim, bu yüzden komut satırı araçları çok iyi karşılanacaktır.


Yanıtlar:


87

ImageMagick paketini kullanabilirsiniz . Komutu kullanarak kurun:

sudo apt-get install imagemagick

Şimdi aşağıdakilerden birini kullanarak bir gifresim ( jpg) oluşturabilirsiniz:

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

6
Lütfen buraya, gif animasyonunu nasıl yeniden boyutlandırdığınızı vb.% 50 oranında ekleyin. Vb -resize 50%.
Léo Léopold Hertz 준영

Ubuntu 18.10 şu resimler için "önbellek kaynakları tükeniyor" ile başarısız oldu: github.com/cirosantilli/media/blob/master/… ile ilgili: superuser.com/questions/1178666/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

ImageMagick kullanıcıları büyük olasılıkla da isteyecektir: -deconstruct. Ayrıca ImageMagick’in hafızada çok aç olduğunu gördüm
Ciro Santilli 事件 改造 中心 法轮功 六四 事件

convert -delay 0 -loop 0 *.tif myanimated.gif720 tif dosyalarında güzel çalıştı
ron

46

@Maythux cevabını tamamlamak için:

Çok büyük bir dosya oluşturmaktan kaçınmak için -resizeseçeneği kullanabilirsiniz :

Benim durumumda 4608x3456 görüntüye sahibim ve oluşturulan gif 32 görüntü için 300M'den fazlaydı

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

veya

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

Kendine iyi bak.

*.jpg Sayısal değerlerle uğraşırken biraz berbat, sıralanmamış resimlerle bir gif oluşturabilirsiniz.

$ 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
...

Çekimler çok hızlı bir şekilde çekildiğinde (10 / s) hepsi aynı değişiklik zamanına sahip ve ls -törneğin, kandırmak için kandırmamak . Ubuntu'da ls -vbunun yerine kullanabilirsiniz :

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

Sayısal olarak sıralama Mac OS X'te oldukça zor olsa da, özel bir komut dosyası oluşturmanız gerekecek.


4
* .Jpg ile ilgili sorunlarınızı sıfırlayarak sayıları ileriye doğru doldurarak önleyebilirsiniz. "1.jpg" yerine "01.jpg" vb. Üçlü basamağa ulaşırsanız, "001.jpg", "010.jpg", vb.
bigreddmachine 23

2
Dosya adı sırası problemi etrafında birkaç yol vardır. Dahil find,, sortayraç genişletme, vb. lsAracı şey bu tür için herkesin bildiği gibi uygun değildir. Kullanın find. Biraz öğrenme eğrisi var, ama buna değer.
dile

Bazı kullanıcılar massren ile dosya isimlerini düzenlemek isteyebilir: github.com/laurent22/massren
Graham P Heath

bitirmek için yaş alır. Ayrıntılı bir seçenek var mı?
ouranos

21

Yorum yapacak kadar itibarım yok ama dosya adlarını değiştirmek yerine dosya adınızı genişletmek için kabuğunuzu almak için globbing kullanabilirsiniz

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

11

GIMP

Bunu GIMP ile kolayca yapabilirsiniz. Önceden yüklü değilse ilk yükle

sudo apt-get install gimp

GIF oluşturma

Tüm png'leri kendi katmanlarında açmak için GIMP'den Dosya -> Katmanlar Olarak Aç'a gidin .

Katman olarak aç

Buradan katmanlar üzerinde düzenlemeler yapabilir ve bir kez yapılırsa, Dosya -> Farklı Ver'e gidebilirsiniz . İletişim kutusundan dosya türünü GIF olarak ayarladığınızdan emin olun.

Dosya türünü GIF olarak ayarla

Oradan GIF dışa aktarma seçeneklerine gidersiniz. ' Animasyon Olarak ' seçeneğini işaretleyin ve parametreleri gereken şekilde ayarlayın.

GIF dışa aktarma seçenekleri


7

ffmeg çözümü + test verileri

Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8'den itibaren, ffmpeg'in daha hızlı olduğunu ve çok daha az bellek kullandığını buldum .

En basit dönüşüm komutu:

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

Test verilerimi şu şekilde alabilirsin:

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

Test verileri şu şekilde üretildi: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292 ve 256 1024x1024 PNG görüntüler içeriyor.

Ve işte şimdi doğrudan tarayıcınızda oluşturabileceğiniz başka bir test verisi! https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718

görüntü tanımını buraya girin

ffmpegVurgulamak istediğim önemli seçenekler:

  • -pattern_type glob: görüntüleri seçmek için uygun bir yol

  • -framerate 60: giriş görüntülerinde 60 FPS olduğunu varsay ve aynı FPS’yi çıkar.

    ffmpeg Aksi takdirde bilemezsiniz, çünkü FPS verisi yoktur, çünkü video formatlarında olduğu gibi görüntülerdedir.

    256 giriş çerçevesinin bitirilmesi yaklaşık 4 saniye sürer.

    -r 15: isteğe bağlı. Her 4 görüntüden birini seçin, böylece boyutu küçültün ( 4 == 60 / 15).

    Bununla beraber identify out.gif, GIF sadece 64 kare içerdiğini söylüyor.

    Hala oynamak için 4 saniye sürüyor, bu yüzden işleri eşleştirmek için gecikme değişiyor.

  • -vf scale=512:-1: isteğe bağlı. Genişliği, ölçek yüksekliğini orantılı olarak ayarlayın, genellikle boyutu küçültmek ve yerden tasarruf sağlamak için.

ImageMagick'in çalışmasını sağlamak için önce disk ve bellek sınırlarını aşağıda /etc/ImageMagick-6/policy.xmlaçıklandığı şekilde değiştirmek zorunda kaldım : https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages

Ayrıca bakınız:

ImageMagick vs ffmpeg kıyaslaması

Komutları karşılaştırdım:

/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 \
;

Komutlar, karşılaştırmayı geçerli kılmak için mümkün olduğu kadar yakın çıktılar üretmek için oluşturulmuştur:

  • /usr/bin/time -v: azami hafıza kullanımını açıklandığı gibi kullanmak için kullanılır: https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process

  • -deconstruct: GIF görüntüleri, GIF'i küçültmek için önceki kareden yalnızca minimum değiştirilmiş bir dikdörtgen içerebilir.

    ffmpegbu farkları varsayılan olarak hesaplar, ancak kullanılmadıkça ImageMagick yapmaz -deconstruct.

    Temel olarak ImageMagick ile her zaman bu seçeneği kullanmak isteyeceksiniz.

    Aradaki farkı gözlemleyebiliriz:

    identify out.gif
    

    Sıkıştırılmış versiyonda, tüm çerçeveler bir öncekinden daha küçük boyutlara sahiptir, örneğin:

    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
    

    Bu örnekte, ikinci kare yalnızca 516x516tam 1024x1024 yerine değildir ve ofsetine yerleştirilir 252+257. Bu nedenle sadece orta üçgeni içerir.

    Ayrıca bkz: ImageMagick'i kullanarak animasyonlu GIF dosyasını nasıl yeniden boyutlandırabilirim?

  • -delay: 60FPS ile eşleşen değer ffmpeg. Dönüşüm performansı için önemli olmamalı, ancak risk almak istemiyorum.

Çıkış GIF'leri yaklaşık olarak aynı boyuta sahiptir ve görsel olarak özdeş görünürler.

ImageMagick'i alıyoruz:

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

ve ffmpeg için:

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

Bunu gördüğümüzden:

  • ImageMagick 2.6 Gb RAM kullandı ve yaklaşık 1 dakika sürdü
  • ffmpeg, 100Mb RAM kullandı ve 4 saniye sürdü.

Test donanımı: Lenovo ThinkPad P51 dizüstü bilgisayar , Intel Core i7-7820HQ, 32 GB (16 + 16) DDR4 2400 MHz SODIMM, 512 GB SSD PCIe TLC OPAL2.


Oy verildi ve beğendim !, büyük cevap, küçük bir takip sorum var. Çok yüksek kaliteli görüntülere sahip değilim ve kullanmadım -r ve -vkomutlar kullandım , yine de çıktı gif orijinal png dosyalarından çok daha düşük kalitede. Png dosyaları ile aynı gif kalitesi nasıl korunur?
astro123

Merhaba @ astro123 kalitesi nasıl daha düşük? Daha küçük görüntü boyutu veya daha az kare veya başka bir şey (GIF görünüşte kayıpsız kullanır, bu yüzden daha kötü sıkıştırma olamaz)? Dene -framerate 60 -r 60. Üretilen GIF ve giriş görüntülerini ImageMagick araçlarıyla inceleyin identifyve neler olup bittiğini anlamaya çalışın.
Ciro Santilli 事件 32 32 法轮功 六四 事件

4

İmagemagick paketinde bulunan convert adlı bir programı kullanabilirsiniz. Komut satırı tahrikli, ancak kullanımı çok kolay. Yazılım merkezinden yükleyin veya bir komut istemine gidin ve

sudo apt-get install imagemagick

Şimdi .gif dosyasını oluşturun.

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

* Yukarıdaki örneğin doğrudan Image Magick Örneklerinden olduğuna dikkat edin.


1
Döngüleyici bir GIF'de 40 PNG görüntüsünü nasıl yaparım? Hepsi klasör / home / fusion809 / Dökümanlar / Resimler
BH2017

1
@ BH2017: convert -delay 20 -loop 0 *.png out.gifbir döngüsel GIF yapar.
unutbu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.