Binlerce .pngs dönüştürün. Gif, `convert` çok fazla hafıza kullanır


29

Bir dizi png görüntüsünden nasıl animasyonlu bir gif oluşturulacağını soran soruların çoğu, ImageMagick komutunun bir türevini kullanmanızı önerir : convert

convert -delay 2 -loop 0 *.png animated.gif

Bununla birlikte, birkaç bin resmim var ve bu yüzden converttüm hafızamı kullanıyor, takas ediyor ve sonra çöküyor. Hangi alternatif yazılımı var, hangisi daha fazla bellek bilinçli? .gifDesteklenmiyorsa başka bir açık biçim kullanabilirim ve bir CLI aracını tercih ederim.


1
* .Png dosyalarını yönetilebilir parçalara bölmeye ne dersiniz? Diyelim ki tüm dosya isimleri bir rakamla başlıyor, sonra convert -delay 2 -loop 0 0*.png animated.gifsadece '0' ile başlayan dosyaları dönüştürebiliyoruz. Ve bunun gibi.
Jos

2
Yani her .png 1 Mb'lık düzende mi? Bu durumda, tek düşünebildiğim, .png dosyalarını daha düşük bir çözünürlüğe veya renk derinliğine dönüştürmek, daha küçük hale getirmek.
Jos

10
Başka bir açık format kullanabileceğinizi söylüyorsunuz. Bana göre gif binlerce kare için tam olarak en iyi format değil. Bunun yerine Ogg Theora ile bir video kodlamayı düşündünüz mü?
rekado

1
Belki GIF kullanmak istiyorsanız , gifsicle bir göz atın ? (Diğerleri söylediler, ancak bu GIF için yapıldı ne değildir; OGG daha iyi bir seçim olacaktır.)
wchargin

1
Yeniden. "tüm belleğin gittiği yer": 65 Kb, sıkıştırılmış bir görüntünün dosya boyutudur. Sıkıştırılmamışsa, görüntü yaklaşık 4 x genişlik x yükseklik bayt alır, bu nedenle 1024x768 bir görüntü ~ 3Mb RAM alır. "Birkaç bin" ile çarpın ve hafızanın nereye gittiğini göreceksiniz ...
Sergey

Yanıtlar:


33

Video yapmaya çalışıyor gibisin. Bu durumda uygun bir video formatı kullanırdım.

Bu durumda, PNG dosyalarını tek tek H.264 videoya dönüştürmek için ffmpeg kullanırım . Ffmpeg saatlerce sürebilen videolarla çalışmak üzere yapıldığından, binlerce görüntünüzle bir problemi olmamalıdır. Animasyonlu gif yerine H.264 kullanmak, görüntü kalitesinde büyük bir iyileşme ile sonuçlanacaktır .

Böyle bir şey sizin için çalışması gerekir:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2: Bu, kare hızını yarım FPS'ye veya kare başına 2 saniyeye ayarlar.
  • -i img%04d.pngBu dosyaları okumak için ffmpeg söyler img0000.pnggerçi img9999.png.
  • -c:v libx264: Video codec libx264 kullanın.
    • İsterseniz burada video sıkıştırma parametrelerini belirtebilirsiniz:
    • -crf <number>: Kalite ayarı. 0 - 51 arasındadır. 23 varsayılandır. 0, oldukça yüksek bant genişliği olacak gerçek kayıpsız kodlamadır. 18 neredeyse görsel olarak kayıpsız.
  • -r 30: Çıkış kare hızını 30 FPS'ye ayarlayın. Girdi görüntülerinin her biri çıktıyı burada belirttiğiniz şekilde yapmak için çoğaltılacaktır. Bu parametreyi kapalı bırakabilirsiniz ve çıktı dosyası giriş kare hızında olacaktır, ancak şu anda denediğimde ortaya çıkan film düzgün görüntülenmedi.
  • out.mp4: Çıktı dosya adı.

Referanslar:


1
Frantique'nin genişlemesi önceki günden itibaren genişledi.
Elder Geek

İşte somut deney verileri ile ImageMagick kriter vs basit ffmpeg geçerli: askubuntu.com/questions/648244/...
Ciro Santilli新疆改造中心法轮功六四事件

11

Şahsen, hepsini bir kerede yerine sınırlı sayıda dosyada başlatırdım. Örneğin, bunun gibi bir şey:

#!/usr/bin/env bash

## Collect all png files in the files array
files=( *png )
## How many should be done at once
batch=50

