直】 8 ・コメント .COM/ セグメント コメントセグメントを Fig. 2.25 と Table 2.10 に示します。このセグメントの利用方法も、 JPEG では規定していません。利用者が自由にコメントを書いたり、コピーライト表示に 使うことができます。一部のアプリケーションでは、画像がそのアプリケーションで作成 されたことを示す一文を挿入しています。 JPEG では、文字列の形式についての規定がありません。インターネットなどで見かけ る画像データでは、 C 文字列 ( 最後に nu Ⅱ文字 0X00 を付けた文字列 ) を利用しているも 0 ~ 255 のが多いようです。 Fig. 2.25 コメントセグメントの構造 コメントセグメント COM Lc Cml 1 バイト cmu- Table 2.10 コメントセグメントパラメータのサイズと許容値 2 バイト 意味 バラメータ Lc Crnl サイズ ( ビット ) 8 16 許容値 2 ~ 65535 パラメータ長 コメントデータ ロ」 9 ・その他のマーカ 2.6.3 ープルデータ指定の省略フォーマットといいます。このフォーマットを Fig. 2.26 に示します。 ておかなければなりません。画像を含まないテープルのみのデータのフォーマットを、テ 省略フォーマットの画像データを復号するには、あらかじめ復号器にテープルを設定し います。 プルなどのデータを付加していない JPEG データのフォーマットを省略フォーマットとい ができます。この場合、画像データにテープルデータを付加する必要はありません。テー JPEG では、複数の画像で量子化テープルとハフマンテープルを共有して利用すること 省略フォーマット す。 特に、 SOFI ~ SOF15 が現れた場合は、復号不可能としてただちに処理を終了するべきで また、復号器では無視するか、あるいはエラーとして処理を中断してもよいでしよう。 号器ではそのマーカを使用する必要はありません。 こまでで説明しなかったマーカは、基本 DCT 方式では使用しません。ですから、符 第 2 章 JPEG におけるデジタル静止画像圧縮
Fig. 2.29 JFIF フォーマットセグメント バージョン 1 .02 の構造 1 バイト 2 バイト 〃バイト JFIF フォーマットセグメント Xd Yt サムネイル Xt APPO 2 La Yd 刈ー 1 , Ⅵ -1 サムネイル C 文字列 " JF 旧 \ 0 " が入る RO 。 GOO Boo RO G 1 。 B G B Xt- Xt-1,O X い 1 , Ⅵー 1 X い 1 , Ⅵー 1 Table 2.11 JFIF フォーマットセグメントバーション 1.02 パラメ ータのサイズと許容値 バラメータ サイズ ( ビット ) 許容値 意味 La 16 2 ~ 65535 パラメータ長 "JFIF\O" ID 40 JFIF 識別子 (C 文字列、固定 ) VI 8 0 ~ 255 メジャーバージョ ン 8 0 ~ 255 マイナーバージョ ン 密度単位 8 0 , 1 , 2 ( 0 : 単位無し、 1 ・ . dots/inch 、 2 : dots/cm) Xd 横密度 0 ~ 65535 Yd 縦密度 0 ~ 65535 Xt サムネイル横ドット数 0 ~ 255 Yt 0 ~ 255 サムネイル縦ドット数 RI サムネイル R 成分 : 座標えゾ 0 ~ 255 GI, 0 ~ 255 サムネイル G 成分 : 座標えゾ BI, 0 ~ 255 サムネイル B 成分 : 座標えゾ 第 2 章 JPEG におけるデジタル静止画像圧縮
第 8 ・ J 日 F フォーマット解析 納します。 void mProperty . Format mProperty mProperty . mProperty . Units mProperty このメソッドでは、 JFIF のフォーマット指定を解釈して、 mProperty の各メンバに格 うになっていますが、基本 DCT 方式では 2 っすっしか使用しないと決まっています。ハ フマンテープル定義セグメントが多数あっても問題はないのですが、実際に 3 つ以上使用 することが Td , Ta で明らかになったら、エラーとして例外を送出するようにしています。 mProperty . HThumbnai 1 mProperty . VThumbnai 1 CJpegDecoder : :Ana1ysisJF 工 F ( void ) . MajorReviSIOns m 工 BSP->GetByte() ー MinorReviSions mIBSP—>GetByte ( ) ー m 工 BSP—>GetByte() : mProperty. HDensity = m 工 BSP—>GetWord ( ) : mProperty. VDensity = Ⅲ工 BSP->GetWord ( ) ー . CanDecode ー = Ⅲ工 BSP->GetByte ( ) : Ⅲ工 BSP->GetByte( ) : emIsJF 工 F; JF 工 F / / バージョン上位 / / バージョン下位 / / 単位 () ・無し、 1 : dots / inc 2 :dots/cm / / 横密度 / / 縦密度 / / 指定有り JF 工 F フォーマット / / 画素数 / / サムネイル縦 / / 画素数 / / サムネイル横 縦横のサムネイルの画素数が 0 でないときは、このヘッダの後にサムネイル画像が続き 飛ばします。読み飛ばし処理は、 Ana1ysisJF 工 F() から Ana1ysisMarker() へ戻ってか ます。 c こ pegDec 。 der では JFIF のサムネイルをサポートしませんから、その部分を読み ら行います。 ■コ 9 ・ JFXX フォーマット解析 Ana1ysisJFXX( ) は、 JFXX のフォ / / 拡張コー mProperty . Format / / JFXX void に格納します。 ーマット指定を解釈して、 mProperty の - 各・メンノヾ CJpegDecoder : :Ana1ysisJFXX ( ▽ 0 土 d ) Ⅲ工 BSP—>GetByte( ) ー mProperty . ExtensionCode ド 0x10:JPEG, 0x11: lbyte/pixel, 0x13 : 3bytes/pixeI 160 第 4 章実装 Marker ( ) へ民ってから行います。 その部分を読み飛ばします。読み飛ばし処理は、 Ana1ysisJFXX() から Ana1ysis イル画像が続きます。 CJpegDecoder では、 JFXX のサムネイルもサポートしませんから、 JFIF と同様に、縦横のサムネイルの画素数が 0 でないときは、このヘッダの後にサムネ
JPEG データは SOI マーカで始まっているので、ます、この検出を行います。 通常、フレームの先頭に量子化テープルとハフマンテープル定義データがあるので、 れらを解釈して復号処理の準備を行います。テープルと画像データは別ファイルになって いることもあります。 フレームヘッダを解釈すると、画像のサイズ、成分数、成分ごとの水平・垂直サンプリ ングファクタ、成分ごとに使用する量子化テープルなどがわかります。また、スキャンへ ッダを解釈すると、成分ごとに使用するハフマンテープルが決まります。 復号は MCU 単位で行います。 MCU を復号すると、該当する部分のカラーデータができ あがります。 リスタートインタバルマーカを検出した場合は、復号器をリセットします ( 各成分の前 のプロックの DC 成分を 0 にします ) 。 復号処理では、 JPEG のフォーマットに適合したすべてのデータを復号できなければな りません。また、 JPEG フォーマットでは、 部のマーカの出現順序が規定されていない 29.1 画像の表現方法 29 ー J 日 F と間引き ので、柔軟に対処できるように設計しなければなりません。 第 2 章 JPEG におけるデジタル静止画像圧縮 号無し 1 バイトで数値を表現するためのものです。 RGB 表色系と YCbCr 表色系の相互変換式は以下のとおりです。この式の 128 とは、符 使用します。 順です。それぞれの成分は 1 画素につき 256 階調です。グレー画像の場合は Y 成分のみを JFIF では、カラー画像の表現に YCbCr 表色系を用います。成分の順序は Y , Cb, Cr の トなどで公開されている JPEG データは、すべて JFIF です。 フォーマットとして、 JFIF (JPEG File lnterchange Format) があります。インターネッ 不特定のプラットフォーム、アプリケーション間での JPEG データの交換を目的とした に決まっていなければなりません。 アプリケーションで利用可能なデータを提供する場合は、使用する表色系と成分順序が公 てしまってかまいません。しかし、インターネットなどで、不特定のプラットフォーム、 ータ交換を考えないのであれば、そのアプリケーションが表色系と画像成分の順序を決め 特定のアプリケーションで独自に JPEG データを利用し、他のアプリケーションとのデ ることはできませんし、成分番号と成分の対応もわかりません。 とになっています。ところが、 JPEG フォーマットでは、どの表色系を使っているかを知 JPEG では、様々な表色系に対応できるように、フレームヘッダで成分数を指定するこ YCbCr や YMCK といった表色系があります。 コンピュータ上では RGB 表色系が最もよく利用されています。 RGB 表色系の他にも カラー画像は複数の成分から構成されています。構成方法にはいくつかの種類があり、
0 1 っ 0 / 張 / 張 - ) / 張 / 4 / 4 / 4 / 4 / 張 2.6.3> 省略フォーマット 2.7 符号化処理の流れ 28 復号処理の流れ 29 J 日 F と間引き 2.9.1 画像の表現方法 2.9.2>J 日 F フォーマット 2.10 JPEG と C + + 第 3 章 仕様と論理設計 コーディング規約 3.1 3.1.1 シンボル名 3.1 .2> ファイル名・ 3.1 .3> 型 3.2 全体の構成 3.3 実現の範囲 3.3.1 入出力 3.3.2> 符号化処理の機能範囲・・ 3.3.3> 復号処理の機能範囲 データの設計 3.4 3.4.1 画像属性データ 3.4.2> ハフマンテーブル 3.4.3> 量子化テーブル 3.4.4> マーカ・・ 3.4.5> RGB データ 3.4.6> YCbCr データ・・ 3.5 クラスの設計 3.5.1 COutBitStream クラス・ ・・・ 48 0 0 1 1 1
JFXX フォーマットセグメントの構造 Fig. 2.30 2 バイト 〃バイト 1 バイト (a) JFIF フォーマットセグメント E サムネイル La APPO C 文字列 "JFXX\O" が入る (b) サムネイル JPEG データ JPEG のとき E = 0X10 刈 -1 , Ⅵ -1 VI 。 V2 0 VO 。 Cp 1 バイト / ドットのとき Xt Yt E = 0X1 1 3 バイト / ドットのとき Xt Yt Roo Goo Bo 。 E = 0X13 Xt-1,Yt-1 刈 - , Ⅵ -1 刈 -1 , Ⅵ -1 (c) CP カラーバレット R255 G255 B255 RO GO BO Table 2.12 JFXX フォーマットセグメントパラメータのサイズと許容値 許容値 バラメータ 2 ~ 65535 La "JFXX\O" ID 0X10 , 0X11 , 0X13 Xt Yt Cp VI, BI, 意味 パラメータ長 JFXX 識別子 ( C 文字列、固定 ) 拡張コード ( 0X10 : JPEG, 0X11 : lbyte /pixel, 0X13 : 3byte/pixeI) サムネイル横ドット数 サムネイル縦ドット数 カラーパレット 画素値 ( 256 色、実際の色はカラ ーパレ ットで指定 ) 赤成分値 緑成分値 青成分値 サイズ 16 ビット 40 ビット 8 ビット 8 ビット 768 パイト 8 ヒ、 ット 8 ビ ット 8 ビ ット 0 ~ 255 0 ~ 255 ( 各バイト ) 0 ~ 255 0 ~ 255 ワ」ワワ 2.9 JFIF と間引き
0.2990 十 0.5870G 十 0.1140B ー 0.1687 一 0.3313G 十 0.5000B 十 128 0.5000 一 0.4187G ー 0.0813B 十 128 十 1 .40200 ( Cr ー 128 ) = Y G= Y— 0.34414 ( C わー 128 ) ー 0.71414 ( Cr ー 128 ) B = Y + 1 .77200 ( C わー 128 ) 変換を行うと、符号無し 1 バイトで扱える範囲を越えることがあります。この場合は適 宜補正が必要です。負になった場合は 0 に、 255 を超えた場合は 255 にします。 、、・ J 日 F フォーマット JPEG データが JFIF であるかは、 APPo マーカのアプリケーションデータセグメントに よって識別します。この様子を Fig. 2.29 と Table2.11 に示します。 ID には、 " JFIF \ 0 " という C 文字列が入っています。 これを表す値として VI V ぃ V2 は JFIF のバージョンです。現在のバージョンは 1.02 で、 に 1 が、 V2 に 2 が入っています。 U は画像の密度単位です。 0 : 単位無し、 1 : ドット / インチ、 2 : ドット / センチメート ルの 3 種類から選びます。 Xd, Yd はこの単位に従った横と縦の密度です。 また、 JFIF ではサムネイル (thumbnail) を添付することができます。サムネイルを直 訳すると「親指の爪」ですが、これはその程度の大きさの画像という意味で、プレビュー や一覧表示などに利用すると便利なものです。 xt, Yt はサムネイルの横・縦ドット数です。サムネイルは RGB 表色系で、ドットごと に R, G, B の順に並びます。各値のサイズは 1 バイトです。サムネイルセグメントには、 xt x Yt x 3 バイトのサムネイル画像が収められます。サムネイルがないときは、 Xt' Yt はともに 0 になり、サムネイルセグメントは存在しません。 JFIF を拡張したフォーマットに JFXX ( JFIF 拡張 APPo マーカセグメント ) があります。 この様子を Fig. 2.30 と Table 2.12 に示します。このフォーマットは添付するサムネイルの 形式を JPEG 、 1 バイト / ドット RGB 、 3 バイト / ドット RGB の 3 種類に指定できるように なっています。 サムネイルに JPEG を用いる場合は、 JFIF と JFXX セグメントを含まない通常の JPEG データを使用します。 レヾイト / ドット RGB を使用すると、サムネイル画像は 256 色になります。このとき、 使用する色は 1670 万色中の任意の 256 色を選び、 768 バイトのパレットデータで指定しま す。パレットには RGB の順で組み合わせが指定されます。例えば、 Fig. 2.30 で、 Vn m が 0 だったら、カラーパレットの R() , G() , B() を使います。 3 バイト / ドット RGB を使用するときは JFIF のサムネイルと同じです。 2.92 2.9 JFIF と間引き
JPEG における デジタル静止画像圧縮 本章では、 JPEG そのものの説明を行います。 2.1 節では、画像処理に精通されていない方のために、カラー画像の扱い方を 簡単に説明します。理解されている方は読み飛ばしてもかまいません。 2.2 節では、 JPEG とはどんなものかというイメージを作ってみましよう。 2.3 節では、 JPEG の種類を紹介します。 JPEG は複数の方式の組で、一般に利 用されているのはその一部の機能とフォーマットだけです。 2.4 節では、最もよく利用されている基本 DCT 方式の原理を説明します。本書 は、基本 DCT 方式についてのみ詳しく説明します。 2.5 節では、 JPEG に採用されている画像伝送技術を説明します。この技術はコ ンピュータにおける画像処理よりは、テレビ放送などの技術に近いものです。 の技術の概念はさほど難しくありませんが、実現には手間がかかります。しつか りと理解しておかないと、実際にプログラムを作成することができません。 2.6 節では、基本 DCT 方式で利用する JPEG データのフォーマットを詳説しま す。プログラムの作成には欠かせないものです。 2.7 節、 2.8 節では、それぞれ符号化と復号の処理の流れを説明します。これは、 そのままプログラムのアルゴリズムの概要になります。 2.9 節では、 JPEG とは異なった JFIF という規則について説明します。これは JPEG の利用方法を定めた規則です。インターネットなどで見かける JPEG デー タはすべて JFIF に従っていると考えてよいでしよう。 最後に、 2.10 節では、 JPEG アプリケーションを C + + で実現する利点について 説明します。他の言語で実現する場合にも参考になるでしよう。
フレームヘッダを解析し、画像サイズなどを mpr 。 per し y に設定します。成分の解析結 果は mFComp[] に格納します。 ・スキャンヘッダ解析 void Ana1ysisScan( void ) : スキャンヘッダを解析し、結果を mSHeader と mscomp[] に格納します。 ・ JFIF フォーマット解析 void Ana1ysisJF 工 F( void ) 冫 APP() セグメントを解析し、 JFXX に関する属性を mpr 。 per に y に設定します。 VOid Ana1ysisJFXX( void ) : ・ J FXX フォーマット解析 APP() セグメントを解析し、 JFIF に関する属性を mpr 叩 er し y に設定します。 ・ RGB 算出用値補正 u char ReviseVa1ue ( double v 房 / / 返値 : 補正値 RGB 算出値の小数点以下切り捨て、最大値補正、最小値補正を行います。 復号処理でエラーが発生したときに呼び出されるメソッドです。確保済みの RGB デー VOid De1eteRGB( void ) : ・エラー時の RGB データ廃棄 タ領域があれば、それを廃棄します。 ・ int サイズの領域確保 VOid New 工 ntMemory ( 土 n む☆ * 土 n し 土 n 亡 char V ′ *mes ) ー ポインタ / / サイズ / / 初期値 工ラーメッセージ 作業用メモリの確保と初期化、それに伴うエラー処理を行います。 82 第 3 章仕様と論理設計
6.4 6 6.6 67 付録 A. 1 A. 3 4 索引 6.3.2> 量子化テーブル・・ 6.3.3> ハフマン符号の作成・ プラットフォームの特定 マルチタスキングのために リアルタイム表示 6.6.1 Windows の場合 6.6.2> Macintosh の場合 プログレッシブ 6.7.1 仕組み 6.7.2> フォーマット・・ 6.7.3> ハフマン符号・・ 量子化テーブル ハフマン符号表 参考文献 付録 CD-ROM について ・・・ 216 ・・・ 218 ・・・ 219 ・・・ 220 ・・・ 220 ・・・ 221 ・・・ 221 ・・・ 222 ・・・ 222 ・・・ 225 ・・・ 225 227 ・・・ 228 ・・・ 228 ・・・ 258 ・・・ 259 241