BMP,PNG,JPEGファイルの情報を表示するスクリプトをまとめてささっと作る

# はじめに

前回の記事で GIF ファイルの情報を表示するスクリプトを作成した。

https://qiita.com/TETSURO1999/items/f642b9d14bda6dc25b17

その過程でバイナリファイルを取り扱う自作クラスを作成した。丁寧にもリトルエンディアン／ビッグエンディアン両対応で作成したのだが，GIF ファイルはリトルエンディアンなので物足りない。せっかくだからビッグエンディアンの機能も使いたいので他の画像ファイルフォーマットにも手を出してみよう。

ちなみに BMP ファイルはリトルエンディアン，PNG と JPG はビッグエンディアンです。


# 基本方針
- WSH（Windows Script Host）で作る。言語は VBScript だ。
- まとめて作るので共通部分は CommonLibrary.VBS としてまとめる。
- 対象とする画像ファイルは以下の3種類とする。TIFF は最近ほとんど使わなくなったので対象外とする。WEBP はちょっと悩んだけど WIC（Windows Imaging Component）でエンコードをサポートしていないし， Qiita がサポートしていないので時期尚早と判断した。
  - BMP
  - PNG
  - JPEG
- すべての機能には対応しない。自分の所有する画像ファイルにさえ対応すれば良い。

# 実装コード

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

```VB:BMPinfo.WSF
<package>
<job>
<script language="VBScript" src="CommonLibrary.VBS"></script>
<script language="VBScript">
Option Explicit
'-------------------------------------------------------------------------------
' グローバル定数
'-------------------------------------------------------------------------------
Dim	oBMP: 		Set oBMP = New BinaryFile
Dim	sFilename:	sFilename = ""
Dim	sOption:	sOption   = ""
'-------------------------------------------------------------------------------
' メイン関数の呼び出し
'-------------------------------------------------------------------------------
MainFunction
'-------------------------------------------------------------------------------
' ヘルプメッセージ
'-------------------------------------------------------------------------------
Sub Usage()
	WScript.Echo "BMP ファイルの情報を表示します。"
	WScript.Echo ""
	WScript.Echo "BMPINFO(.WSF) (オプション) [ファイル名(.BMP)]"
	WScript.Echo ""
	WScript.Echo "＜オプション＞"
	WScript.Echo "  /S  画像ファイルの横幅と高さを示します。"
	WScript.Echo "  /W  画像ファイルの横幅を示します。"
	WScript.Echo "  /H  画像ファイルの高さを表示します。"
	WScript.Echo "  /D  画像ファイルの深さを表示します。"
	WScript.Echo "  /P  画像ファイルのパレットを表示します。"
	WScript.Quit
End Sub
'-------------------------------------------------------------------------------
' コマンドライン解析
'-------------------------------------------------------------------------------
Sub GetCommandLine()
	'---------------------------------------------------------------------------
	' ヘルプメッセージ
	'---------------------------------------------------------------------------
	Dim	oArg: Set oArg = WScript.Arguments.Unnamed
	If oArg.Count < 1 Then Usage
	'---------------------------------------------------------------------------
	' 入力ファイル名の取得
	'---------------------------------------------------------------------------
	Dim	oFS: Set oFS = New FileSystemObject
	If oFS.FileExists(oArg(0)) Then
		sFilename = oArg(0)
		oBMP.Open sFilename
	Else
		WScript.Echo "ファイル " & 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("D") Then sOption = "DEPTH"
	If oOpt.Exists("P") Then sOption = "PALETTE"
End Sub
'-------------------------------------------------------------------------------
' メイン関数
'-------------------------------------------------------------------------------
Sub MainFunction
	'---------------------------------------------------------------------------
	' コマンドライン解析
	'---------------------------------------------------------------------------
	GetCommandLine
	'---------------------------------------------------------------------------
	' BMPファイルのオープン
	'---------------------------------------------------------------------------
	Dim	i, n, a, b, c, s 
	a = oBMP.ReadPack("slssl")
	If a(0) <> &H4D42 Then
		WScript.Echo "ファイル " & sFilename & " は BMP 形式ではありません!!"
		WScript.Quit
	End If
	b = oBMP.ReadPack("lllssllllll")
	Select Case sOption
	  Case "SIZE":
		WScript.Echo sFilename & vbTab & b(1) & vbTab & b(2)
	  Case "WIDTH"
		WScript.Echo sFilename & vbTab & b(1)
	  Case "HEIGHT"
		WScript.Echo sFilename & vbTab & b(2)
	  Case "DEPTH"
		WScript.Echo sFilename & vbTab & b(4)
	  Case "PALETTE"
		n = b(9)
		If n < 1 Then
			Select Case b(4)
			  Case 2:	n = 2
			  Case 4:	n = 16
			  Case 8:	n = 256
			End Select
		End If
		WScript.Echo "No. RRGGBB"
		WScript.Echo "----------"
		For i = 0 To n - 1
			c = oBMP.ReadPack("CCCC")
			s = DECtoHEX(i, 2) & ": "
			s = s & DECtoHEX(c(2), 2)
			s = s & DECtoHEX(c(1), 2)
			s = s & DECtoHEX(c(0), 2)
			WScript.Echo s
		Next
	  Case Else
		WScript.Echo "       FILENAME: " & sFilename
		WScript.Echo "    IMAGE WIDTH: " & b(1)
		WScript.Echo "   IMAGE HEIGHT: " & b(2)
		WScript.Echo "    COLOR DEPTH: " & b(4)
		WScript.Echo "       COMPRESS: " & b(5)
		WScript.Echo "     IMAGE SIZE: " & b(6)
		WScript.Echo "   X RESOLUTION: " & b(7)
		WScript.Echo "   Y RESOLUTION: " & b(8)
		WScript.Echo "     USED COLOR: " & b(9)
		WScript.Echo "IMPORTANT COLOR: " & b(10)
	End Select
	oBMP.Close
End Sub
</script>
</job>
</package>
```

