Excel VBAでファイル解析(JPEGファイル編)
■JPEGファイルの概要
JPEG(Joint Photographic Experts Group)は画像データの圧縮に関する規格の1つで、ファイルの拡張子は「.jpg」または「.jpeg」です。
JPEGファイルの内部形式について次項で説明しますが、詳細は以下の規格書を参照して下さい。
(項番2、項番3は有償ですが、項番1はITU-Tのサイトで開示されています)
- ITU-T勧告 T.81
- ISO/IEC 10918-1:1994
- JIS X 4301:1995
JPEGファイルの構成
JPEGファイルの構成は下図のようになっており、先頭を示す「SOI」の後に複数のセグメントとイメージ・データが配置され、最後に「EOI」が配置されています。
SOI | セグメント | ・・・ | イメージ・データ | EOI |
セグメントの基本構造
各セグメントの基本構造は以下の通りとなっており、「マーカー」でセグメントの種類を識別します。
SOIとEOIは「マーカー」のみで、「セグメント長」「データ」はありません。
オフセット | 長さ | 説明 |
---|---|---|
0 | 2 | マーカー |
2 | 2 | セグメント長 |
4 | 可変長 | データ |
マーカーの種類
「マーカー」の値はX’FF01’~X’FFFF’の範囲で下表の通り定められており、「マーカー」と「セグメント長」を利用すれば、ファイルの先頭から順にセグメントを参照可能です。
なお、イメージ・データはセグメントの後ろに配置され、マーカーやサイズを持っていませんが、値の範囲はX’0000’~X’FF00’になっています。
Code Assignment | Symbol | Description | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Start Of Frame markers, non-differential, Huffman coding | |||||||||||||
X’FFC0’ | SOF0 | Baseline DCT | |||||||||||
X’FFC1’ | SOF1 | Extended sequential DCT | |||||||||||
X’FFC2’ | SOF2 | Progressive DCT | |||||||||||
X’FFC3’ | SOF3 | Lossless (sequential) | |||||||||||
Start Of Frame markers, differential, Huffman coding | |||||||||||||
X’FFC5’ | SOF5 | Differential sequential DCT | |||||||||||
X’FFC6’ | SOF6 | Differential progressive DCT | |||||||||||
X’FFC7’ | SOF7 | Differential lossless (sequential) | |||||||||||
Start Of Frame markers, non-differential, arithmetic coding | |||||||||||||
X’FFC8’ | JPG | Reserved for JPEG extensions | |||||||||||
X’FFC9’ | SOF9 | Extended sequential DCT | |||||||||||
X’FFCA’ | SOF10 | Progressive DCT | |||||||||||
X’FFCB’ | SOF11 | Lossless (sequential) | |||||||||||
Start Of Frame markers, differential, arithmetic coding | |||||||||||||
X’FFCD’ | SOF13 | Differential sequential DCT | |||||||||||
X’FFCE’ | SOF14 | Differential progressive DCT | |||||||||||
X’FFCF’ | SOF15 | Differential lossless (sequential) | |||||||||||
Huffman table specification | |||||||||||||
X’FFC4’ | DHT | Define Huffman table(s) | |||||||||||
Arithmetic coding conditioning specification conditioning(s) | |||||||||||||
X’FFCC’ | DAC | Define arithmetic coding | |||||||||||
Restart interval termination | |||||||||||||
X’FFD0’ through X’FFD7’ | RSTm* | Restart with modulo 8 count “m” | |||||||||||
Other markers | |||||||||||||
X’FFD8’ | SOI* | Start of image | |||||||||||
X’FFD9’ | EOI* | End of image | |||||||||||
X’FFDA’ | SOS | Start of scan | |||||||||||
X’FFDB’ | DQT | Define quantization table(s) | |||||||||||
X’FFDC’ | DNL | Define number of lines | |||||||||||
X’FFDD’ | DRI | Define restart interval | |||||||||||
X’FFDE’ | DHP | Define hierarchical progression | |||||||||||
X’FFDF’ | EXP | Expand reference component(s) | |||||||||||
X’FFE0’ through X’FFEF’ | APPn | Reserved for application segments | |||||||||||
X’FFF0’ through X’FFFD’ | JPGn | Reserved for JPEG extensions | |||||||||||
X’FFFE’ | COM | Comment | |||||||||||
Reserved markers | |||||||||||||
X’FF01’ | TEM* | For temporary private use in arithmetic coding | |||||||||||
X’FF02’ through X’FFBF’ | RES | Reserved |
■JPEGファイルのセグメントをExcelシートに表示する処理
JPEGファイルのセグメントを読み込み、Excelシートに「オフセット」「マーカー」「セグメント長」を表示するプログラムです。
⇒サンプル・プログラムで使用している、Binary Fileクラスの詳細については、Excel VBAでファイル解析(事前準備編)を参照して下さい。
処理の概要
処理の流れは以下の通りです。
①Binary Fileオブジェクトをインスタンス化し、JPEGファイルを読み込み
②JPEGファイルのセグメントを解析し、必要な情報を取得してExcelシートにセット
③使用済のオブジェクトを破棄
サンプル・プログラム
行番号8でBinary Fileオブジェクトをインスタンス化し、行番号9でJPEGファイルを読み込んでいます。
行番号12~42の繰返し処理のうち、行番号17~28はイメージ・データ、行番号30~33はSOIとEOI、行番号35~40はセグメントに関する処理です。
- Dim sht, bf As Object
- Dim wID As String
- Dim wLoc, wLen, lcnt As Long
- Private Sub Sample1()
- Set sht = ActiveSheet
- sht.Cells.NumberFormatLocal = “@"
- Set bf = New BinaryFile
- bf.InputFile (“C:\work\xxx.jpg")
- lcnt = 0
- Do While bf.CurrentPosition < bf.FileSize – 1
- wLoc = bf.CurrentPosition
- wID = bf.GetDataHex(2)
- Select Case wID
- Case “0000" To “FF00"
- lcnt = lcnt + 1
- sht.Cells(lcnt, 1) = Right(“0000000" & Hex(wLoc), 8)
- sht.Cells(lcnt, 2) = “-“
- sht.Cells(lcnt, 3) = “image data"
- Do While bf.CurrentPosition < bf.FileSize – 1
- If (bf.GetDataHex(1) = “FF") And (bf.GetDataHex(1) <> “00") Then
- bf.CurrentPosition = bf.CurrentPosition – 2
- Exit Do
- Else
- bf.CurrentPosition = bf.CurrentPosition – 1
- End If
- Loop
- Case “FFD8", “FFD9"
- lcnt = lcnt + 1
- sht.Cells(lcnt, 1) = Right(“0000000" & Hex(wLoc), 8)
- sht.Cells(lcnt, 2) = wID
- sht.Cells(lcnt, 3) = “-“
- Case Else
- lcnt = lcnt + 1
- sht.Cells(lcnt, 1) = Right(“0000000" & Hex(wLoc), 8)
- sht.Cells(lcnt, 2) = wID
- wLen = bf.GetData(2)
- sht.Cells(lcnt, 3) = Right(“000" & Hex(wLen), 4)
- bf.SkipData (wLen – 2)
- End Select
- Loop
- Set bf = Nothing
- End Sub
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ
ディスカッション
コメント一覧
まだ、コメントがありません