2016-04-02 29 views
0

私は非常に高解像度の画像(フラクタル)を生成するC++プログラムを作成しました。 私はfstreamを使ってすべてのデータを.ppmファイルに保存します。大量のppmファイルをJPEG/JPG/PNGに変換しますか?

すべてうまく動作しますが、実際に高解像度(38400x21600)になると、ppmファイルは〜8ギガバイトになります。 しかし、私の16ギガバイトのRAMでは、まだその画像を変換することができません。私はコンバータのカップルをダウンロードしましたが、彼らはそれを処理することができませんでした。私が "export as ..."しようとすると、Gimpでもクラッシュしました。

本当に大きなppmファイルを処理できる優れたコンバータを知っている人はいますか?実際には、100ギガバイトを超えたいと思っています。私はそれが遅い場合は気にしない、それはちょうどうまくいくはずです。

このようなコンバータがない場合:より良い方法でstd :: ofstreamに移行する方法はありますか?多分、PNGファイルを自動的に生成するライブラリはありますか?

ありがとうございました!

編集:また、これらの大きな画像を保存するのに最適な形式は何かを尋ねました。私は研究し、JPEGは非常にきれいに見える(小さなサイズ、まだ良い品質)。しかし、より良いフォーマットがあるかもしれませんか?お知らせ下さい。ありがとう

+0

「.ppm」は非常に非効率的である。 C++コードのlibpngまたはlibjpegを使用して、目的の出力形式に直接書き込むことができます。 – Thomas

+1

ImageMagickから 'convert'ユーティリティを試しましたか?そのバンドルは一般的にかなり強力です。 – Thomas

+0

いいえ、私はそれをチェックします。助けてくれてありがとう –

答えて

0

私は、より効率的で高速な解決策は、もっと多くのRAMを手に入れることであると示唆しています - 128GBは、最近は非常に高価ではない(またはスワップスペースを追加する)。

+3

あなたのスタイルが好きです:-) –

1

少数の考えは...

38400x21600の8ビットのPPMファイルには、2.3ギガバイトを取る必要があります。同じサイズの16ビットPPMファイルの場合は2倍の4.6GBが必要なので、どこから8GBが得られるのか分かりません。

VIPS私は38400x21600 PPMファイルを取得し、ターミナル(コマンドライン)で次のコマンドを使用すると、変換を行うために58MBのRAMでピークに達するのがわかりますPPMからJPEGへ...

鉱山はかなりあるので、あなたは、あなたの結果は非常に小さいことが期待されるので、合理的なスペックのiMacに31秒かかりますし、私の(ランダム)のデータから、480メガバイトのファイルを生成します
vips jpegsave fractal.ppm fractal.jpg --vips-leak 
memory: high-water mark 58.13 MB 

非圧縮性。

はImageMagickには、他の一方で、メモリのワーキングセット1.1ギガバイトのピークを取り、74秒で同じ変換を行います:ベビーXのリソースコンパイラへ

/usr/bin/time -l convert fractal.ppm fractal.jpg 

     73.81 real  69.46 user   4.16 sys 
11616595968 maximum resident set size 
     0 average shared memory size 
     0 average unshared data size 
     0 average unshared stack size 
    4051124 page reclaims 
     4 page faults 
     0 swaps 
     0 block input operations 
     106 block output operations 
     0 messages sent 
     0 messages received 
     0 signals received 
     9 voluntary context switches 
    11791 involuntary context switches 
+0

私はImageMagickを試してみました。イメージの表示に関するエラーメッセージが表示されても、PNGファイル(0,6ギガバイト)が生成されます。ありがとう、私はそれを使用することができます。 (私はVIPSも試してみます)。 –

0

行くと、savejpegをJPEGエンコーダをダウンロードしてください。 c。それはメモリにフラットでなければならないrgbバッファを必要とする。それをハックし、16x16ブロックのストリームを受け入れるバージョンに置き換えてください。次に、一度に16ピクセルの高帯にロードする独自のppmローダーを作成します。

システムは、メモリに収まらない巨大な画像にスケールアップされます。あなたはそれらを表示する方法を私は知らない。しかし、JPEGは仕様になります。

https://github.com/MalcolmMcLean/babyxrc

関連する問題