質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2986閲覧

gifの繰り返し回数の指定がわからない

katahiromz

総合スコア186

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/07/12 02:50

編集2015/07/12 03:10

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
katsumiy

総合スコア479

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katahiromz

2015/07/19 03:26

フレーム数ではなく、繰り返し回数です。
katahiromz

2015/07/23 05:02

拡張ブロックの追加位置が間違っていました。 最初のフレームに追加しないといけなかったみたいです。 みなさまありがとうございました。
guest

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

KenTerada

総合スコア751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問