## Read the array in batches of $batch
for (( i=0; $i<${#files[@]}; i+=$batch ))
do
    ## Convert this batch
    convert -delay 2 -loop 0 "${files[@]:$i:$batch}" animated.$i.gif
done

## Now, merge them into a single file
convert  animated.*.gif all.gif

8

Kullanılan -limit memory 1GiBhafıza miktarını sınırlamak için kullanın convert.

1000'lerce görüntü, çoğu bilgisayarın görüntülemek için mücadele edeceği çok büyük bir GIF oluşturur. Animasyonlu GIF'lerimi mümkün olduğunda 200 görüntünün altında tutarım. Ne kadar az, o kadar iyi. Resimlerinizi numaralandırırsanız, bu komut tek sayılı resimleri siler rm *[13579].png.

İşte bir film sahnesinden bir animasyonlu GIF oluşturmak için tipik iş akışım:

avconv -ss 00:26:00 -i someMovie.mpg %5d.png
rm  *[13579].png
convert -limit memory 1GiB -loop 0 -layers optimize -resize 400 *.png output.gif

1
Teşekkürler, bu çözüm iyi çalışıyor. Ayrıca bakınız /etc/ImageMagick-6/policy.xml izin bellek sınırlarını artırmak için gerekli olabilir github.com/ImageMagick/ImageMagick/issues/... fazla bilgi için
Louis Gagnon

4

.gifDesteklenmiyorsa başka bir açık biçim kullanabilirim

Belki de APNG sizin için faydalıdır . Firefox dahil, ancak şu anda Chrome ve IE hariç olmak üzere bazı tarayıcılar tarafından desteklenmektedir . Yalnızca bir PNG uzantısı olduğundan, PNG'leri APNG'ye dönüştürmek çok kolaydır. Apngasm aracı yapabilir. Ancak format o kadar basit ki, yakın zamanda Sage için kendim bir APNG derleyici yazdım. Bu kodu uyarlamak bir alternatif olabilir.


APNG'nin standart olmadığını ve 7 yıldan beri olmasına rağmen hala çok belirsiz olduğunu belirtmek isterim.
Pharap

Bilimsel bir gösteri için, onun için kullanılan tarayıcıyı seçebileceğiniz yerler, bu hala basit ve sağlam bir çözüm olabilir.
MvG

Gösteriyi kimin görmesi gerektiğine bağlı. Kopyaları izleyicilere dağıtmak çok iyi olmaz ve ardından üçte ikisi gidip sadece görüntülemek için Firefox'u indirmek zorunda kalır. Önemli bir bilimsel gösteri yapmış olsam, yapmak istediğim türden bir izlenim değil. Yalnızca gösterinin bir parçası olarak görülmesi isteniyorsa, yeterince adil olabilir, ancak diğer durumlar için uygun olmayabilir.
Pharap

3

Binlerce png-s'niz varsa, anigif formatı gariptir. Bunu kullanarak bunu yapardım avconv:

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov

Bu yaklaşımın, daha sonra Grafik Değişim Biçimi ile imkansız olan seslendirme veya müzik seslerinde karışıklığa neden olabileceğiniz avantajı vardır.
Elder Geek

2

gifsicle , GIF animasyonlarını işlemek için kullanılan bir komut satırı yardımcı programıdır. Eğer hız için hafıza takas etmeye istekli iseniz, - conserve-hafıza anahtarını kullanabilirsiniz.


Bunu şöyle söyleyeyim: Gifsicle zaten ImageMagick'ten daha küçük bir alana sahipti - elinizdeki görev için hala çok fazla bellek kullandığını görürseniz , o zaman
conserve

Ohh, sanırım söylediklerinizi yanlış anladım, anahtarın daha fazla hafıza kullanacağı ve bu da pek bir anlam ifade etmiyor. boşver.
curiousdannii

2

Diğer cevaplara ek olarak: bir GIF dosyası oluşturmak istediğinizden, resmi bir web sayfasında görüntülemek istediğinizi varsayıyorum. Öyleyse, PNG'lerinizi hiç dönüştürmeden rahatsız olmaz. Sadece "javascript slayt gösterisi" için gidin ve milyonlarca ücretsiz komut dosyasından birini kullanın. Ya da kendi yaz, bu gerçekten önemsiz.

Bu şekilde yapmanın faydaları:

  • herhangi bir zamanda tarayıcıya yalnızca bir resim yüklenir, slayt gösterisi hızlı başlar ve kullanıcının makinesinde fazla RAM tüketmez.

  • çözüm milyonlarca görüntüye ölçeklenir. Veya milyarlarca, hepsini izlemeye yetecek kadar sabırlıysanız :)

  • Duraklatmak, geri almak, gecikmeyi değiştirmek veya belirli bir çerçeveye gitmek için sayfanıza kontroller ekleyebilirsiniz.


Teşekkürler Sergey. Aslında bu, bir web sitesinde gösterilmek için değildir. Yine de fikir için +1.
dotancohen
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.