目次 | 前へ | 次へ

第 6 章

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

Java 2D API の主なカラー管理クラスには、ColorSpace、ColorColorModel があります。

  • ColorSpace は、主に 3 つの独立した数値 (成分) を使った色を評価するためのシステムを表します。ColorSpace クラスには、色空間と、2 つの標準色空間である CIEXYZ および RGB との間の変換を行うためのメソッドが含まれています。
  • Color は、特定の ColorSpace 内で成分によって定義されている固定カラーです。赤などの色で Shape を描画するには、目的の色を表す Color オブジェクトを Graphics2D コンテキストに渡します。Colorjava.awt package で定義されています。
  • ColorModel は、ピクセル値を色にマッピングする特定の方法を記述します。ColorModel は、通常、Image または BufferedImage と関連付けられ、ピクセル値を正しく解釈するのに必要な情報を提供します。ColorModeljava.awt.image package で定義されています。

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 は、ピクセル値とそれを構成する色成分との間で相互に変換するのに必要なデータとメソッドをカプセル化します。

6.2.0 色

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

  • ComponentColorModel は、任意の ColorSpace と色成分の配列を処理し、その ColorSpace に適合させることができます。このモデルを使うと、ほとんどの種類の GraphicsDevices 上で大半のカラーモデルを表すことができます。
  • PackedColorModel は、色成分が整数型ピクセルのビットに直接埋め込まれたピクセル値を表すモデルの基底クラスです。PackedColorModel は、色成分とアルファ成分をチャネルからどのように抽出するかを記述したパック情報を格納します。JDK 1.1 ソフトウェアリリースの DirectColorModel は、PackedColorModel です。

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 です。

  • toRGB は、表現された色空間の ColorsRGBColor に変換する。
  • fromRGB は、sRGBColor を受け取って、表現された色空間に変換する。

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 は、実際には抽象クラスです。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 © 1993, 2013, Oracle and/or its affiliates. All rights reserved.