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変換後のデータは、左上が低周波数、右下が高周波数のデータとなる。
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のデータをそのまま使うのではなく、量子化テーブルを使って、各数値に重み付けをして、ほとんど使わないデータを削ってしまう。(割り算する)
スキャンしたデータは、ハフマン符号化して、圧縮される。
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圧縮 例 FFC0 0011 08 0100 0100 03 |
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フォーマットで特別に使われる。 |
FF00 | SOS中での? データ0xFF |
通常のマーカの順番
SOI FFD8 { フレーム APP0 FFE0 JFIFヘッダ DQT FFDB 量子化テーブル DHT FFC4 ハフマンテーブル SOF0 FFC0 標準DCT圧縮 (プログレッシブの場合は別) { スキャン1 SOS FFDA データ } } EOI FFD9
この順番とは限らない。
参考
米国では、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出版)より
参考
カメラ等で原色や撮影時間等々を管理するために使われているJPEGの拡張形式。新しいのはExif2.2(愛称Exif Print)のようである。
富士フィルムが作成、JEIDA(現JEITA?)やISOで規格化され、JPEG、TIFF、FlashPixに対応している。Exifサポートグループ(SEG)あり。
進化系としてDCFという形式もある。CIPAに各種資料がありそうだ。
参考
Exifの進化系?
参考
EPSONなどなどの形式
参考
モーションJPEG。特に決まった形式はなかったような気がするが、JPEGを集めて動画形式にしたもの。PlayStationなどで使われていたのが有名か?
可逆/準可逆JPEGフォーマット。JPEG 2000の元にもなったようだ。Hewlett-Packard のLOCOというのが元になっているのだとか。
参考
次の世代のJPEGフォーマット。リコー等々により開発された?
ウェーブレットという圧縮アルゴリズムを採用?ウォーターマークは署名を隠す技術?
今までの形式とは違い、可逆圧縮などもサポートする。(JPEGでも可逆圧縮フォーマット(JPEG-LS?)を持っている)
画像を、半分のサイズの画像と差分で階層的につくり出すので、多段階のサイズでの表示が可能。
↓FlashPix形式を置き換えるか?
Motion JPEG 2000などなどもあるらしい。
参考