</details>

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

```VB:PNGinfo.WSF
<package>
<job>
<script language="VBScript" src="CommonLibrary.VBS"></script>
<script language="VBScript">
Option Explicit
'-------------------------------------------------------------------------------
' 定数定義
'-------------------------------------------------------------------------------
Const CHUNK_IHDR = &H49484452
Const CHUNK_PLTE = &H504C5445
Const CHUNK_IDAT = &H49444154
Const CHUNK_IEND = &H49454E44
Const CHUNK_sRGB = &H73524742
Const CHUNK_gAMA = &H67414D41
Const CHUNK_cHRM = &H6348524D
Const CHUNK_pHYs = &H70485973
'-------------------------------------------------------------------------------
' グローバル変数
'-------------------------------------------------------------------------------
Dim	oPNG: 		Set oPNG = New BinaryFile
Dim	sFilename:	sFilename = ""
Dim	sOption:	sOption   = ""
'-------------------------------------------------------------------------------
' メイン関数の呼び出し
'-------------------------------------------------------------------------------
MainFunction
'-------------------------------------------------------------------------------
' ヘルプメッセージ
'-------------------------------------------------------------------------------
Sub Usage
	WScript.Echo "PNG ファイルの情報を表示します。"
	WScript.Echo ""
	WScript.Echo "PNGINFO(.WSF) (オプション) [ファイル名(.PNG)]"
	WScript.Echo ""
	WScript.Echo "＜オプション＞"
	WScript.Echo "  /S  画像ファイルの横幅と高さを表示します。"
	WScript.Echo "  /W  画像ファイルの横幅を示します。"
	WScript.Echo "  /H  画像ファイルの高さを表示します。"
	WScript.Echo "  /D  画像ファイルの深さを表示します。"
	WScript.Echo "  /C  画像ファイルのカラータイプを表示します。"
	WScript.Echo "  /P  画像ファイルのパレットを表示します。"
	WScript.Quit
End Sub
'-------------------------------------------------------------------------------
' コマンドライン解析
'-------------------------------------------------------------------------------
Sub GetCommandLine
	'---------------------------------------------------------------------------
	' ヘルプメッセージ
	'---------------------------------------------------------------------------
	Dim oArg: Set oArg = WScript.Arguments.Unnamed
	If oArg.Count < 1 Then Usage
	'---------------------------------------------------------------------------
	' 入力ファイル名の取得
	'---------------------------------------------------------------------------
	Dim oFS: Set oFS = New FileSystemObject
	If oFS.FileExists(oArg(0)) Then
		sFilename = oArg(0)
		oPNG.Open sFilename
	Else
		WScript.Echo "ファイル " & 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("D") Then sOption = "DEPTH"
	If oOpt.Exists("C") Then sOption = "COLOR"
	If oOpt.Exists("P") Then sOption = "PALETTE"
End Sub
'-------------------------------------------------------------------------------
' メイン関数
'-------------------------------------------------------------------------------
Sub MainFunction
	'---------------------------------------------------------------------------
	' コマンドライン解析
	'---------------------------------------------------------------------------
	GetCommandLine
	'---------------------------------------------------------------------------
	' PNGファイルのオープン
	'---------------------------------------------------------------------------
	Dim	i, j, a, b, s
	a = oPNG.ReadPack("LL")
	If a(0) <> &H89504E47 Or a(1) <> &H0D0A1A0A Then
		WScript.Echo "ファイル " & sFilename & " は PNG 形式ではありません!!"
		WScript.Quit
	End If
	Do Until oPNG.AtEndOfStream
		a = oPNG.ReadPack("LL")
		Select Case a(1)
		  Case CHUNK_IHDR
			b = oPNG.ReadPack("LLCCCCC")
			Select Case sOption
			  Case "SIZE"
				WScript.Echo sFilename & vbTab & b(0) & vbTab & b(1)
				Exit Do
			  Case "WIDTH"
				WScript.Echo sFilename & vbTab & b(0)
				Exit Do
			  Case "HEIGHT"
				WScript.Echo sFilename & vbTab & b(1)
				Exit Do
			  Case "DEPTH"
				WScript.Echo sFilename & vbTab & b(2)
				Exit Do
			  Case "COLOR"
				WScript.Echo sFilename & vbTab & GetColor(b(3))
				Exit Do
			  Case "PALETTE"
				' 何もしない
			  Case Else
				WScript.Echo " FILENAME: " & sFilename
				WScript.Echo "    WIDTH: " & b(0)
				WScript.Echo "   HEIGHT: " & b(1)
				WScript.Echo "    DEPTH: " & b(2)
				WScript.Echo "    COLOR: " & b(3) & ", " & GetColor(b(3))
				WScript.Echo " COMPRESS: " & b(4) & ", " & GetCompress(b(4))
				WScript.Echo "   FILTER: " & b(5) & ", " & GetFilter(b(5))
				WScript.Echo "INTERLACE: " & b(6) & ", " & GetInterlace(b(6))
				Exit Do
			End Select
		  Case CHUNK_PLTE
			If sOption <> "PALETTE" Then
				oPNG.Seek(a(0))
			Else
				WScript.Echo "No. RRGGBB"
				WScript.Echo "----------"
				j = 0
				For i = 0 To a(0) - 1 Step 3
					b = oPNG.ReadPack("CCC")
					s = DECtoHEX(j, 2) & ": "
					s = s & DECtoHEX(b(0), 2)
					s = s & DECtoHEX(b(1), 2)
					s = s & DECtoHEX(b(2), 2)
					WScript.Echo s
					j = j + 1
				Next
				Exit Do
			End If
		  Case CHUNK_IDAT
			oPNG.Seek a(0)
		  Case CHUNK_IEND
			oPNG.Seek a(0)
		  Case CHUNK_sRGB
			oPNG.Seek a(0)
		  Case CHUNK_gAMA
			oPNG.Seek a(0)
		  Case CHUNK_cHRM
			oPNG.Seek a(0)
		  Case CHUNK_pHYs
			oPNG.Seek a(0)
		  Case Else			' その他
			WScript.Echo "未定義チャンク：" & Hex(a(1))
			Exit Sub
		End Select
		oPNG.Seek 4
	Loop
	oPNG.Close
End Sub
'-------------------------------------------------------------------------------
' COLORタイプを返す
'-------------------------------------------------------------------------------
Private Function GetColor(val)
	Select Case val
	  Case 0: GetColor = "Grayscale"
	  Case 2: GetColor = "True Color"
	  Case 3: GetColor = "Indexed Color"
	  Case 4: GetColor = "Grayscale with Alpha"
	  Case 6: GetColor = "True Color with Alpha"
	End Select
End Function
'-------------------------------------------------------------------------------
' COMPRESSタイプを返す
'-------------------------------------------------------------------------------
Private Function GetCompress(val)
	Select Case val
	  Case 0:	GetCompress = "Deflate"
	  Case Else:GetCompress = ""
	End Select
End Function
'-------------------------------------------------------------------------------
' FILTERタイプを返す
'-------------------------------------------------------------------------------
Private Function GetFilter(val)
	Select Case val
	  Case 0:	GetFilter = "Basic"
	  Case Else:GetFilter = ""
	End Select
End Function
'-------------------------------------------------------------------------------
' INTERLACEタイプを返す
'-------------------------------------------------------------------------------
Private Function GetInterlace(val)
	Select Case val
	  Case 0:	GetInterlace = "none"
	  Case 1:	GetInterlace = "Adam7"
	  Case Else:GetInterlace = ""
	End Select
End Function
</script>
</job>
</package>
```

