はじめに
今更ながらアニメーション GIF を作ることになった。かつて GIF ファイルは特許関連で揉めた経緯から何となく使用を忌避するきらいがあったが,とっくの昔に特許は失効していることや,後発の軽量動画ファイルフォーマットが普及しなかったことから割と最近よく使われるようになった感じがする。
専用のソフトを使わなくてもアニメーション GIF は WEB サービスで作れるようだが,何となく不安がある。かつて TIFF ファイルの分割・結合プログラムを作ったこともあり,アニメーション GIF の作成プログラムも簡単に作れるんじゃない?
まずは GIF ファイルフォーマットの勉強がてら GIF ファイルの情報を表示するプログラムをささっと手早く作ることにした。
基本方針
-
ささっと手早く作りたいので WSH(Windows Script Host)で作成する。WSH の言語としては JavaScript または VBScript の二択あるが,今回は VBcript を選択した。
-
バイナリファイルを取り扱う愛用の自作クラスを用いる。
-
アニメーション GIF の仕様を含む GIF89a 形式までを対象とするが,テキスト情報やコメント情報などの拡張ブロックは適当なサンプルが入手できなかったため未対応とする。
GIF ファイルフォーマット
以下のサイトが参考になった。
愛用の自作クラスを使う
BinaryFile
というバイナリファイルを取り扱う自作のクラスを使う。ファイルをバイナリとして読み込み,指定した文字列に応じた整数配列を返す。配列の要素数=文字列の長さとなる。GIF ファイルのヘッダを読み込む場合,下記のようになる。
Dim oGIF: Set oGIF = New BinaryFile
oGIF.Open "sample.gif"
Dim a: a = oGIF.ReadPack("ccccccssccc")
ReadPack()
の引数文字列は以下の6種類の文字のみ受け付ける。
文字 | 内容 |
---|---|
c | 1byte整数(リトルエンディアン) |
C | 1byte整数(ビッグエンディアン) |
s | 2byte整数(リトルエンディアン) |
S | 2byte整数(ビッグエンディアン) |
l | 4byte整数(リトルエンディアン) |
L | 4byte整数(ビッグエンディアン) |
perl の pack/unpack 関数のようなもの,といえば分かって頂けるだろうか?
実装コード
GIF ファイルの情報を表示するだけなので,GIF ファイルフォーマットさえ承知していればプログラムとしてはさほど難しくない。とはいえダラダラと作っていたらそれなりに長くなってしまった。
GIFinfo.WSF(詳しくはコチラ)
<package>
<job>
<script language="VBScript" src="CommonLibrary.VBS"></script>
<script language="VBScript">
Option Explicit
'-------------------------------------------------------------------------------
' グローバル変数
'-------------------------------------------------------------------------------
Dim oGIF: Set oGIF = New BinaryFile
Dim sFilename: sFilename = ""
Dim sOption: sOption = ""
'-------------------------------------------------------------------------------
' メイン関数の呼び出し
'-------------------------------------------------------------------------------
MainFunction
'-------------------------------------------------------------------------------
' ヘルプメッセージ
'-------------------------------------------------------------------------------
Sub Usage
WScript.StdErr.WriteLine "GIF ファイルの情報を表示します。"
WScript.StdErr.WriteLine ""
WScript.StdErr.WriteLine "GIFinfo(.WSF) (オプション) [ファイル名(.GIF)]"
WScript.StdErr.WriteLine ""
WScript.StdErr.WriteLine "<オプション>"
WScript.StdErr.WriteLine " /S 画像ファイルの横幅と高さを示します。"
WScript.StdErr.WriteLine " /W 画像ファイルの横幅を示します。"
WScript.StdErr.WriteLine " /H 画像ファイルの高さを表示します。"
WScript.StdErr.WriteLine " /P パレットを表示します。"
WScript.Quit
End Sub
'-------------------------------------------------------------------------------
' コマンドライン解析
'-------------------------------------------------------------------------------
Sub GetCommandLine
'---------------------------------------------------------------------------
' ヘルプメッセージ
'---------------------------------------------------------------------------
Dim oArg: Set oArg = WScript.Arguments.Unnamed
If oArg.Count < 1 Then Usage
'---------------------------------------------------------------------------
' GIF ファイルのオープン
'---------------------------------------------------------------------------
Dim oFS: Set oFS = New FileSystemObject
If oFS.FileExists(oArg(0)) Then
sFilename = oArg(0)
oGIF.Open sFilename
Else
WScript.StdErr.WriteLine "ファイル " & oArg(0) & " が存在しません!!"
WScript.Quit
End If
'---------------------------------------------------------------------------
' オプション解析
'---------------------------------------------------------------------------
Dim oOpt: Set oOpt = WScript.Arguments.Named
If oOpt.Exists("S") Then sOption = "SIZE"
If oOpt.Exists("W") Then sOption = "WIDTH"
If oOpt.Exists("H") Then sOption = "HEIGHT"
If oOpt.Exists("P") Then sOption = "PALETTE"
End Sub
'-------------------------------------------------------------------------------
' メイン関数
'-------------------------------------------------------------------------------
Sub MainFunction
'---------------------------------------------------------------------------
' コマンドライン解析
'---------------------------------------------------------------------------
GetCommandLine
'---------------------------------------------------------------------------
' GIF Header の解析
'---------------------------------------------------------------------------
ParseHeader
'---------------------------------------------------------------------------
' GIF 本体の解析
'---------------------------------------------------------------------------
Dim a
Do While True
a = oGIF.ReadPack("c")
Select Case(a(0))
Case &H2C: ParseImageDataBlock
Case &H21
a = oGIF.ReadPack("c")
Select Case(a(0))
Case &H01: ParsePlainTextExtension
Case &HF9: ParseGraphicControlExtension
Case &HFE: ParseCommentExtension
Case &HFF: ParseApplicationExtension
Case Else
WScript.StdErr.WriteLine "未定義ブロック:21-" & DECtoHEX(a(0), 2)
Exit Sub
End Select
Case &H3B: Exit Do
Case Else
WScript.StdErr.WriteLine "未定義ブロック:" & DECtoHEX(a(0), 2)
Exit Sub
End Select
Loop
End Sub
'-------------------------------------------------------------------------------
' GIF Header の解析
'-------------------------------------------------------------------------------
Sub ParseHeader
Dim i, j, a, s
a = oGIF.ReadPack("ccccccssccc")
Dim sSignatureAndVersion
For i = 0 To 5
sSignatureAndVersion = sSignatureAndVersion & CHR(a(i))
Next
If sSignatureAndVersion <> "GIF87a" And sSignatureAndVersion <> "GIF89a" Then
WScript.StdErr.WriteLine "ファイル " & sFilename & " は GIF 形式ではありません!!"
Exit Sub
End If
Dim nLogicalScreenWidth: nLogicalScreenWidth = a(6)
Dim nLogicalScreenHeight: nLogicalScreenHeight = a(7)
Dim bUseGlobalColorTable: bUseGlobalColorTable = CBool((a(8) And 128) \ 128)
Dim nColorResolution: nColorResolution = ((a(8) And 112) \ 16) + 1
Dim bSortGlobalColorTable: bSortGlobalColorTable = CBool((a(8) And 8) \ 8)
Dim nGlobalColorTableSize: nGlobalColorTableSize = Iif(bUseGlobalColorTable, 2 ^ ((a(8) And 7) + 1), 0)
Dim nBackgroundColorIndex: nBackgroundColorIndex = a(9)
Dim fAspectRatio: fAspectRatio = Iif(a(10) <> 0, (a(10) + 15) / 64, 0)
Dim aGlobalColorTable()
If bUseGlobalColorTable Then
ReDim aGlobalColorTable(nGlobalColorTableSize * 3 - 1)
j = 0
For i = 0 To nGlobalColorTableSize - 1
a = oGIF.ReadPack("ccc")
aGlobalColorTable(j) = a(0): j = j + 1
aGlobalColorTable(j) = a(1): j = j + 1
aGlobalColorTable(j) = a(2): j = j + 1
Next
End If
Select Case sOption
Case "SIZE"
WScript.StdOut.WriteLine sFilename & vbTab & nLogicalScreenWidth & vbTab & nLogicalScreenHeight
Case "WIDTH"
WScript.StdOut.WriteLine sFilename & vbTab & nLogicalScreenWidth
Case "HEIGHT"
WScript.StdOut.WriteLine sFilename & vbTab & nLogicalScreenHeight
Case "PALETTE"
If Not bUseGlobalColorTable Then Exit Sub
WScript.StdOut.WriteLine "[GLOBAL COLOR TABLE]"
WScript.StdOut.WriteLine "No. RRGGBB"
WScript.StdOut.WriteLine "----------"
j = 0
For i = 0 To nGlobalColorTableSize - 1
s = DECtoHEX(i, 2) & ": "
s = s & DECtoHEX(aGlobalColorTable(j), 2): j = j + 1
s = s & DECtoHEX(aGlobalColorTable(j), 2): j = j + 1
s = s & DECtoHEX(aGlobalColorTable(j), 2): j = j + 1
WScript.StdOut.WriteLine s
Next
WScript.StdOut.WriteLine
Case Else
WScript.StdOut.WriteLine "[GIF Header]"
WScript.StdOut.WriteLine " SIGNATURE-VERSION: " & sSignatureAndVersion
WScript.StdOut.WriteLine " LOGICAL SCREEN WIDTH: " & nLogicalScreenWidth & "[px]"
WScript.StdOut.WriteLine " LOGICAL SCREEN HEIGHT: " & nLogicalScreenHeight & "[px]"
WScript.StdOut.WriteLine " USE GLOBAL COLOR TABLE: " & bUseGlobalColorTable
WScript.StdOut.WriteLine " COLOR RESOLUTION: " & nColorResolution & "[bit]"
WScript.StdOut.WriteLine "SORT GLOBAL COLOR TABLE: " & bSortGlobalColorTable
WScript.StdOut.WriteLine "GLOBAL COLOR TABLE SIZE: " & nGlobalColorTableSize & "[color]"
WScript.StdOut.WriteLine " BACKGROUND COLOR INDEX: " & nBackgroundColorIndex
WScript.StdOut.WriteLine " ASPECT RATIO: " & fAspectRatio
WScript.StdOut.WriteLine
End Select
End Sub
'-------------------------------------------------------------------------------
' Image Data Block の解析
'-------------------------------------------------------------------------------
Sub ParseImageDataBlock
Dim i, j, a, s
a = oGIF.ReadPack("ssssc")
Dim nImageLeftPosition: nImageLeftPosition = a(0)
Dim nImageTopPosition: nImageTopPosition = a(1)
Dim nImageWidth: nImageWidth = a(2)
Dim nImageHeight: nImageHeight = a(3)
Dim bUseLocalColorTable: bUseLocalColorTable = CBool((a(4) And 128) \ 128)
Dim bInterlace: bInterlace = CBool((a(4) And 64) \ 64)
Dim bSortLocalColorTable: bSortLocalColorTable = CBool((a(4) And 32) \ 32)
Dim nLocalColorTableSize: nLocalColorTableSize = Iif(bUseLocalColorTable, 2 ^ ((a(4) And 7) + 1), 0)
Dim aLocalColorTable
if bUseLocalColorTable Then
ReDim aLocalColorTable(nLocalColorTableSize * 3 - 1)
j = 0
For i = 0 To nLocalColorTableSize - 1
a = oGIF.ReadPack("ccc")
aLocalColorTable(j) = a(0): j = j + 1
aLocalColorTable(j) = a(1): j = j + 1
aLocalColorTable(j) = a(2): j = j + 1
Next
End If
oGIF.Seek 1 ' LZW Minimum Code Size
Do While True
a = oGIF.ReadPack("c")
If a(0) = 0 Then Exit Do
oGIF.Seek a(0)
Loop
Select Case sOption
Case "SIZE", "WIDTH", "HEIGHT"
' 何もしない
Case "PALETTE"
If Not bUseLocalColorTable Then Exit Sub
WScript.StdOut.WriteLine "[LOCAL COLOR TABLE]"
WScript.StdOut.WriteLine "No. RRGGBB"
WScript.StdOut.WriteLine "----------"
j = 0
For i = 0 To nLocalColorTableSize - 1
s = DECtoHEX(i, 2) & ": "
s = s & DECtoHEX(aLocalColorTable(j), 2): j = j + 1
s = s & DECtoHEX(aLocalColorTable(j), 2): j = j + 1
s = s & DECtoHEX(aLocalColorTable(j), 2): j = j + 1
WScript.StdOut.WriteLine s
Next
WScript.StdOut.WriteLine
Case Else
WScript.StdOut.WriteLine "[Image Data Block]"
WScript.StdOut.WriteLine " IMAGE LEFT POSITION: " & nImageLeftPosition & "[px]"
WScript.StdOut.WriteLine " IMAGE TOP POSITION: " & nImageTopPosition & "[px]"
WScript.StdOut.WriteLine " IMAGE WIDTH: " & nImageWidth & "[px]"
WScript.StdOut.WriteLine " IMAGE HEIGHT: " & nImageHeight & "[px]"
WScript.StdOut.WriteLine " USE LOCAL COLOR TABLE: " & bUseLocalColorTable
WScript.StdOut.WriteLine " INTERLACE: " & bInterlace
WScript.StdOut.WriteLine " SORT LOCAL COLOR TABLE: " & bSortLocalColorTable
WScript.StdOut.WriteLine " LOCAL COLOR TABLE SIZE: " & nLocalColorTableSize & "[color]"
WScript.StdOut.WriteLine
End Select
End Sub
'-------------------------------------------------------------------------------
' Plain Text Extension の解析
'-------------------------------------------------------------------------------
Sub ParsePlainTextExtension
Dim a
a = oGIF.ReadPack("csssscccc")
Do While True
a = oGIF.ReadPack("c")
If a(0) = 0 Then Exit Do
oGIF.Seek a(0)
Loop
Select Case sOption
Case "SIZE", "WIDTH", "HEIGHT", "PALETTE"
' 何もしない
Case Else
WScript.StdOut.WriteLine "[Plain Text Extension]"
End Select
End Sub
'-------------------------------------------------------------------------------
' Graphic Control Extension の解析
'-------------------------------------------------------------------------------
Sub ParseGraphicControlExtension
Dim a
a = oGIF.ReadPack("ccscc")
Dim bUseTransparentColor: bUseTransparentColor = CBool(a(1) & 1)
Dim nDelayTime: nDelayTime = a(2) * 10
Dim nTransparentColorIndex: nTransparentColorIndex = a(3)
Select Case sOption
Case "SIZE", "WIDTH", "HEIGHT", "PALETTE"
' 何もしない
Case Else
WScript.StdOut.WriteLine "[Graphic Control Extension]"
WScript.StdOut.WriteLine " USE TRANSPARENT COLOR: " & bUseTransparentColor
WScript.StdOut.WriteLine " DELAYTIME: " & nDelayTime & "[ms]"
WScript.StdOut.WriteLine "TRANSPARENT COLOR INDEX: " & nTransparentColorIndex
WScript.StdOut.WriteLine
End Select
End Sub
'-------------------------------------------------------------------------------
' Comment Extension の解析
'-------------------------------------------------------------------------------
Sub ParseCommentExtension
Dim a
Do While True
a = oGIF.ReadPack("c")
If a(0) = 0 Then Exit Do
oGIF.Seek a(0)
Loop
Select Case sOption
Case "SIZE", "WIDTH", "HEIGHT", "PALETTE"
' 何もしない
Case Else
WScript.StdOut.WriteLine "[Comment Extension]"
End Select
End Sub
'-------------------------------------------------------------------------------
' Application Extension の解析
'-------------------------------------------------------------------------------
Sub ParseApplicationExtension
Dim i, a, b
a = oGIF.ReadPack("c")
Dim sApplicationIdentifier: sApplicationIdentifier = ""
For i = 0 To a(0) - 1
b = oGIF.ReadPack("c")
sApplicationIdentifier = sApplicationIdentifier & CHR(b(0))
Next
Dim nAnimationLoopCount: nAnimationLoopCount = 0
If sApplicationIdentifier = "NETSCAPE2.0" Then
a = oGIF.ReadPack("c")
b = oGIF.ReadPack("cs")
nAnimationLoopCount = b(1)
End If
Do While True
a = oGIF.ReadPack("c")
If a(0) = 0 Then Exit Do
oGIF.Seek a(0)
Loop
Select Case sOption
Case "SIZE", "WIDTH", "HEIGHT", "PALETTE"
' 何もしない
Case Else
WScript.StdOut.WriteLine "[Application Extension]"
WScript.StdOut.WriteLine " APPLICATION IDENTIFIER: " & sApplicationIdentifier
If sApplicationIdentifier = "NETSCAPE2.0" Then
WScript.StdOut.WriteLine " ANIMATION LOOP COUNT: " & nAnimationLoopCount
End If
WScript.StdOut.WriteLine
End Select
End Sub
</script>
</job>
</package>
CommonLibrary.VBS(詳しくはコチラ)
'-------------------------------------------------------------------------------
' 整数を 16 進数文字列に変換する。桁指定付き
'-------------------------------------------------------------------------------
Function DECtoHEX(n, width)
DECtoHEX = Right("00000000" & Hex(n), width)
End Function
'-------------------------------------------------------------------------------
' 三項演算子
'-------------------------------------------------------------------------------
Function Iif(bFlag, x, y)
If bFlag Then
Iif = x
Else
Iif = y
End If
End Function
'-------------------------------------------------------------------------------
' ファイルシステムオブジェクトのラッパークラス
'-------------------------------------------------------------------------------
Class FileSystemObject
'---------------------------------------------------------------------------
' メンバ変数
'---------------------------------------------------------------------------
Private oFS
'---------------------------------------------------------------------------
' コンストラクタ
'---------------------------------------------------------------------------
Private Sub Class_Initialize
Set oFS = CreateObject("Scripting.FileSystemObject")
End Sub
'---------------------------------------------------------------------------
' デストラクタ
'---------------------------------------------------------------------------
Private Sub Class_Terminate
Set oFS = Nothing
End Sub
'---------------------------------------------------------------------------
' ファイルの存在チェック
'---------------------------------------------------------------------------
Public Function FileExists(sPath)
FileExists = oFS.FileExists(sPath)
End Function
'---------------------------------------------------------------------------
' 絶対パスを返す
'---------------------------------------------------------------------------
Public Function GetAbsolutePathName(sPath)
GetAbsolutePathName = oFS.GetAbsolutePathName(sPath)
End Function
'---------------------------------------------------------------------------
' ディレクトリ名を返す
'---------------------------------------------------------------------------
Public Function GetParentFolderName(sPath)
GetParentFolderName = oFS.GetParentFolderName(sPath)
End Function
'---------------------------------------------------------------------------
' ベース名を返す
'---------------------------------------------------------------------------
Public Function GetBaseName(sPath)
GetBaseName = oFS.GetBaseName(sPath)
End Function
'---------------------------------------------------------------------------
' 拡張子を返す
'---------------------------------------------------------------------------
Public Function GetExtensionName(sPath)
GetExtensionName = oFS.GetExtensionName(sPath)
End Function
End Class
'-------------------------------------------------------------------------------
' バイナリファイルを取り扱うクラス
'-------------------------------------------------------------------------------
Class BinaryFile
'---------------------------------------------------------------------------
' メンバ変数
'---------------------------------------------------------------------------
Private oST
'-----------------------------------------------------------------------
' コンストラクタ
'-----------------------------------------------------------------------
Private Sub Class_Initialize
Set oST = CreateObject("ADODB.Stream")
End Sub
'-----------------------------------------------------------------------
' デストラクタ
'-----------------------------------------------------------------------
Private Sub Class_Terminate
Set oST = Nothing
End Sub
'-----------------------------------------------------------------------
' ファイルオープン
'-----------------------------------------------------------------------
Sub Open(sFilename)
oST.Type = adTypeBinary
oST.Open
oST.LoadFromFile(sFilename)
End Sub
'-----------------------------------------------------------------------
' ファイルクローズ
'-----------------------------------------------------------------------
Sub Close
oST.Close
End Sub
'-----------------------------------------------------------------------
' 16進数変換
'-----------------------------------------------------------------------
Private Function Bin2Hex(val)
Bin2Hex = Right("0" & Hex(AscB(val)), 2)
End Function
'-----------------------------------------------------------------------
' ファイルの読み出し
'-----------------------------------------------------------------------
Function ReadPack(sFormat)
Dim i, n, str
Dim a()
n = Len(sFormat)
ReDim a(n - 1)
For i = 1 To n
Select Case Mid(sFormat, i, 1)
Case "c", "C"
str = Bin2Hex(oST.Read(1))
Case "s"
str = Bin2Hex(oST.Read(1))
str = Bin2Hex(oST.Read(1)) & str
Case "S"
str = Bin2Hex(oST.Read(1))
str = str & Bin2Hex(oST.Read(1))
Case "l"
str = Bin2Hex(oST.Read(1))
str = Bin2Hex(oST.Read(1)) & str
str = Bin2Hex(oST.Read(1)) & str
str = Bin2Hex(oST.Read(1)) & str
Case "L"
str = Bin2Hex(oST.Read(1))
str = str & Bin2Hex(oST.Read(1))
str = str & Bin2Hex(oST.Read(1))
str = str & Bin2Hex(oST.Read(1))
End Select
a(i - 1) = CLng("&H" & str)
Next
ReadPack = a
End Function
'-----------------------------------------------------------------------
' シーク
'-----------------------------------------------------------------------
Sub Seek(nSize)
oST.Position = oST.Position + nSize
End Sub
'-----------------------------------------------------------------------
' EOS
'-----------------------------------------------------------------------
Function AtEndOfStream()
AtEndOfStream = oST.EOS
End Function
End Class
サンプル画像①
まず静止画である。

