アニメーションgifのループ回数をimagemagickで取得する方法はありますでしょうか。

またはperlやcpanのモジュールで取得する方法ありますでしょうか?

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2011/09/29 12:16:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

前回の回答 に続いて、

http://www.nekopps.com/article/gif_format/gif_analyzer.lzh

を使います。


「ループ回数」は、GIF89a仕様書抜粋

7.NETSCAPE2.0 アプリケーション拡張 (Netscape Apprication Extension)」で

言及されている「繰り返し拡張データ副ブロック」だと思います。


gif_analyzer では、application_extension.pl が該当するブロックを読みこんでいるクラスですが、データの内容は読み飛ばしているようです。

readData メソッドの読み飛ばし (seek) しているところを、

    # count sub blocks
    while(1){
        read IN, $sub_block_size, 1;
        my $size = hex(unpack("H2", $sub_block_size));
        if($size > 0){
            $total_number++;
            seek IN, $size, 1;    # ★ここ!
        }else{
            last;
        }
    }

以下のように書き換えます。

$loop_count = undef;

sub readData
{
    ...
    # count sub blocks
    while(1){
        read IN, $sub_block_size, 1;
        my $size = hex(unpack("H2", $sub_block_size));
        if($size > 0){
            $total_number++;

            read IN, $packed_fields, 1;
            my $dec = unpack("C", $packed_fields);
            my $type = $dec & 0x07;

            if($type == 1){
                read IN, $loop_count, 2;
            }else{
                seek IN, $size - 1, 1;
            }

        }else{
            last;
        }
    }

sub printData
{
    ...
    print OUT ...
        "Loop count: ".unpack("v",$loop_count),
        ...

perl は、あまり好きな言語じゃなくて、普段、あまり使わないので、正直、書き換えたコードには自信がありません。

多分、studio2021 さんの方が perl は得意だと思うので、適宜、変更してください m(_ _)m

  • id:tdoi
    確認してませんが、関数名的には、

    Gmagick::getimageiterations
    (http://php.net/manual/en/gmagick.getimageiterations.php)

    で取れるのではないかなぁと思います。

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

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

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

回答リクエストを送信したユーザーはいません