回答編集履歴

1

追記

2015/07/19 08:54

投稿

katsumiy
katsumiy

スコア479

test CHANGED
@@ -8,11 +8,23 @@
8
8
 
9
9
 
10
10
 
11
+ 追記
12
+
13
+ NETSCAPE2.0拡張ですね。それなら、そう書かないとわかりませんよ。もっと質問の仕方も勉強しましょう。
14
+
15
+ また、もっと感謝の気持ちを表さないと、回答をもらえなくなりますよ。
16
+
17
+ 以下のコードで、繰り返し回数が取れました。地球のGIF Animation では0xffff = 無限繰り返しになっています。0xffff なのをとれていないと誤解していたか、元のコードでは >=3 で繰り返しのブロックと判定していましたので、delay のブロックも繰り返しのブロックと認識されて、上書きされてしまったのではないでしょうか。
18
+
19
+
20
+
11
21
  ```lang-C
12
22
 
13
23
  #include <stdio.h>
14
24
 
15
25
  #include <stdlib.h>
26
+
27
+ #include <string.h>
16
28
 
17
29
  #include <gif_lib.h>
18
30
 
@@ -24,6 +36,12 @@
24
36
 
25
37
  int error;
26
38
 
39
+ SavedImage *image;
40
+
41
+ int loop_count = -1;
42
+
43
+ int i, k;
44
+
27
45
 
28
46
 
29
47
  GifFileType *gifFile = DGifOpenFileName("C:\\temp\\earth.gif", &error);
@@ -34,6 +52,66 @@
34
52
 
35
53
 
36
54
 
55
+ for (i = 0; i < gifFile->ImageCount; ++i)
56
+
57
+ {
58
+
59
+ image = &(gifFile->SavedImages[i]);
60
+
61
+ for (k = 0; k < image->ExtensionBlockCount; ++k)
62
+
63
+ {
64
+
65
+ ExtensionBlock *block = &image->ExtensionBlocks[k];
66
+
67
+ switch (block->Function)
68
+
69
+ {
70
+
71
+ case APPLICATION_EXT_FUNC_CODE:
72
+
73
+ if (block->ByteCount == 11)
74
+
75
+ {
76
+
77
+ if (memcmp(block->Bytes, "NETSCAPE2.0", 11) == 0)
78
+
79
+ {
80
+
81
+ if (i + 1 < image->ExtensionBlockCount)
82
+
83
+ {
84
+
85
+ ++block;
86
+
87
+ if ((block->ByteCount == 3) && ((block->Bytes[0] & 7) == 1))
88
+
89
+ {
90
+
91
+ loop_count =
92
+
93
+ ((block->Bytes[1] & 0xFF) |
94
+
95
+ ((block->Bytes[2] & 0xFF) << 8));
96
+
97
+ printf("loop count found %d\n", loop_count);
98
+
99
+ }
100
+
101
+ }
102
+
103
+ }
104
+
105
+ }
106
+
107
+ break;
108
+
109
+ }
110
+
111
+ }
112
+
113
+ }
114
+
37
115
  }
38
116
 
39
117
  ```