giflib の使い方 (4)
読み込みや書き出しの方法として、大雑把に2つあります。
順次読み出し
giflib/util 以下の gifrotat.c と gifrsize.c で使っている方式です。
while ((DGifGetRecordType(&GifFile, &RecordType)) && (RecordType != TERMINATE_RECORD_TYPE)) { switch(RecordType) { case SCREEN_DESC_RECORD_TYPE: DGifGetScreenDesc(&GifFile); break; case IMAGE_DESC_RECORD_TYPE: DGifGetImageDesc(&GifFile); break; case EXTENSION_RECORD_TYPE: DGifGetExtension(&GifFile, &GifExtCode, &GifExtension); while ((GifExtensionNext != NULL) && (DGifGetExtensionNext(&GifFile, &GifExtension) == GIF_ERROR)) ; break; default: break; }
こんな感じ。
尚、case の中で DGifGet... 系を呼ばないと、次の DGifGetRecordType で失敗します。
parse 処理を想像すれば仕方ないですが、途中 parse を飛ばせないって事で。
出力は、D(Decode) を E(Encode)に、そして Get を Put に変更すれば大体 OK.
まとめ読み出し
DGifSlurp(&GifFile);
出力は
EGifSpew(&GifFile);
どちらもその関数の中で順次読み出し/書き出しをしてるだけ。