| 目次|前|次 |
カラー・イメージングはすべてのグラフィックス・システムの基本要素の1つで、しばしばイメージング・モデルを非常に複雑にする原因になっています。 Java 2D APIは、使いやすい高品質のカラー出力をサポートし、洗練された色使いを可能にします。
Java 2D APIの主なカラー管理クラスには、ColorSpace、Color、ColorModelがあります。
ColorSpaceは、主に3つの独立した数値(成分)を使った色を評価するためのシステムを表します。 ColorSpaceクラスには、色空間と、2つの標準色空間であるCIEXYZおよびRGBとの間の変換を行うためのメソッドが含まれています。 Colorは、特定のColorSpace内で成分によって定義されている固定カラーです。 赤などの色でShapeを描画するには、目的の色を表すColorオブジェクトをGraphics2Dコンテキストに渡します。 Colorはjava.awt packageで定義されています。 ColorModelは、ピクセル値を色にマッピングする特定の方法を記述します。 ColorModelは、通常、ImageまたはBufferedImageと関連付けられ、ピクセル値を正しく解釈するのに必要な情報を提供します。 ColorModelはjava.awt.image packageで定義されています。 ColorModelは、イメージ内のピクセル・データを解釈するのに使われます。 ピクセル・データの解釈には、イメージの各バンドの成分を特定の色空間の成分にマッピングする作業が含まれます。 また、パックされたピクセル・データからのピクセル成分の抽出、マスクを使った1つのバンドからの複数の成分の取出し、ルックアップ表を介したピクセル・データの変換もこの処理に含まれることがあります。
イメージ内の特定のピクセルのカラー値を決定するには、各ピクセルにカラー情報がどのようにエンコードされているかを知る必要があります。 イメージに関連付けられたColorModelは、ピクセル値とそれを構成する色成分との間で相互に変換するのに必要なデータとメソッドをカプセル化します。
Java 2D APIは、DirectColorModelとIndexColorModelに加え、次の2つのカラー・モデルを提供します。
ComponentColorModelは、任意のColorSpaceと色成分の配列を処理し、そのColorSpaceに適合させることができます。 このモデルを使うと、ほとんどの種類のGraphicsDevices上で大半のカラー・モデルを表すことができます。 PackedColorModelは、色成分が整数型ピクセルのビットに直接埋め込まれたピクセル値を表すモデルの基底クラスです。 PackedColorModelは、色成分とアルファ成分をチャネルからどのように抽出するかを記述したパック情報を格納します。DirectColorModelはPackedColorModelです。 ColorSpaceオブジェクトは、主に3つの独立した数値を使った色を評価するためのシステムを表します。 たとえば、RGBとCMYKは色空間です。 ColorSpaceオブジェクトは、Colorオブジェクトの色空間を特定したり、ColorModelオブジェクトを介してImage、BufferedImage、またはGraphicsConfigurationの色空間を特定したりするための色空間タグとして機能します。 ColorSpaceは、特定の色空間のColorsをsRGBとの間で、また明確に定義されたCIEXYZ色空間との間で変換するためのメソッドを提供します。
すべてのColorSpaceオブジェクトは、そのオブジェクトが表す色空間の色をsRGBにマッピングするとともに、sRGBカラーを、そのオブジェクトが表す色空間に変換できなければなりません。 どのColorにも、明示的にまたはデフォルトで設定されたColorSpaceオブジェクトがあるので、どのようなColorもsRGBに変換できます。 各GraphicsConfigurationはColorSpaceオブジェクトに関連付けられており、このColorSpaceオブジェクトには、対応するColorSpaceがあります。 色空間で指定された色は、sRGBを介して中間色空間としてマッピングすることで、任意のデバイスで表示できます。
この処理に使われるメソッドは、toRGBとfromRGBです。
sRGBを介したマッピングは常に機能しますが、必ずしも最良の解決策ではありません。 その1つの理由は、sRGBでは、CIEXYZの全色域に渡ってすべての色を表現できるわけではないことです。 sRGBとは異なる色域(表現可能な色のスペクトル)の色空間で色が指定されている場合、中間領域としてsRGBを使うと情報が失われます。 この問題に対処するため、ColorSpaceクラスは、もう1つの色空間である「変換領域」CIEXYZとの間で色をマッピングできるようになっています。
toCIEXYZメソッドとfromCIEXYZメソッドは、表現された色空間から変換領域にカラー値をマッピングします。 これらのメソッドは、任意の2つの色空間で、一度に1つのColorを十分に高い精度で変換できます。 ただし、Java 2D APIの実装では、ベースとなるプラットフォームのカラー管理システムを利用してイメージ全体を対象に処理を行う、パフォーマンスに優れた変換がサポートされる予定です。 「イメージング」のColorConvertOpを参照してください。
図6-1と図6-2は、RGBカラー・モニター上で表示するために、CMYK色空間で指定された色を変換する処理を示しています。 図6-1は、sRGBを介したマッピングを示しています。 図が示すように、CMYKカラーからRGBカラーへの変換は、色域が一致しないために不正確になっています。1

