目次 | 前の項目 | 次の項目 Java 2D API


6.2 色のコンセプト

ColorModel は、イメージ内のピクセルデータを解釈するのに使われます。 ピクセルデータの解釈には、イメージの各バンドの成分を特定の色空間の成分にマッピングする作業が含まれます。 また、パックドピクセルデータからのピクセル成分の抽出、マスクを使った 1 つのバンドからの複数の成分の取り出し、ルックアップテーブルを介したピクセルデータの変換もこの処理に含まれる場合があります。

イメージ内の特定のピクセルのカラー値を決定するには、各ピクセルにカラー情報がどのようにカプセル化されているかを知る必要があります。 イメージに関連した ColorModel は、ピクセル値をカラー成分に、またカラー成分からピクセル値に変換するのに必要なデータとメソッドをカプセル化します。

Java 2DTM API は、JDK 1.1 ソフトウェアリリースで定義されている DirectColorModelIndexColorModel に加え、次の 2 つのカラーモデルを提供します。


6.2.0.1 ColorSpace

ColorSpace オブジェクトは、主に 3 つの独立した数値を使った色を評価するためのシステムを表します。 たとえば、RGB と CMYK は色空間です。 ColorSpace オブジェクトは、Color オブジェクトの色空間を特定したり、ColorModel オブジェクトを介して ImageBufferedImage、または GraphicsConfiguration の色空間を特定したりするための色空間タグとして機能します。 ColorSpace は、特定の色空間の ColorssRGB との間で、また明確に定義された CIEXYZ 色空間との間で変換するためのメソッドを提供します。

すべての ColorSpace オブジェクトは、そのオブジェクトが表す色空間の色を sRGB にマッピングするとともに、sRGB カラーを、そのオブジェクトが表す色空間に変換できなければなりません。 どの Color にも、明示的にまたはデフォルトで設定された ColorSpace オブジェクトがあるため、どのような ColorsRGB に変換できます。 各 GraphicsConfigurationColorSpace オブジェクトに関連付けられており、この ColorSpace オブジェクトには、対応する ColorSpace があります。 色空間で指定された色は、sRGB を介して中間色空間としてマッピングすることで、任意のデバイスで表示できます。

この処理に使われるメソッドは、toRGBfromRGB です。

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-1 sRGB を介したマッピング

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

図 6-2 CIEXYZ を介したマッピング


6.2.0.2 ICC_Profile と ICC_ColorSpace

ColorSpace は、実際には abstract クラスです。 Java 2D API は、その 1 つの実装である ICC_ColorSpace を提供しています。 ICC_ColorSpace は、ICC_Profile クラスによって表されるような ICC プロファイルデータに基づいています。 説明した 2 つのメソッドを実装すれば、独自のサブクラスを定義して任意の色空間を表すことができます。 ただし、ほとんどの場合は、デフォルトの sRGBColorSpace、あるいは、モニターやプリンタ用の一般に入手可能な 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_ProfileRGBICC_ProfileGray など、特定の色空間タイプに対応するいくつかのサブクラスがあります。 ICC_Profile の各サブクラスは、明確に定義された入力空間 (RGB 空間など) と明確に定義された接続空間 (CIEXYZ など) を持っています。 Java 2D API では、プラットフォームの CMS を使って、スキャナ、プリンタ、モニターなどのさまざまなカラープロファイルにアクセスできます。 また、プラットフォームの CMS を使って、プロファイル間での最適なマッピングを見つけることもできます。


6.2.1 色の記述

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 カラーとして記述された色が、あるモニターでは青に見え、別のモニターでは紫がかって見えることもあります。


6.2.2 sRGB および CIEXYZ を介した色のマッピング

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 からわかるように、入力カラーとイメージの両方にプロファイルが添付されています。

図 6-3 色空間間をマッピングするプロファイルの利用


6.2.2.1 カラーマッチング

API は、正確に指定された色を取得すると、指定された色をモニターやプリンタなどの出力デバイス上に再現しなければなりません。 これらのデバイスにはそれぞれ独自のイメージング特性があるので、適切な結果を得るには、このイメージング特性を考慮しなければなりません。 このため、各出力デバイスにはプロファイルを関連付け、正確な結果を得るには色をどのような方法で変換する必要があるかを記述します。

一貫性のある正確な色を出力するには、標準色空間を基準として入力カラーと出力デバイスの両方のプロファイルを設定する必要があります。 たとえば、入力カラーを、元の色空間からデバイスに依存しない標準の色空間にマッピングし、次に標準の色空間から出力デバイスの色空間にマッピングします。 色の変換は、多くの点で、グラフィカルオブジェクトの (x, y) 座標空間への変換に似ています。 どちらの場合も、変換を使って「標準」空間での座標を指定し、次にこの座標をデバイスに固有の空間にマッピングして出力します。

1. これらの図で使われている色は、わかりやすさを優先させているため、正確ではありません。 つまり、適切な変換空間が使用されない限り、色は色空間間で正確にマッピングされません。


目次 | 前の項目 | 次の項目
Copyright © 1997-2001 Sun Microsystems, Inc. All Rights Reserved.