gif_libの画像処理に関する質問です。
https://github.com/katahiromz/imaio_bmp/blob/master/imaio_win.c
このファイルのii_anigif_load_common関数(3266行目)とii_anigif_save_common関数(3540行目)を参照して下さい。
どうやら、アニメーションGIF画像ファイルの繰り返し回数が正常に取得・設定できていないようです。
どういう風に修正すればいいのか教えて下さい。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
wiki にある、地球のGIF Animation に対して giflib 5.0.5 を使って、以下のコードを実行してみましたが、
正しく、44 というフレーム数が取得できましたよ。
https://upload.wikimedia.org/wikipedia/commons/2/2c/Rotating_earth_%28large%29.gif
追記
NETSCAPE2.0拡張ですね。それなら、そう書かないとわかりませんよ。もっと質問の仕方も勉強しましょう。
また、もっと感謝の気持ちを表さないと、回答をもらえなくなりますよ。
以下のコードで、繰り返し回数が取れました。地球のGIF Animation では0xffff = 無限繰り返しになっています。0xffff なのをとれていないと誤解していたか、元のコードでは >=3 で繰り返しのブロックと判定していましたので、delay のブロックも繰り返しのブロックと認識されて、上書きされてしまったのではないでしょうか。
lang
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <gif_lib.h> 5 6int main(int argc, char *argv[]) 7{ 8 int error; 9 SavedImage *image; 10 int loop_count = -1; 11 int i, k; 12 13 GifFileType *gifFile = DGifOpenFileName("C:\\temp\\earth.gif", &error); 14 DGifSlurp(gifFile); 15 printf("count %d\n", gifFile->ImageCount); 16 17 for (i = 0; i < gifFile->ImageCount; ++i) 18 { 19 image = &(gifFile->SavedImages[i]); 20 for (k = 0; k < image->ExtensionBlockCount; ++k) 21 { 22 ExtensionBlock *block = &image->ExtensionBlocks[k]; 23 switch (block->Function) 24 { 25 case APPLICATION_EXT_FUNC_CODE: 26 if (block->ByteCount == 11) 27 { 28 if (memcmp(block->Bytes, "NETSCAPE2.0", 11) == 0) 29 { 30 if (i + 1 < image->ExtensionBlockCount) 31 { 32 ++block; 33 if ((block->ByteCount == 3) && ((block->Bytes[0] & 7) == 1)) 34 { 35 loop_count = 36 ((block->Bytes[1] & 0xFF) | 37 ((block->Bytes[2] & 0xFF) << 8)); 38 printf("loop count found %d\n", loop_count); 39 } 40 } 41 } 42 } 43 break; 44 } 45 } 46 } 47}
投稿2015/07/14 12:21
編集2015/07/19 08:54総合スコア479
0
GIFにもバージョン,種類があって,フォーマットも違います.
繰り返し回数についての機能は本来のGIFには含まれておらず,
NETSCAPEというウェブブラウザが決めた拡張機能のようです.
そのためすべてのウェブブラウザや画像ビューワが対応しているわけではありません.
下記リンクのApplication Extensionについての説明をご覧になってください.
GIF画像ファイル フォーマット - 略して仮。
これを見ると,Application Extension(AE)ブロックの判定は最初から14バイト分で行えることがわかります.
ソースコード3383行以降が,loadする時にこのAEブロックを処理する部分です.
フォーマットを見ると,AEブロックの17,18バイト目にループ回数が格納されていることになります.
そして3393行以降で,「anigif->loop_count」にその回数を代入しています.
またsaveする時にloop_countを代入するコードは3786行目以降です.
ソースコード上は繰り返し回数を扱う機能が存在しているように見えるので,
①katahiromzさんが使っているウェブブラウザか画像ビューワが繰り返しに対応していない
②このプログラムにバグがある
のどちらかだと思います.
<解決策>
まずは繰り返し指定のあるGIFアニメーションを正しく処理すると分かっているソフトウェアで開いてみて下さい.
慣れているならば,saveしたGIFファイルをバイナリエディタで開いて,AEブロックを探してみてください.(AEブロックがあるか,ループ回数を指定するバイト部分はどうなっているかを確認)
プログラムを変えてデバッグする場合は,print系の関数を使って,「anigif->loop_count」に入っている値を表示させてみてください.
投稿2015/07/13 17:00
総合スコア751
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/19 03:26
2015/07/23 05:02