web-dev-qa-db-ja.com

何千もの.pngをアニメーション化された.gifに変換します。`convert`はメモリを使いすぎます

多くの 質問を尋ねる作成方法アニメーションgifセットからpng画像の ImageMagickのconvertコマンドのバリアントを使用することを提案します。

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

しかし、私は数千の画像を持っているため、convertはすべてのメモリを使い果たし、スワップしてからクラッシュします。 よりメモリを意識した代替ソフトウェアはありますか?.gifがサポートされていない場合、別のオープンフォーマットを使用できますが、 CLIツール。

28
dotancohen

ビデオを作成しようとしているようです。その場合は、適切なビデオ形式を使用します。

この場合、 ffmpeg を使用して、個々のPNGファイルをH.264ビデオに変換します。 ffmpegは数時間かかる可能性のあるビデオで動作するように作られているため、数千の画像に問題はないはずです。アニメーションGIFの代わりにH.264を使用すると、画質がvast向上します。

このような何かがあなたのために働くはずです:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2:これは、フレームレートをFPSの半分、つまりフレームあたり2秒に設定します。
  • -i img%04d.png:これは、ファイルimg0000.pngimg9999.pngを読み取るようにffmpegに指示します。
  • -c:v libx264:ビデオコーデックlibx264を使用します。
    • 必要に応じて、ここでビデオ圧縮パラメーターを指定できます。
    • -crf <number>:品質設定。 0〜51。23がデフォルトです。 0は真のロスレスエンコーディングであり、非常に高い帯域幅になります。 18はほとんど視覚的にロスレスです。
  • -r 30:出力フレームレートを30 FPSに設定します。ここで指定したものを出力するために、各入力画像が複製されます。このパラメーターをオフのままにすると、出力ファイルは入力フレームレートになりますが、結果のムービーは今試したときに正しく表示されませんでした。
  • out.mp4:出力ファイル名。

参照:

33
David Yaw

個人的には、一度に全部ではなく、限られた数のファイルで起動するだけです。たとえば、次のようなもの:

#!/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
11
terdon

-limit memory 1GiBを使用して、convertが使用するメモリ量を制限します。

何千もの画像は、ほとんどのコンピューターが表示に苦労する巨大なGIFを作成します。可能であれば、アニメーションGIFを200画像未満に保ちます。少ないほど良い。画像に番号を付けると、このコマンドは奇数番号の画像rm *[13579].pngを削除します。

映画のシーンからアニメーションGIFを作成するための典型的なワークフローは次のとおりです。

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
7
PLA

.gifがサポートされていない場合は、別のオープン形式を使用できます

おそらく APNG が役に立つでしょう。 Firefoxを含むが、現時点ではChromeとIEを除く 一部のブラウザー でサポートされています。これは単なるPNG拡張なので、veryPNGをAPNGに変換するのは簡単です。 apngasm ツールはそれを行うことができます。しかし、フォーマットは非常に単純なので、最近、Sage向けにAPNGアセンブラーを自分で作成しました。適応 そのコード が代替手段になります。

4
MvG

数千のpng-sがある場合、anigif形式は奇妙です。 avconvを使用して、次のようにします。

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

他の答えに加えて:GIFファイルを作成したいので、Webページに画像を表示したいと思います。もしそうなら、私はあなたのPNGをまったく気にすることはありません。 「javascript slideshow」をグーグルで検索し、数百万の無料スクリプトのいずれかを使用します。または、独自に作成します。これは本当に簡単です。

この方法で行う利点は次のとおりです。

  • ブラウザに読み込まれる画像は常に1つだけです。スライドショーはすぐに開始され、ユーザーのマシンでRAMをあまり消費しません。

  • このソリューションは数百万の画像に対応します。数十億、あなたがそれらすべてを見るのに十分忍耐強くあるなら:)

  • ページにコントロールを追加して、一時停止、巻き戻し、遅延の変更、または特定のフレームに移動できます。

2
Sergey

gifsicle は、GIFアニメーションを処理するコマンドラインユーティリティです。メモリを速度と引き換えに使用する場合は、-conserve-memoryスイッチを使用できます。

2
codehead