目次|前|次 |
カラー・イメージングはすべてのグラフィックス・システムの基本要素の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)座標空間への変換に似ています。 どちらの場合も、変換を使って「標準」空間での座標を指定し、次にこの座標をデバイスに固有の空間にマッピングして出力します。
目次|前|次 |