しいしせねっとわーく
[映像編] [色規格] [JPEG] [QRコード]

フォーマット辞典JPEG編

Last update 

JPEGの部分が長いので、分割しました。

このページのもくじ

JPEG (ITU-T勧告 T.81 JIS X 4301)

標準的な画像フォーマット(を作った組織?)。ITU-T,ISO等のJoint Photographic Experts Groupが標準化したのが名前の由来。ITU-T勧告T.81、ISO/IEC 10918-1:1994、 JIS X4301?になっている。
翻訳されたJIS X 4301 や ITU-T勧告T.80シリーズ(どちらも中身は同じ)も、販売されている。
Independent JPEG Group などからライブラリが公開されているので、ほとんどの場合ライブラリを利用して開発ができるが、ブラックボックス化してしまわないよう、ここでは詳細について解説する。

JPEG的画像の基本的な仕組み

↓工事中(推測を含む記述があります)

JPEGの基本的なファイルフォーマットは、マーカで区切られている。
0xFFxxの2バイトの識別子で、各種情報を格納している。ITU-Tらしく、各情報には3文字の名前が付けられている。
基本フォーマットと拡張フォーマットがあり、不可逆圧縮だけでなく、可逆圧縮にも対応している。
一般的にDCTといわれる周波数への変換とハフマン符号化を使った圧縮方法が使われている。その他形式のものもオプションとして存在する。
単色画像、フルカラー画像に対応。

画像は、8x8ドット(の倍数!)単位で符号化される。
プログレッシブ表示(最初に荒く画像を表示して、徐々に細かく表示する方式)に対応している。

色分離、DCT変換、量子化、圧縮を、順に行うことで、JPEGのデータが出来上がる。

色は、RGBではなくYCrCbで管理されるので、最初に画像データは、Y,.Cr,Cbの輝度、色相情報に分割される。

Y = 0.29900 * R + 0.58700 * G + 0.11400 * B 輝度 明るさ
Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + 0x80 色差
Cr = 0.50000 * R - 0.41869 * G + 0.08131 * B + 0x80 色差

R = Y + 1.40200 * (Cr - 0x80)
G = Y - 0.34414 * (Cb - 0x80) - 0x71414 * (Cr - 0x80)
B = Y + 1.77200 * (Cb - 0x80)

YCrCbの各データは、8x8ドット単位でまとめられ、並びを周波数分解(DCT)され、8x8の周波数成分の配列になる。

Cr,Cbは、多少間引いても人間の目には目立たないので、2ドットに1ドットが使われている場合がある。(16*16ドットの領域から8*8ドットを取り出してDCT変換して圧縮したりする。)

DCT変換

Svu = 1/4 CuCv Σ(x=0 7)Σ(y=0 7) Syx COS((2x+1)uπ/16)・cos(((2y+1)vπ)/16)

DCT変換後のデータは、左上が低周波数、右下が高周波数のデータとなる。
DCTのスキャン順序
1 2 6 7 15 16 28 29
3 5 8 14 17 27 30 43
4 9 13 18 26 31 42 44
10 12 19 25 32 41 45 54
11 20 24 33 40 46 53 55
21 23 34 39 47 52 56 61
22 35 38 48 51 57 60 62
36 37 49 50 58 59 63 64

↑1を特にDC成分、それ以外をAC成分という。

DCTをスキャン順序で斜めにジグザグスキャンして、圧縮している。

斜めにスキャンするのは、DCT変換したあとのテーブルは、左上の要素が大きい数値になり、右下はほとんど0が続いて、圧縮しやすくなるためである。
DCTテーブルは、前のデータとの差を保存する。
スキャン順に、前のデータを次のデータから引いた値を使う。

DCは、DCだけを集めて、差分が取られる。最初のDCだけは、0と比較される。
このとき、DCTのデータをそのまま使うのではなく、量子化テーブルを使って、各数値に重み付けをして、ほとんど使わないデータを削ってしまう。(割り算する)
スキャンしたデータは、ハフマン符号化して、圧縮される。

JPEGファイルのフォーマット

ファイルの中は、マーカで区切られている。
一般的なフォーマットは、JFIFという形式。JPEG自体は厳密な利用のできるようなファイルフォーマットを決めていない。厳密な形式が決まっていない分、モノクロ12ビット階調や、RGBのデータなどにも本来は対応できる。JFIF以外の形式も存在するが、現在は使われていないといってもいい。Exifなんていうデジカメ用の形式は、JFIFを少し拡張しただけで互換性はあるのかな。 TIFFやJNG形式の外枠にはめ込むこともできる。
各マーカは、サイズが決まっている。
サイズ情報を読み、確実に次のマーカの位置を特定できるようにしよう。可変長のマーカのサイズは、普通、マーカのすぐ後ろに書かれている。書かれていないものもある。
特定できないと、データのFFXXもマーカと読み違えてしまうことになるので注意しよう。

SOI, EOI, RSTm以外は、次のような形式になる。

SOSのあとは、マーカで区切られているわけではない。RSTが指定されていればRSTをはさみながら画像のデータが続き、EOIで終了する。