</details>

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

```VB:JPGinfo.WSF
<package>
<job>
<script language="VBScript" src="CommonLibrary.VBS"></script>
<script language="VBScript">
Option Explicit
'-------------------------------------------------------------------------------
' 定数定義
'-------------------------------------------------------------------------------
Const MARK_SOF0 = &HFFC0&
Const MARK_SOF2 = &HFFC2&
Const MARK_DHT  = &HFFC4&
Const MARK_SOI  = &HFFD8&
Const MARK_EOI  = &HFFD9&
Const MARK_SOS  = &HFFDA&
Const MARK_DQT  = &HFFDB&
Const MARK_APP0 = &HFFE0&
Const MARK_APP0 = &HFFE1&
Const MARK_APP0 = &HFFE2&
'-------------------------------------------------------------------------------
' グローバル変数
'-------------------------------------------------------------------------------
Dim	oJPG: 		Set oJPG = New BinaryFile
Dim	sFilename:	sFilename = ""
Dim	sOption:	sOption   = ""
'-------------------------------------------------------------------------------
' メイン関数の呼び出し
'-------------------------------------------------------------------------------
MainFunction
'-------------------------------------------------------------------------------
' ヘルプメッセージ
'-------------------------------------------------------------------------------
Sub Usage()
	WScript.Echo "JPG ファイルの情報を表示します。"
	WScript.Echo ""
	WScript.Echo "JPGINFO(.WSF) (オプション) [ファイル名(.JPG)]"
	WScript.Echo ""
	WScript.Echo "＜オプション＞"
	WScript.Echo "  /S  画像ファイルの横幅と高さを表示します。"
	WScript.Echo "  /W  画像ファイルの横幅を示します。"
	WScript.Echo "  /H  画像ファイルの高さを表示します。"
	WScript.Echo "  /C　画像ファイルのカラータイプを表示します。"
	WScript.Quit
End Sub
'-------------------------------------------------------------------------------
' コマンドライン解析
'-------------------------------------------------------------------------------
Sub GetCommandLine()
	'---------------------------------------------------------------------------
	' ヘルプメッセージ
	'---------------------------------------------------------------------------
	Dim	oArg: Set oArg = WScript.Arguments.Unnamed
	If oArg.Count < 1 Then Usage
	'---------------------------------------------------------------------------
	' 入力ファイル名の取得
	'---------------------------------------------------------------------------
	Dim	oFS: Set oFS = New FileSystemObject
	If oFS.FileExists(oArg(0)) Then
		sFilename = oArg(0)
		oJPG.Open sFilename
	Else
		WScript.Echo "ファイル " & 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("C") Then sOption = "COLOR"
End Sub
'-------------------------------------------------------------------------------
' メイン関数
'-------------------------------------------------------------------------------
Sub MainFunction
	'---------------------------------------------------------------------------
	' コマンドライン解析
	'---------------------------------------------------------------------------
	GetCommandLine
	'---------------------------------------------------------------------------
	' JPGファイルのオープン
	'---------------------------------------------------------------------------
	Dim	i, j, a, b
	Do Until oJPG.AtEndOfStream
		a = oJPG.ReadPack("S")
		Select Case a(0)
		  Case MARK_SOF0
			b = oJPG.ReadPack("SCSSC")
			Select Case sOption
			  Case "SIZE"
				WScript.Echo sFilename & vbTab & b(3) & vbTab & b(2)
				Exit Do
			  Case "WIDTH"
				WScript.Echo sFilename & vbTab & b(3)
				Exit Do
			  Case "HEIGHT"
				WScript.Echo sFilename & vbTab & b(2)
				Exit Do
			  Case "COLOR"
				WScript.Echo sFilename & vbTab & GetColor(b(4))
				Exit Do
			  Case Else
				WScript.Echo "     IMAGE WIDTH: " & b(3)
				WScript.Echo "    IMAGE HEIGHT: " & b(2)
				WScript.Echo "      COLOR TYPE: " & b(4) & ", " & GetColor(b(4))
				WScript.Echo "    FRAME FORMAT: BASELINE"
			End Select
			oJPG.Seek b(0) - 8
		  Case MARK_SOF2
			b = oJPG.ReadPack("SCSSC")
			Select Case sOption
			  Case "SIZE":
				WScript.Echo sFilename & vbTab & b(3) & vbTab & b(2)
				Exit Do
			  Case "WIDTH"
				WScript.Echo sFilename & vbTab & b(3)
				Exit Do
			  Case "HEIGHT"
				WScript.Echo sFilename & vbTab & b(2)
				Exit Do
			  Case "COLOR"
				WScript.Echo sFilename & vbTab & GetColor(b(4))
				Exit Do
			  Case Else
				WScript.Echo "     IMAGE WIDTH: " & b(3)
				WScript.Echo "    IMAGE HEIGHT: " & b(2)
				WScript.Echo "      COLOR TYPE: " & b(4) & ", " & GetColor(b(4))
				WScript.Echo "    FRAME FORMAT: PROGRESSIVE"
			End Select
			oJPG.Seek b(0) - 8
		  Case MARK_DHT
			b = oJPG.ReadPack("S")
			oJPG.Seek b(0) - 2
		  Case MARK_SOI
		  Case MARK_EOI
		  Case MARK_SOS
			b = oJPG.ReadPack("S")
			oJPG.Seek b(0) - 2
			Exit Do
		  Case MARK_DQT
			b = oJPG.ReadPack("S")
			oJPG.Seek b(0) - 2
		  Case MARK_APP0
			b = oJPG.ReadPack("SLCSCSSCC")
			If b(1) <> &H4A464946 Or b(2) <> 0 Then
				WScript.Echo "ファイル " & sFilename & " は JPG 形式ではありません!!"
				Exit Do
			End If
			Select Case sOption
			  Case "SIZE":
			  Case "WIDTH"
			  Case "HEIGHT"
			  Case "COLOR"
			  Case Else
				WScript.Echo "        FILENAME: " & sFilename
				WScript.Echo "         VERSION: " & Hex(b(3))
				WScript.Echo " RESOLUTION UNIT: " & b(4) & ", " & GetUnit(b(4))
				WScript.Echo "    X RESOLUTION: " & b(5)
				WScript.Echo "    Y RESOLUTION: " & b(6)
				WScript.Echo " THUMBNAIL WIDTH: " & b(7)
				WScript.Echo "THUMBNAIL HEIGHT: " & b(8)
			End Select
			If b(0) > 16 Then
				oJPG.Seek b(0) - 16
			End If
		  Case MARK_APP1
			b = oJPG.ReadPack("S")
			oJPG.Seek b(0) - 2
		  Case MARK_APP2
			b = oJPG.ReadPack("S")
			oJPG.Seek b(0) - 2
		  Case Else
			WScript.Echo "未定義チャンク：" & Hex(a(0)) & "h"
			Exit Do
		End Select
	Loop
	oJPG.Close
End Sub
'-------------------------------------------------------------------------------
' COLORタイプを返す
'-------------------------------------------------------------------------------
Function GetColor(val)
	Select Case val
	  Case 1:	GetColor = "Grayscale"
	  Case 3:	GetColor = "Color (YCbCr)"
	  Case 4:	GetColor = "Color (CMYK)"
	End Select
End Function
'-------------------------------------------------------------------------------
' UNITタイプを返す
'-------------------------------------------------------------------------------
Function GetUnit(val)
	Select Case val
	  Case 0:	GetUnit = "none"
	  Case 1:	GetUnit = "dot/inch"
	  Case 2:	GetUnit = "dot/cm"
	End Select
End Function
</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>

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

```:BMPinfo.WSF の実行結果（引数なしで実行した場合）
BMP ファイルの情報を表示します。

