目次 | 前へ | 次へ |
カラーイメージングはすべてのグラフィックスシステムの基本要素の 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 は、JDK 1.1 ソフトウェアリリースで定義されている DirectColorModel
と IndexColorModel
に加え、次の 2 つのカラーモデルを提供します。
ComponentColorModel
は、任意の ColorSpace
と色成分の配列を処理し、その ColorSpace
に適合させることができます。このモデルを使うと、ほとんどの種類の GraphicsDevices
上で大半のカラーモデルを表すことができます。PackedColorModel
は、色成分が整数型ピクセルのビットに直接埋め込まれたピクセル値を表すモデルの基底クラスです。PackedColorModel
は、色成分とアルファ成分をチャネルからどのように抽出するかを記述したパック情報を格納します。JDK 1.1 ソフトウェアリリースの 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) 座標空間への変換に似ています。どちらの場合も、変換を使って「標準」空間での座標を指定し、次にこの座標をデバイスに固有の空間にマッピングして出力します。
目次 | 前へ | 次へ |