図6-2は、変換空間としてCIEXYZを使った場合の同じ処理を示しています。 CIEXYZが使われている場合は、色は正確に渡されます。

ColorSpaceは、実際には抽象クラスです。 Java 2D APIは、その1つの実装であるICC_ColorSpaceを提供しています。ICC_ColorSpaceは、ICC_Profileクラスによって表されるようなICCプロファイル・データに基づいています。 すでに説明した2つのメソッドを実装すれば、独自のサブクラスを定義して任意の色空間を表すことができます。 ただし、ほとんどの場合は、デフォルトのsRGBのColorSpace、あるいは、モニターやプリンタ用の一般に入手可能なICCプロファイル、またはイメージ・データに埋め込まれたプロファイルによって表現された色空間を使用できます。
「ColorSpace」では、ColorSpaceオブジェクトが色空間をどのように表現しているかおよび表現された空間の色を変換領域との間でどのようにマッピングできるかについて説明しています。 色空間間のマッピングの処理では、しばしばカラー管理システムが使われます。 典型的なカラー管理システム(CMS)では、ColorSpaceオブジェクトに似たICCプロファイルを管理します。ICCプロファイルでは、入力空間と接続空間について記述されており、これらの空間の間でのマッピングの方法が定義されています。 カラー管理システムは、あるプロファイルのタグが付いた色を他のプロファイルの色空間にどのようにマッピングすればよいかを理解するうえで、大いに役立ちます。
Java 2D APIでは、ICC_Profileと呼ばれるクラスが定義されており、このクラスが任意のICCプロファイルのデータを保持します。 ICC_ColorSpaceは、abstract ColorSpaceクラスの実装です。 ICC_ColorSpaceオブジェクトは、ICC_Profilesから構築できます。 ただし、すべてのICCプロファイルがICC_ColorSpaceの定義に適しているわけではないことなど、いくつかの制限があります。
ICC_Profileには、ICC_ProfileRGB、ICC_ProfileGrayなど、特定の色空間タイプに対応するいくつかのサブクラスがあります。 ICC_Profileの各サブクラスは、明確に定義された入力空間(RGB空間など)と明確に定義された(CIEXYZのような)接続空間を持っています。 Java 2D APIでは、プラットフォームのCMSを使って、スキャナ、プリンタ、モニターなどのさまざまなデバイスのカラー・プロファイルにアクセスできます。 また、プラットフォームのCMSを使って、プロファイル間での最適なマッピングを見つけることもできます。
Colorクラスは、特定の色空間の色を記述します。 Colorのインスタンスには、色成分の値とColorSpaceオブジェクトが含まれています。 Colorの新しいインスタンスを生成するときは、色成分に加えてColorSpaceオブジェクトを指定できるので、Colorクラスは任意の色空間の色を処理できます。
Colorクラスには、現在提案されているsRGBと呼ばれる標準RGB色空間をサポートするいくつかのメソッドがあります(http://www.w3.org/pub/WWW/Graphics/Color/sRGB.htmlを参照)。sRGBは、Java 2D APIのデフォルト色空間です。 Colorクラスで定義されているいくつかのコンストラクタでは、ColorSpaceパラメータが省略されています。 これらのコンストラクタは、色のRGB値がsRGBで定義されているものと仮定し、ColorSpaceのデフォルト・インスタンスを使用して色空間を表します。
Java 2D APIでは、カラー変換のためのリファレンス色空間としてではなく、アプリケーション・プログラマの便宜を考えてsRGBを使用しています。 多くのアプリケーションは主にRGBイメージとモニターを対象としているので、標準RGB色空間を定義すれば、これらのアプリケーションをより簡単に作成できるようになります。 ColorSpaceクラスではtoRGBメソッドとfromRGBメソッドが定義されるので、開発者は標準空間の色を容易に取り出すことができます。 これらのメソッドは、高精度のカラー補正や変換で使用することを意図したものではありません。 詳細は、「ColorSpace」を参照してください。
sRGB以外の色空間で色を作成するにはColorのコンストラクタを使用します。Colorのコンストラクタは、ColorSpaceオブジェクトと、この色空間に適した色成分を表すfloatの配列を引数に取ります。 ColorSpaceオブジェクトは色空間を特定します。
プロセス・カラーのシアンのようなある特定の色で矩形を表示するには、システムに対してこの色を記述する方法が必要です。 色を記述するには、様々な方法があります。たとえば、赤、緑、青(RGB)の成分の組合せによって色を記述したり、シアン、マゼンタ、黄色、黒(CMYK)の成分の組合せによって色を記述したりできます。 このような色を指定するための様々な手法は、「色空間」と呼ばれます。
よく知られているように、コンピュータの画面上の色は、赤、緑、青の光を分量を変えて混合することで生成されます。 したがって、RGB色空間の使用は、コンピュータ・モニター上でのイメージングでは標準です。 同様に、4色印刷法では、シアン、マゼンタ、黄色、黒のインクを使用して印刷ページ上に色を作成します。この場合、印刷する色は、CMYK色空間のパーセンテージとして指定されています。
RGB色空間とCMYK色空間は、コンピュータ・モニターとカラー印刷の普及により、どちらも色を記述するのに広く使われています。 ただし、どちらのタイプの色空間にも、デバイスに依存するという基本的な欠点があります。 あるプリンタで使われるシアン・インクは、ほかのプリンタで使われるシアン・インクと厳密に一致しないことがあります。 同様に、RGBカラーとして記述された色が、あるモニターでは青に見え、別のモニターでは紫がかって見えることもあります。
Java 2D APIでは、RGBとCMYKのことを色空間タイプと呼びます。 特定の蛍光管を持つ特定モデルのモニターでは、そのモニター独自のRGB色空間が定義されています。 同様に、特定モデルのプリンタには、そのプリンタ独自のCMYK色空間があります。 異なるRGB色空間やCMYK色空間は、デバイスに依存しない色空間を介して互いに関連付けることができます。
デバイスに依存しないカラー指定の標準は、International Commission on Illumination (CIE)によって定義されています。 このうち、もっともよく使われておりデバイスに依存しない色空間は、CIEによって開発された3成分XYZ色空間です。 CIEXYZを使って色を指定した場合は、デバイスには依存しなくなります。
ただし、CIEXYZ色空間での色の記述は、必ずしも実際的でないことがあります。他の色空間で色を表した方が、適切な場合もあります。 特定のRGB空間など、デバイスに依存する色空間を使用して色を表す場合に、一貫性のある結果が得られるようにするには、そのRGB空間が、CIEXYZのようなデバイスに依存しない空間とどのような関係にあるかを示す必要があります。
色空間の間でのマッピングを行う1つの方法として、デバイスに依存する空間がデバイスに依存しない空間とどのような関係にあるかを示す情報を、どちらの空間にも添付する方法があります。 この追加情報は、「プロファイル」と呼ばれます。 カラー・プロファイルのタイプのうち、一般に使われているものとして、International Color Consortiumが定義したICCカラー・プロファイルがあります。 詳細は、http://www.color.orgから入手可能な『ICC Profile Format Specification, version 3.4』を参照してください。
図6-3は、ソリッド・カラーとスキャンしたイメージがJava 2D APIにどのように渡され、さまざまな出力デバイスでどのように表示されるかを示しています。 図6-3からわかるように、入力カラーとイメージの両方にプロファイルが添付されています。

APIは、正確に指定された色を取得すると、指定された色をモニターやプリンタなどの出力デバイス上に再現しなければなりません。 これらのデバイスにはそれぞれ独自のイメージング特性があるので、適切な結果を得るには、このイメージング特性を考慮しなければなりません。 このため、各出力デバイスにはプロファイルを関連付け、正確な結果を得るには色をどのような方法で変換する必要があるかを記述します。
一貫性のある正確な色を出力するには、標準色空間を基準として入力カラーと出力デバイスの両方のプロファイルを設定する必要があります。 たとえば、入力カラーを、元の色空間からデバイスに依存しない標準の色空間にマッピングし、次に標準の色空間から出力デバイスの色空間にマッピングします。 色の変換は、多くの点で、グラフィカル・オブジェクトの(x, y)座標空間への変換に似ています。 どちらの場合も、変換を使って「標準」空間での座標を指定し、次にこの座標をデバイスに固有の空間にマッピングして出力します。
| 目次|前|次 |