BMPINFO(.WSF) (オプション) [ファイル名(.BMP)]

＜オプション＞
  /S  画像ファイルの横幅と高さを示します。
  /W  画像ファイルの横幅を示します。
  /H  画像ファイルの高さを表示します。
  /D  画像ファイルの深さを表示します。
  /P  画像ファイルのパレットを表示します。
```

```:PNGinfo.WSF の実行結果（引数なしで実行した場合）
PNG ファイルの情報を表示します。

PNGINFO(.WSF) (オプション) [ファイル名(.PNG)]

＜オプション＞
  /S  画像ファイルの横幅と高さを表示します。
  /W  画像ファイルの横幅を示します。
  /H  画像ファイルの高さを表示します。
  /D  画像ファイルの深さを表示します。
  /C  画像ファイルのカラータイプを表示します。
  /P  画像ファイルのパレットを表示します。
```

```:JPGinfo.WSF の実行結果（引数なしで実行した場合）
JPGファイルの情報を表示します。

JPGINFO(.WSF) (オプション) [ファイル名(.JPG)]

＜オプション＞
  /S  画像ファイルの横幅と高さを表示します。
  /W  画像ファイルの横幅を示します。
  /H  画像ファイルの高さを表示します。
  /C  画像ファイルのカラータイプを表示します。
