imagemagickやその他プログラム的な方法でアニメーションgifの秒数を取得する方法はありますか?

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2011/09/22 11:06:19
  • 終了:2011/09/27 18:57:07

ベストアンサー

id:a-kuma3 No.2

a-kuma3回答回数4441ベストアンサー獲得回数18252011/09/22 16:38:49

ポイント100pt

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 が遅延時間になっているようです。

その他の回答(1件)

id:a-kuma3 No.1

a-kuma3回答回数4441ベストアンサー獲得回数18252011/09/22 14:20:34

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+を使わずにでデコードしてるサンプルを発見した

http://www.cplusplus.com/src/

は、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 の再生時間、ということになります。

id:a-kuma3 No.2

a-kuma3回答回数4441ベストアンサー獲得回数18252011/09/22 16:38:49ここでベストアンサー

ポイント100pt

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 が遅延時間になっているようです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません