目次 | 前の項目 | 次の項目 JavaTM 2D API プログラマーズガイド

第 6 章

カラー

カラーイメージングはすべてのグラフィックスシステムの基本要素の 1 つで、しばしばイメージングモデルを複雑にする原因になっています。Java 2D™ API は、使いやすい高品質のカラー出力をサポートし、洗練された色使いを可能にします。

Java 2D API の主なカラー管理クラスには、ColorSpaceColor、および ColorModel があります。

6.1 クラス

クラス
説明
ColorSpace
Color オブジェクト、ImageBufferedImage、または GraphicsDevice のカラー領域を特定します。RGB カラー領域と CIEXYZ カラー領域の変換を行うためのメソッドがあります。
ICC_ColorSpace
スーパークラス: ColorSpace
ICC プロファイル形式仕様に基づく、デバイスに依存しないカラー領域とデバイスに依存するカラー領域を表します。
ICC_Profile
ICC プロファイル形式仕様に基づく、デバイスに依存しないカラー領域とデバイスに依存するカラー領域のカラープロファイルデータを表します。
ICC_ProfileGray
スーパークラス: ICC_Profile
カラー領域タイプグレーを表します。
ICC_ProfileRGB
スーパークラス: ICC_Profile
カラー領域タイプ RGB を表します。

6.2 色のコンセプト

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

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

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

6.2.0.1 ColorSpace

ColorSpace オブジェクトは、主に 3 つの独立した数値を使った色を評価するためのシステムを表します。たとえば、RGB と CMYK はカラー領域です。ColorSpace オブジェクトは、Color オブジェクトのカラー領域を特定したり、ColorModel オブジェクトを介して ImageBufferedImage、または GraphicsConfiguration のカラー領域を特定したりするためのカラー領域タグとして機能します。ColorSpace は、特定のカラー領域の ColorsRGB との間で、また明確に定義された 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これらの図で使われている色は、わかりやすさを優先させているため、正確ではありません。つまり、適切な変換領域が使用されない限り、色はカラー領域間で正確にマッピングされません。

 


目次 | 前の項目 | 次の項目 JavaTM 2D API プログラマーズガイド
JavaTM 2 SDK, Standard Edition, 1.4 Version