```

ファイル名のみを指定して実行すると詳細情報が表示される。
```:JPGinfo.WSF の実行結果（ファイル名のみを指定した場合）
        FILENAME: 047_001.JPG
         VERSION: 101
 RESOLUTION UNIT: 0, none
    X RESOLUTION: 1
    Y RESOLUTION: 1
 THUMBNAIL WIDTH: 0
THUMBNAIL HEIGHT: 0
     IMAGE WIDTH: 1125
    IMAGE HEIGHT: 1600
      COLOR TYPE: 1, Grayscale
    FRAME FORMAT: PROGRESSIVE
```

オプションは複数のファイルの情報を羅列したいときに用いる。以下はコマンドラインから
`@for %I in (*.jpg) do @jpginfo %I /S`
と入力した場合である。

```:JPGinfo.WSF の実行結果（オプション /S を指定した場合）
047_001.JPG     1125    1600
047_002-003.JPG 2250    1600
047_004-005.JPG 2250    1600
047_006-007.JPG 2250    1600
047_008-009.JPG 2250    1600
047_010-011.JPG 2250    1600
047_012-013.JPG 2250    1600
047_014.JPG     1125    1600
```


# 参考文献
- [Windows Bitmap - Wikipedia](https://ja.wikipedia.org/wiki/Windows_bitmap)
- [BMP ファイルフォーマット - むしゃぺらり の HSP ページ](https://www.setsuki.com/hsp/ext/bmp.htm)
- [Bitmapファイルフォーマット - 株式会社awm](http://www.awm.jp/~yoya/cache/www.umekkii.jp/data/computer/file_format/bitmap.cgi)
- [PNG ファイルフォーマット - むしゃぺらり の HSP ページ](https://www.setsuki.com/hsp/ext/png.htm)
- [JPG ファイルフォーマット - むしゃぺらり の HSP ページ](https://www.setsuki.com/hsp/ext/jpg.htm)
- [JpegAnalyzer Plus オンラインヘルプ - Vector](https://hp.vector.co.jp/authors/VA032610/contents.htm)