18-3:カラーモデルの取り扱い

カラーモデルは色の資源の取り扱いの方針を定めます。 一般にマシンやシステムが異なれば、 採用しているカラーモデルも異なる可能性があります。 Javaではこの違いをどのようにして克服しているのでしょうか?


・ java.awt.imageパッケージにはカラーモデルを表す ColorModelクラスが 提供されています。 このクラスは抽象クラスで、 実際にオブジェクトを生成して利用されるのは次の3個のサブクラスのうちの いずれかになります。 (DirectColorModel は ColorModel の直接のサブクラスではなく、 中間に PackedColorModelという抽象クラスが存在します。 DirectColorModelの性質のいくつかは、このクラスの中に定義されています。)

ColorModelのサブクラス
クラス名用途
DirectColorModelピクセル値を直接RGBデータで指定
IndexColorModelピクセル値をカラーマップのインデックスで指定
ComponentColorModelピクセル値を色空間の中から得る

通常のウィンドウシステムでは、 DirectColorModel か IndexColorModel のいずれかに対応する方式が採用されています。 24ビットのフルカラー表示や 256色のモノクロ表示のディスプレイでは、 多くの場合 DirectColorModel に相当し、 ピクセル値は RGBデータを直接含んでいます。 これに対して標準的な 256色ディスプレイの場合は、 画面の色資源がカラーマップとして管理されているのが普通で、 ピクセル値はそのインデックスとして間接的に参照されます。
ただし Javaのプログラム内でのカラーマップは、 ウィンドウシステムの方針に常に合わせる必要はありません。 256色ディスプレイで、現実の色資源の管理がカラーマップを通じて行われている 場合でも、DirectColorModelによってより多くの色資源を指定することが可能です。 その場合には、 ディザリングなどの処理によって擬似的にフルカラー表示を実現しますが、 それらの機能は仮想マシンに含まれていて、 プログラマーが独自に準備する必要はありません。 IndexColorModelを用いる場合でも、そのカラーマップの内容やサイズは プログラマが自由に決めることができ、システムの側の制約には縛られません。
このような考え方を押し進めていくと、 実は Javaのプログラム内のカラーモデルを 現実のシステムに合わせる必然性もないことになります。 ComponentColorModelは JDK1.2 から登場した新しいクラスです。 色資源の取り扱いはより抽象化された自然な手段を用います。 色空間を表す ColorSpace のオブジェクトの中から、 必要な Colorの配列を取り出して使用します。 色の指定については DirectColorModel のように直接行える一方、 IndexColorModelのような取り扱いも可能です。