実行例①
引数なしで実行するとヘルプメッセージが表示される。
GIF ファイルの情報を表示します。
GIFinfo(.WSF) (オプション) [ファイル名(.GIF)]
<オプション>
/S 画像ファイルの横幅と高さを示します。
/W 画像ファイルの横幅を示します。
/H 画像ファイルの高さを表示します。
/P パレットを表示します。
上記のサンプル画像①を実行した結果を示す。
[GIF Header]
SIGNATURE-VERSION: GIF89a
LOGICAL SCREEN WIDTH: 336[px]
LOGICAL SCREEN HEIGHT: 50[px]
USE GLOBAL COLOR TABLE: False
COLOR RESOLUTION: 8[bit]
SORT GLOBAL COLOR TABLE: False
GLOBAL COLOR TABLE SIZE: 0[color]
BACKGROUND COLOR INDEX: 0
ASPECT RATIO: 0
[Graphic Control Extension]
USE TRANSPARENT COLOR: True
DELAYTIME: 0[ms]
TRANSPARENT COLOR INDEX: 20
[Image Data Block]
IMAGE LEFT POSITION: 0[px]
IMAGE TOP POSITION: 0[px]
IMAGE WIDTH: 336[px]
IMAGE HEIGHT: 50[px]
USE LOCAL COLOR TABLE: True
INTERLACE: False
SORT LOCAL COLOR TABLE: False
LOCAL COLOR TABLE SIZE: 32[color]
オプション /P を指定するとパレット情報が表示される。
[LOCAL COLOR TABLE]
No. RRGGBB
----------
00: 000000
01: 303030
02: 404040
03: 606060
04: 707070
05: 808080
06: 909090
07: A0A0A0
08: B0B0B0
09: C0C0C0
0A: F0F0F0
0B: F3F3F3
0C: F4F4F4
0D: F6F6F6
0E: F7F7F7
0F: F8F8F8
10: F9F9F9
11: FAFAFA
12: FBFBFB
13: FCFCFC
14: FFFFFF
15: 000000
16: 000000
17: 000000
18: 000000
19: 000000
1A: 000000
1B: 000000
1C: 000000
1D: 000000
1E: 000000
1F: 000000
サンプル画像②
アニメーション GIF である。

