GIFファイルの情報を表示するスクリプトをささっと作る

# はじめに
今更ながらアニメーション GIF を作ることになった。かつて GIF ファイルは特許関連で揉めた経緯から何となく使用を忌避するきらいがあったが，とっくの昔に特許は失効していることや，後発の軽量動画ファイルフォーマットが普及しなかったことから割と最近よく使われるようになった感じがする。

専用のソフトを使わなくてもアニメーション GIF は WEB サービスで作れるようだが，何となく不安がある。かつて TIFF ファイルの分割・結合プログラムを作ったこともあり，アニメーション GIF の作成プログラムも簡単に作れるんじゃない？

まずは GIF ファイルフォーマットの勉強がてら GIF ファイルの情報を表示するプログラムをささっと手早く作ることにした。

# 基本方針
- ささっと手早く作りたいので WSH（Windows Script Host）で作成する。WSH の言語としては JavaScript または VBScript の二択あるが，今回は VBcript を選択した。

- バイナリファイルを取り扱う愛用の自作クラスを用いる。
- アニメーション GIF の仕様を含む GIF89a 形式までを対象とするが，テキスト情報やコメント情報などの拡張ブロックは適当なサンプルが入手できなかったため未対応とする。

# GIF ファイルフォーマット
以下のサイトが参考になった。

- [GIFフォーマットの詳細 - とほほのWWW入門](https://www.tohoho-web.com/wwwgif.htm)
- [GIF ファイルフォーマット - むしゃぺらり の HSP ページ](https://www.setsuki.com/hsp/ext/gif.htm)
- [GIF画像ファイル フォーマット - 略して仮。](https://menyukko.ifdef.jp/cauldron/dtgifformat.html)

# 愛用の自作クラスを使う
`BinaryFile` というバイナリファイルを取り扱う自作のクラスを使う。ファイルをバイナリとして読み込み，指定した文字列に応じた整数配列を返す。配列の要素数＝文字列の長さとなる。GIF ファイルのヘッダを読み込む場合，下記のようになる。

```VB:BinaryFile クラスの使用例
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整数（ビッグエンディアン）|

:::note
perl の pack/unpack 関数のようなもの，といえば分かって頂けるだろうか？
:::

# 実装コード
GIF ファイルの情報を表示するだけなので，GIF ファイルフォーマットさえ承知していればプログラムとしてはさほど難しくない。とはいえダラダラと作っていたらそれなりに長くなってしまった。

<details><summary>GIFinfo.WSF（詳しくはコチラ）</summary>

```vb: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>
```

</details>

<details><summary>CommonLibrary.VBS（詳しくはコチラ）</summary>

```vb: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
```

</details>

# サンプル画像①
まず静止画である。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/019da09f-e79f-a770-d200-65d057ad6226.gif">

# 実行例①
引数なしで実行するとヘルプメッセージが表示される。

```:引数なしで実行した場合
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 を指定するとパレット情報が表示される。

```:サンプル画像①の実行例：オプション /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 である。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/5e7b0c1e-5113-5ed8-ff48-beb06a8e4db8.gif">

# 実行例②

上記のアニメーション GIF は４枚の画像を２秒ずつ表示させるものである。先頭の１枚はグローバルカラーテーブル，残りの３枚はローカルカラーテーブルを使用している，ということが分かる。

```:サンプル画像②の実行例
[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]
```