Excel VBAでファイル解析(JPEGファイル編)

2024-01-05

■JPEGファイルの概要

JPEG(Joint Photographic Experts Group)は画像データの圧縮に関する規格の1つで、ファイルの拡張子は「.jpg」または「.jpeg」です。

JPEGファイルの内部形式について次項で説明しますが、詳細は以下の規格書を参照して下さい。
(項番2、項番3は有償ですが、項番1はITU-Tのサイトで開示されています)

  1. ITU-T勧告 T.81
  2. ISO/IEC 10918-1:1994
  3. 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はセグメントに関する処理です。

  1. Dim sht, bf As Object
  2. Dim wID As String
  3. Dim wLoc, wLen, lcnt As Long
  4. Private Sub Sample1()
  5.     Set sht = ActiveSheet
  6.     sht.Cells.NumberFormatLocal = “@"
  7.     Set bf = New BinaryFile
  8.     bf.InputFile (“C:\work\xxx.jpg")
  9.     lcnt = 0
  10.     Do While bf.CurrentPosition < bf.FileSize – 1
  11.         wLoc = bf.CurrentPosition
  12.         wID = bf.GetDataHex(2)
  13.         Select Case wID
  14.         Case “0000" To “FF00"
  15.             lcnt = lcnt + 1
  16.             sht.Cells(lcnt, 1) = Right(“0000000" & Hex(wLoc), 8)
  17.             sht.Cells(lcnt, 2) = “-“
  18.             sht.Cells(lcnt, 3) = “image data"
  19.             Do While bf.CurrentPosition < bf.FileSize – 1
  20.                 If (bf.GetDataHex(1) = “FF") And (bf.GetDataHex(1) <> “00") Then
  21.                     bf.CurrentPosition = bf.CurrentPosition – 2
  22.                     Exit Do
  23.                 Else
  24.                     bf.CurrentPosition = bf.CurrentPosition – 1
  25.                 End If
  26.             Loop
  27.         Case “FFD8", “FFD9"
  28.             lcnt = lcnt + 1
  29.             sht.Cells(lcnt, 1) = Right(“0000000" & Hex(wLoc), 8)
  30.             sht.Cells(lcnt, 2) = wID
  31.             sht.Cells(lcnt, 3) = “-“
  32.         Case Else
  33.             lcnt = lcnt + 1
  34.             sht.Cells(lcnt, 1) = Right(“0000000" & Hex(wLoc), 8)
  35.             sht.Cells(lcnt, 2) = wID
  36.             wLen = bf.GetData(2)
  37.             sht.Cells(lcnt, 3) = Right(“000" & Hex(wLen), 4)
  38.             bf.SkipData (wLen – 2)
  39.         End Select
  40.     Loop
  41.     Set bf = Nothing
  42. End Sub

国本温子(著),緑川吉行(著),できるシリーズ編集部(著)
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ

大村あつし(著),古川順平(著)
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ

高橋宣成(著)
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ

ファイル解析

Posted by hides