perlでは可能でしょうか。
http://www.nekopps.com/article/gif_format/
このページでは、書いた人が自作した perl スクリプトを使って、GIF ファイルの中身を見せています。
「GIFストリームの流れ」のブロックにリンクがありますが、ちょっと分かりにくいので、
スクリプトを指している URL を抜きました。
http://www.nekopps.com/article/gif_format/gif_analyzer.lzh
幾つかのサブスクリプトに分かれていますが、graphic_control_extension.pl の
readData サブルーチンで読みこんでいる $delay_time が遅延時間になっているようです。
c++ のプログラムで取得する方法です。
http://d.hatena.ne.jp/yu-hr/20090201/1233494522
で、GDI+ を使った方法がコードで載ってます。
内容を理解するには、以下のページも合わせて見ておく必要がありそうです。
http://d.hatena.ne.jp/yu-hr/20090131/1233349619
http://msdn.microsoft.com/en-us/library/ms533832%28v=vs.85%29.aspx
また、先のページの追記にある
GDI+を使わずにでデコードしてるサンプルを発見した
は、www.cplusplus.com からは無くなってますが、Internet Archive からサルベージすることができます。
http://web.archive.org/web/20101123022922/http://cplusplus.com/src/
「GIF View」でダウンロードできる wingif.zip にある winimage.cpp が参考になります。
// **************************************************************************** // * LoadGIF * // * Load a GIF File into the C_ImageSet object * // * (c) Nov 2000, Juan Soulie <jsoulie@cplusplus.com> * // **************************************************************************** int C_ImageSet::LoadGIF (char * szFileName) /* 省略 */ // Fill NextImage Data NextImage->xPos = gifid.xPos; NextImage->yPos = gifid.yPos; if (GraphicExtensionFound) { NextImage->Transparent= (gifgce.PackedFields&0x01) ? gifgce.Transparent : -1; NextImage->Transparency= (gifgce.PackedFields&0x1c)>1 ? 1 : 0; NextImage->Delay = gifgce.Delay*10; /* ★これ! */ }
http://homepage3.nifty.com/g-dragon/gif/gif_spec.html
このページは、GIF89a のフォーマットの説明ですが、
6.グラフィック制御拡張 (Graphic Control Extension)
(省略)
vii) 遅延時間 (Delay Time)
もし、0でなければ、この欄には、データ・ストリームの処理を続行す
る前に待たなければならない時間が百分の1秒単位で指定されています。
時計は、グラフィック描画後すぐに刻みはじめます。この欄は、利用者入
力フラグ欄と共に用いられ得ます。
を、ひとつずつ読みこんで、その合計がアニメーションGIF の再生時間、ということになります。