玄関コンピュータの部屋各種解説コーナーCGファイル概説

6.3 仕様

イメージ開始セグメント
タイプ0のアプリケーションセグメントヘッダ情報
拡張情報セグメント
(オプション)
量子化テーブル定義セグメント
:
フレームタイプ0開始セグメント
ハフマン法テーブル定義セグメント
:
スキャン開始セグメント
:
イメージ終了セグメント

JPEG圧縮法をサポートする画像ファイルフォーマットは色々ありますが、ここでは最も一般的なJFIFの仕様を説明することにします。

JFIFファイルは「セグメント」と呼ばれるデータ単位から構成されていて、各セグメントは先頭にあるマーカーと呼ばれる2バイトの識別コードによって区別されます。 マーカーの最初の1バイトはマーカーであることを表す「FFH(16進)」で、次の1バイトがマーカーの種類を表します。 たいていのセグメントはマーカーの後に一定の長さのフィールドが続き、フィールドの先頭にはフィールドの長さを表すデータがあります。

セグメントはGIFファイルのブロックに相当し、マーカーはタグに相当しますが、GIFファイルのブロックが決まった順番で並んでいるのに対して、JFIFファイルのセグメントの順番は最初の2つ、つまり最初にイメージ開始セグメントがあり、次にタイプ0のアプリケーションセグメントが続くということ以外はかなり柔軟性があります。

またマルチバイトデータは、最上位バイトから順に保存されるビッグエンディアン形式で保存されます。

(1) イメージ開始セグメント(Start of image segment、SOI)

オフセット内容(バイト数)
0マーカー識別子(1)
固定値FFH
1SOIマーカー(1)
固定値D8H

JFIFファイルの開始を表すセグメントで、JFIFファイルの先頭に1つだけ存在します。

1) マーカー識別子(M_ID)

このバイトと次のバイトがマーカーであることを識別するためのデータで、常に固定値FFHです。

2) SOIマーカー(M_SOI)

SOIセグメントであることを表すマーカーで、常に固定値D8Hです。

(2) タイプ0のアプリケーションセグメント(Application type 0 segment、APP0)

オフセット内容(バイト数)
0マーカー識別子(1)
固定値FFH
1APP0マーカー(1)
固定値E0H
2フィールドの長さ(2)
バイト単位
4JFIF識別子(5)
固定値ASCII"JFIF\0"(4A46494600H)
9バージョン番号(2)
11ピクセル濃度の単位(1)
整数コード
12横のピクセル濃度(2)
整数
14縦のピクセル濃度(2)
整数
16サムネイルイメージの横幅(1)
ピクセル単位
17サムネイルイメージの高さ(1)
ピクセル単位
18サムネイルイメージ(3N)
イメージデータ

タイプ0のアプリケーションデータを保存したセグメントで、JFIFファイルの場合はファイルのヘッダ情報を含んでいます。

1) マーカー識別子(M_ID)

このバイトと次のバイトがマーカーであることを識別するためのデータで、常に固定値FFHです。

2) APP0マーカー(M_APP0)

APP0セグメントであることを表すマーカーで、常に固定値E0Hです。

3) フィールドの長さ(Length)

マーカーに続くフィールドのバイト数を表すデータで、このデータ自体も含めた値です。 この値に2を足した値がセグメントの長さになります。 サムネイルイメージがない場合、この値は常に16です。

4) JFIF識別子(JFIF_ID)

JFIFファイルであることを表すデータで、常にASCII文字の「JFIF\0(4A46494600H、最後にヌル文字を含む)」です。

5) バージョン番号(Version)

JFIFファイルのバージョンを表すデータで、最初のバイトがメジャーバージョンを整数で表し、次のバイトがマイナーバージョンを整数で表します。 例えばVersion 1.01 の場合は「11(0101H)」、Version 1.02 の場合は「12(0102H)」となります。

6) ピクセル濃度の単位(Unit)

画像のピクセル濃度(解像度)の単位を表す整数コードで、以下のような種類があります。

7) 横と縦のピクセル濃度(X_den、Y_den)

画像の水平方向と垂直方向のピクセル濃度を整数で表したものです。

8) サムネイルイメージの幅と高さ(X_thumb、Y_thumb)

サムネイルイメージとは元の画像を「親指の爪(Thumbnail)」ほどの大きさに縮小した小さな画像のことで、元の画像を展開する前に見本として表示するためのものです。 このデータはサムネイルイメージの幅と高さをピクセル単位で表したもので、サムネイルイメージがない場合はどちらの値も0となります。

9) サムネイルイメージ(Thumb)

サムネイルイメージのビットマップイメージデータで、24ビットのRGBデータを含みます。 イメージデータのサイズは、ピクセル数をN=X_thumb × Y_thumb としますと3Nバイトとなります。

(3) 量子化テーブル定義セグメント(Define quantization table segment、DQT)

オフセット内容(バイト数)
0マーカー識別子(1)
固定値FFH
1DQTマーカー(1)
固定値DBH
2フィールドの長さ(2)
バイト単位
4精度とテーブル識別子(1)
4ビット単位のコード
5量子化因子QF00(1or2)
8ビットまたは16ビット整数
::
 量子化因子QF77(1or2)
8ビットまたは16ビット整数
::

YCbCrスペクトルデータを量子化するための量子化因子を定義した、量子化テーブルセグメントです。

1) マーカー識別子(M_ID)

このバイトと次のバイトがマーカーであることを識別するためのデータで、常に固定値FFHです。

2) DQTマーカー(M_DQT)

DQTセグメントであることを表すマーカーで、常に固定値DBHです。

3) フィールドの長さ(Length)

マーカーに続くフィールドのバイト数を表すデータで、このデータ自体も含めた値です。 この値に2を足した値がセグメントの長さになります。

4) 精度とテーブル識別子(P/T)

上位4ビットは次に続く量子化因子の精度を表すコードであり、下位4ビットはテーブルの識別子を表します。 量子化因子の精度を表すコードは以下のような種類があり、テーブル識別子は0、1、2、3の4種類があります。

5) 量子化因子(QF00〜QF77)

8ビットまたは16ビットの整数で表された量子化因子です。 JPEG圧縮では画像は8×8ピクセルの小領域に分割して処理されますので、スペクトル要素は8×8=64個あり、それに対応して量子化因子も64個あります。 それらの量子化因子は縦と横の座標値0〜7を添え字としてQF00〜QF07、QF10〜QF17、…、QF70〜QF77と表され、64個1組で1つの量子化テーブルを形成します。 したがって量子化テーブル全体のサイズは、精度とテーブル識別子バイトも含めて1+64バイトまたは1+128バイトになります。

DQTセグメントには最大4つの量子化テーブルを含むことができますが、普通はY要素が使用するテーブル(通常はテーブル識別子0)を1つと、Cb要素とCr要素が共通で使用するテーブル(通常はテーブル識別子1)を1つ含みます。