マーカ・コード 長さ データ
FFxx(16bit) 16bit 可変サイズ
通常使われるマーカ一覧
マーカ 名前
FFD8 SOI Start of Image ファイルの先頭
FFE0 APP0 2種類ある 解像度情報など(ローダでは無視できる JFIFで使用)
FFE0(2)
マーカSIZE(2)
"JFIF"(4)
00(1)
Format Version 0101(2)
単位 00(1)
水平解像度 0001(2)
垂直解像度 0001(2)
サムネイル画像横サイズ 00(1)
サムネイル画像縦サイズ 00(1)
FFDB DQT 量子化テーブル定義
FFDB
Lq(2) テーブルサイズ
{
Pq(4bit) 量子化テーブル精度(0:8bit 1:16bit 通常:0)
Tq(4bit) 量子化テーブル番号(1-4 0-3?)
データ 64個
}
複数のテーブルを1つのマーカで書くことも、複数のマーカに別けて書くこともできる。
FFC4 DHT DCTで算出された値のエンコード用に作られたハフマンテーブルの情報
Lh ハフマンテーブル長
{
Th ハフマンテーブル識別子
(上位4bit 0: DC成分 1: AC成分
下位4bit 識別番号 0~3)
Li(8bit) 長さiのハフマン符号数(1<=i<=16)
Vij(8bit)
}
通常は、JPEG仕様に載っている物がそのまま使われる。
FFC0 SOF0

標準DCT圧縮
Lf(2)
P(1) サンプル精度
Y(2) 垂直サイズ
X(2) 水平サイズ
Nif(1) サンプリング数 03 (YCrCbの3つ)
{ フレーム成分指定パラメータ Nifの数繰り返し
成分識別子(1)
水平(0.5)/垂直(0.5)サンプリングファクタ 各1~4
量子化テーブルセレクタ(1)
}

例 FFC0 0011 08 0100 0100 03
01,22,00(JFIFでは輝度)
02,11,01
03,11,01

FFC1 SOF1 プログレッシブDCT圧縮
FFDD DRI イメージのリスタート間隔を定義する
FFDA SOS Start of Scan
エンコードされたイメージデータ
Ls SOSのヘッダ長 6 + 2 * Ns
Ns 数 (1~4)
{
Csi
flag 10:Tdi DC 1:Tai AC用ハフマンテーブルセレクタ
} * n
Ss
Se
Ah
Al
FFD9 EOI End of Image ファイルの終端
FFE0~ED APPx アプリ
FFEx APPxマーカ(2)
XXXX サイズ(2)
XXXX データ(可変長)

APP0は、JFIFフォーマットで特別に使われる。
内部にFFXXのデータを各種含むことがある。

FF00
SOS中での? データ0xFF

通常のマーカの順番

SOI  FFD8
{ フレーム
  APP0 FFE0 JFIFヘッダ
  DQT  FFDB 量子化テーブル
  DHT  FFC4 ハフマンテーブル
  SOF0 FFC0 標準DCT圧縮 (プログレッシブの場合は別)
  { スキャン1
    SOS FFDA 
    データ
  }
}
EOI FFD9 

この順番とは限らない。

参考

JPEG特許問題

米国では、Forgentという会社が米国特許第4,698,672号 「Coding system for reducing redundancy」(1986年出願)の特許使用料を行使しはじめているようなので、開発の際には注意が必要です。2007年9月まで(2004年10月6日まで?)の有効期限の特許。日本では特開昭63-148789 として同様の特許が出願されているが、1997年1月14日に拒絶査定がでたため成立していないらしい。MPEG-2にも同特許が含まれている。
可逆圧縮の場合もまた、米UnisysのGIF関連と同じ特許に接触します。
どちらも、圧縮の場合のみ。

カラー静止画符号化方式標準化の経緯
1982.9 ISO/TC97/SC2内に画像符号化を主担務とするWG8設立。
1984.4 ISO/TC97/SC2の京都会合においてカラー静止画像符号化方式標準化検討がスタート。
1984.12 適応ブロック符号化方式(ABTC)が標準案候補となる。
1986.3 ABTCに関する検討は不十分。
DCT、順次再生符号化方式(PCS)など新しい方式の提案あり。
CCITT SG VIII CCIC と ISO/TC97/SC2/WG8 のジョイント・グループJPEGを設立。本格的な標準化活動が開始される。
1987.3 12方式が提案される。階層符号化特性を入れるなど、評価法の決定。
1987.6 評価を行い、3候補を最終候補として選定。
1988.1 リファインされた最終候補を評価。実ハードウェアにより評価も含めADCTを標準案基本とすることに決定。
(以下略)
インターフェース '91年12月号(CQ出版)より

参考

Exifフォーマット

カメラ等で原色や撮影時間等々を管理するために使われているJPEGの拡張形式。新しいのはExif2.2(愛称Exif Print)のようである。
富士フィルムが作成、JEIDA(現JEITA?)やISOで規格化され、JPEG、TIFF、FlashPixに対応している。Exifサポートグループ(SEG)あり。
進化系としてDCFという形式もある。CIPAに各種資料がありそうだ。

参考

DCF

Exifの進化系?

参考

DPOF(Digital Print Order Format)

キャノン株式会社、イーストマンコダック社、富士写真フィルム株式会社、松下電器産業株式会社が提案したフォーマット

PRINT Image Matching 2

EPSONなどなどの形式

参考

Motion JPEG

モーションJPEG。特に決まった形式はなかったような気がするが、JPEGを集めて動画形式にしたもの。PlayStationなどで使われていたのが有名か?

JPEG-LS (Lossless-JPEG)

可逆/準可逆JPEGフォーマット。JPEG 2000の元にもなったようだ。Hewlett-Packard のLOCOというのが元になっているのだとか。

参考

JPEG 2000

次の世代のJPEGフォーマット。リコー等々により開発された?
ウェーブレットという圧縮アルゴリズムを採用?ウォーターマークは署名を隠す技術?
今までの形式とは違い、可逆圧縮などもサポートする。(JPEGでも可逆圧縮フォーマット(JPEG-LS?)を持っている)
画像を、半分のサイズの画像と差分で階層的につくり出すので、多段階のサイズでの表示が可能。
↓FlashPix形式を置き換えるか?

Motion JPEG 2000などなどもあるらしい。

参考

[しいしせねっと] [技術資料室] [フォーマット編] [お問い合わせ]