目次 | 前の項目 | 次の項目 | Java 2D API |
ColorModel は、イメージ内のピクセルデータを解釈するのに使われます。ピクセルデータの解釈には、イメージの各バンドの成分を特定のカラー領域の成分にマッピングする作業が含まれます。また、パックされたピクセルデータからのピクセル成分の抽出、マスクを使った 1 つのバンドからの複数の成分の取り出し、ルックアップテーブルを介したピクセルデータの変換もこの処理に含まれることがあります。イメージ内の特定のピクセルのカラー値を決定するには、各ピクセルにカラー情報がどのようにカプセル化されているかを知る必要があります。イメージに関連付けられた ColorModel は、ピクセル値をカラー成分に、またカラー成分からピクセル値に変換するのに必要なデータとメソッドをカプセル化します。
Java 2D API は、JDK 1.1 ソフトウェアリリースで定義されている DirectColorModel と IndexColorModel に加え、次の 2 つのカラーモデルを提供します。
- ComponentColorModel は、任意の ColorSpace とカラー成分の配列を処理し、ColorSpace に一致するようにします。このモデルを使うと、ほとんどの種類の GraphicsDevices 上で大半のカラーモデルを表すことができます。
- PackedColorModel は、カラー成分が int ピクセルのビットに直接埋め込まれたピクセル値を表すモデルの基底クラスです。PackedColorModel は、カラー成分とアルファ成分をチャネルからどのように抽出するかを記述したパック情報を格納します。JDK 1.1 ソフトウェアの DirectColorModel は、PackedColorModel です。
ColorSpace オブジェクトは、主に 3 つの独立した数値を使って色を寸法決定するためのシステムを表します。たとえば、RGB と CMYK はカラー領域です。ColorSpace オブジェクトは、Color オブジェクトのカラー領域を特定したり、ColorModel オブジェクトを介して Image、BufferedImage、または GraphicsConfiguration のカラー領域を特定したりするためのカラー領域タグとして機能します。ColorSpace は、特定のカラー領域の Color を 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 は、抽象 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) 座標空間への変換に似ています。どちらの場合も、変換を使って「標準」空間での座標を指定し、次にこの座標をデバイスに固有の空間にマッピングして出力します。