目次 | 前の項目 | 次の項目 | JavaTM 2D API プログラマーズガイド |
カラーイメージングはすべてのグラフィックスシステムの基本要素の 1 つで、しばしばイメージングモデルを複雑にする原因になっています。Java 2D™ API は、使いやすい高品質のカラー出力をサポートし、洗練された色使いを可能にします。
Java 2D API の主なカラー管理クラスには、ColorSpace
、Color
、および ColorModel
があります。
ColorSpace
は、主に 3 つの独立した数値 (成分) を使った色を評価するためのシステムを表します。ColorSpace
クラスには、カラー領域と、2 つの標準カラー領域である CIEXYZ
および RGB との間の変換を行うためのメソッドが含まれています。Color
は、特定の ColorSpace
内で成分によって定義されている固定カラーです。赤などの色で Shape
を描画するには、目的の色を表す Color
オブジェクトを Graphics2D
コンテキストに渡します。Color
は java.awt
パッケージで定義されています。 ColorModel
は、ピクセル値を色にマッピングする方法を記述します。ColorModel
は、通常、Image
または BufferedImage
と関連付けられ、ピクセル値を正しく解釈するのに必要な情報を提供します。ColorModel
は java.awt.image
パッケージで定義されています。
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
です。
toRGB
は、表現されたカラー領域の Color
を sRGB
の Color
に変換する fromRGB
は、sRGB
の Color
を受け取って、表現されたカラー領域に変換する
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
は、実際には abstract クラスです。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) 座標領域への変換に似ています。どちらの場合も、変換を使って「標準」領域での座標を指定し、次にこの座標をデバイスに固有の領域にマッピングして出力します。
目次 | 前の項目 | 次の項目 |
JavaTM 2D API プログラマーズガイド JavaTM 2 SDK, Standard Edition, 1.4 Version |
Copyright © 2003 Sun Microsystems, Inc. All rights reserved.