実行例②
上記のアニメーション GIF は4枚の画像を2秒ずつ表示させるものである。先頭の1枚はグローバルカラーテーブル,残りの3枚はローカルカラーテーブルを使用している,ということが分かる。
[GIF Header]
SIGNATURE-VERSION: GIF89a
LOGICAL SCREEN WIDTH: 510[px]
LOGICAL SCREEN HEIGHT: 367[px]
USE GLOBAL COLOR TABLE: True
COLOR RESOLUTION: 8[bit]
SORT GLOBAL COLOR TABLE: False
GLOBAL COLOR TABLE SIZE: 256[color]
BACKGROUND COLOR INDEX: 0
ASPECT RATIO: 0
[Application Extension]
APPLICATION IDENTIFIER: NETSCAPE2.0
ANIMATION LOOP COUNT: 0
[Graphic Control Extension]
USE TRANSPARENT COLOR: True
DELAYTIME: 2000[ms]
TRANSPARENT COLOR INDEX: 255
[Image Data Block]
IMAGE LEFT POSITION: 0[px]
IMAGE TOP POSITION: 0[px]
IMAGE WIDTH: 510[px]
IMAGE HEIGHT: 367[px]
USE LOCAL COLOR TABLE: False
INTERLACE: False
SORT LOCAL COLOR TABLE: False
LOCAL COLOR TABLE SIZE: 0[color]
[Graphic Control Extension]
USE TRANSPARENT COLOR: True
DELAYTIME: 2000[ms]
TRANSPARENT COLOR INDEX: 141
[Image Data Block]
IMAGE LEFT POSITION: 0[px]
IMAGE TOP POSITION: 0[px]
IMAGE WIDTH: 510[px]
IMAGE HEIGHT: 367[px]
USE LOCAL COLOR TABLE: True
INTERLACE: False
SORT LOCAL COLOR TABLE: False
LOCAL COLOR TABLE SIZE: 256[color]
[Graphic Control Extension]
USE TRANSPARENT COLOR: True
DELAYTIME: 2000[ms]
TRANSPARENT COLOR INDEX: 165
[Image Data Block]
IMAGE LEFT POSITION: 0[px]
IMAGE TOP POSITION: 0[px]
IMAGE WIDTH: 510[px]
IMAGE HEIGHT: 367[px]
USE LOCAL COLOR TABLE: True
INTERLACE: False
SORT LOCAL COLOR TABLE: False
LOCAL COLOR TABLE SIZE: 256[color]
[Graphic Control Extension]
USE TRANSPARENT COLOR: True
DELAYTIME: 2000[ms]
TRANSPARENT COLOR INDEX: 165
[Image Data Block]
IMAGE LEFT POSITION: 0[px]
IMAGE TOP POSITION: 0[px]
IMAGE WIDTH: 510[px]
IMAGE HEIGHT: 367[px]
USE LOCAL COLOR TABLE: True
INTERLACE: False
SORT LOCAL COLOR TABLE: False
LOCAL COLOR TABLE SIZE: 256[color]