3

私が取り組んでいるプロジェクトで libpng を使用しています。現在、フレームは 1 つずつメモリに読み込まれ、次のコマンドを使用して および 構造体にメモリを割り当てreadますinfo

pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
infoPtr = png_create_info_struct(pngPtr);

現在、画像がロードされた後、上記のポインターは以下を使用して破棄されます。

png_destroy_read_struct(&pngPtr, (png_infopp)0, (png_infopp)0);

ただし、pngファイルをメモリに読み込むプロセスが開始される前に(1回だけ)ポインターを生成し、すべてのPNGファイルが読み取られた後に一度破棄できるようにしたいと考えています。つまり、ポインターを一度作成して再利用できるようにしたいと考えています。

新しいメソッドで得られる問題は、最初の PNG ファイルが読み取られた後にポインターを破棄しないと、呼び出しが

png_read_info(pngPtr, infoPtr);

libPng が 2 番目の PNG ファイルを読み込もうとすると失敗します。後続のPNGファイルで再利用できるようにするためにリセットする必要があるポインターの特定のプロパティはありますか?

簡潔にするために、コードを入れすぎないようにしましたが、必要に応じてさらに多くのコードを提供できます。

4

2 に答える 2

0

APNG ファイルをサポートするために libpng にパッチが適用されると、構造体が再利用されます。リセット コードは pngrutil.c の末尾近くにあります。これにより、libpng-1.4.0 以降のアプリケーションからは見えない png_struct のメンバーに直接アクセスできることに注意してください。

しかし、それが価値があるかどうかはわかりません。png 構造体自体はそれほど大きくありません。メモリは主にピクセル データ (row_pointers が指す) によって消費されます。このピクセル データは既に制御されており、破棄する前に心ゆくまで再利用できます。

Web で「apng パッチ」を検索して見つけてください。http://sourceforge.netに2 つあります。1つは "apng" プロジェクトにあり、もう 1 つは "libpng-apng" プロジェクトにあります。

于 2014-02-23T20:38:46.800 に答える