0

画像ファイルのバッチを読み込み、それらのサイズを変更する必要があります。C++ で FreeImage.dll を使用して実行しています。各バッチには、JPG ファイルと TIF ファイルが含まれています。問題は、exe が最初のバッチを正確に処理することですが、それ以降のバッチでは、いくつかのファイル、特に JPG ファイルをスキップし始めます。

各バッチの前後に FreeImage の初期化と初期化解除を試みましたが、それでも機能しません。

誰でもこれを行う方法を提案できますか? 他の無料の画像処理ライブラリを使用する必要があるとしても、それで問題ありません。

4

1 に答える 1

0

FreeImage がメモリをリークしているか、FreeImage を呼び出すコードでメモリが断片化されているように聞こえます。プロセスの有効期間の早い段階では、十分な連続したメモリがまだ利用可能であり、すべてが正常に動作します。後で、大きなカラー画像で失敗し始めます。特に jpeg が失敗する理由は、ディスク上のサイズがはるかに小さい場合でも、カラー イメージのメモリ イメージが常に 1 ピクセルあたり少なくとも 24 ビット (おそらく 32 ビット) かかるためです。あなたの tiff 画像はおそらく白黒で、1 ピクセルあたり 1 ビットしか必要としません。

処理された各イメージのすべてのメモリが (FreeImage.dll または独自のプログラムで) 解放されていない場合、使用中のメモリの量がわずかであっても、継続的に実行されているプロセスで問題が発生します。問題は、メモリがフラグメント化され、OS がフラグメントを単一プロセスのメモリ空間に再配置できないことです。大きな画像をロードするには、大きな連続したメモリ ブロックが必要であり、断片化されたメモリでは、全体的な空き領域がまだ十分であっても、十分な大きさの空き「穴」がない場合があります。簡単な回避策は、処理するイメージごとに個別のプロセスを生成し、メイン プロセスでタスク管理のみを行うことです。ただし、これによりプログラムが少し複雑になり、ワーカー プロセスがハングする可能性がある場合、安定性の問題が発生する可能性があります。

于 2011-10-20T12:51:57.550 に答える