目次||

第1章

Java 2D APIの概要

Java 2D APIでは、Abstract Windowing Toolkit (AWT)のグラフィックス、テキストおよびイメージングの機能が強化されて、充実したユーザー・インタフェースと新しいタイプのJavaアプリケーションを開発できるようになっています。

グラフィックス、フォント、およびイメージに関する豊富なAPIに加えて、Java 2D APIでは、拡張された色の定義と合成、任意の幾何学図形とテキストのヒット検出、およびプリンタと表示装置のための統一されたレンダリング・モデルがサポートされています。

Java 2D APIでは、CAD-CAMライブラリ、グラフィックス、イメージングの特殊効果ライブラリなどの高度なグラフィックス・ライブラリだけでなく、イメージ・ファイルやグラフィック・ファイルの入出力フィルタも作成できます。

Java Media FrameworkおよびほかのJava Media APIとともにJava 2D APIを使うと、アニメーションやほかのマルチメディア表現を作成したり表示したりできます。Java AnimationおよびJava Media FrameworkのAPIは、Java 2D APIを使ってレンダリングをサポートします。

1.1 グラフィックス、テキスト、およびイメージングの拡張

以前のバージョンのAWTでは、通常のHTMLページのレンダリングに適した簡単なレンダリング・パッケージが提供されましたが、複雑なグラフィックス、テキスト、またはイメージングのレンダリングには機能が不足していました。このため、以前のAWTでは、汎用的なレンダリングのコンセプトのうち、特定の場合のみが簡単なレンダリング・パッケージとして具体化されていました。Java 2D APIでは、AWTを拡張して、より柔軟で機能が充実したレンダリング・パッケージが提供されるため、より汎用的なグラフィックスおよびレンダリング操作を行うことができるようになりました。

たとえば、Graphicsクラスを使用すると、矩形、楕円、および多角形を描画できます。Graphics2Dでは、実質上あらゆる幾何学図形をレンダリングできるメカニズムが提供されているため、幾何学的レンダリングのコンセプトが拡張されています。同様に、Java 2D APIでは、任意の幅の形状付き線を描画し、実質上あらゆるテクスチャで幾何学図形を塗りつぶすことができます。

幾何学的な形状は、Rectangle2DおよびEllipse2DなどのShapeインタフェースの実装から提供されます。たとえば、曲線および弧もShapeの特定の実装です。

塗りつぶしおよびペン・スタイルは、BasicStrokeGradientPaintTexturePaintColorなどの、PaintおよびStrokeインタフェースの実装から提供されます。

AffineTransformには、スケーリング、平行移動、回転、変形など、2D座標の線形変換を定義します。

クリッピング領域は、Rectangle2DGeneralPathなどの汎用クリッピング領域の定義に使用されるShapeインタフェースの実装によって定義されます。

色の合成は、AlphaCompositeなどのCompositeインタフェースの実装によって提供されます。

Fontは、各Shapesによって定義されるGlyphsのコレクションによって定義されます。

1.2 レンダリング・モデル

基本的なグラフィックス・レンダリング・モデルについては、Java 2D APIの追加に伴う変更はありません。グラフィックをレンダリングするには、グラフィックス・コンテキストを設定し、Graphicsオブジェクトのレンダリング・メソッドを呼び出します。

Java 2D APIのGraphics2Dクラスは、Graphicsを継承することで、多くのグラフィックス属性をサポートし、新しいレンダリング・メソッドを提供します。Graphics2Dコンテキストの設定については「Graphics2Dを使ったレンダリング」を参照してください。

Java 2D APIは、レンダリング装置の違いを自動的に補正し、異なるタイプの装置の間で統一されたレンダリング・モデルを提供します。レンダリング先の装置がディスプレイでもプリンタでも、アプリケーション・レベルでのレンダリング・プロセスは同じです。

Java 2D APIはマルチスクリーン環境をサポートします。詳細については、セクション1.2.1の「座標系」と「マルチスクリーン環境でのレンダリング」を参照してください。

1.2.1 座標系

Java 2D APIでは、2種類の座標系が使われています。

Java 2Dシステムは、ユーザー空間と使用するレンダリング装置のデバイス空間との間で必要な変換を、自動的に行います。モニターの座標系はプリンタの座標系と大きく異なりますが、アプリケーションからこの違いが見えることはありません。

1.2.1.1 ユーザー空間

図1-1に示すように、ユーザー空間の原点は領域の左上隅にあり、x座標の値は左から右に、y座標は上から下に、それぞれ大きくなります。

前の文で、グラフィックスを説明しています。

図1-1 ユーザー空間の座標系

ユーザー空間は、使用可能なすべての装置の座標系を統一する抽象表現です。特定の装置のデバイス空間の原点と向きは、ユーザー空間と同じ場合も異なる場合もあります。どちらの場合も、グラフィック・オブジェクトがレンダリングされるときに、ユーザー空間の座標は適切なデバイス空間に自動的に変換されます。多くの場合、この変換は、基になっているプラットフォームのデバイス・ドライバを使って行われます。

1.2.1.2 デバイス空間

Java 2D APIでは、ユーザー空間からデバイス空間への変換をサポートするために維持される、3つのレベルの構成情報が定義されています。この情報は、3つのクラスにカプセル化されています。

GraphicsEnvironmentGraphicsDeviceGraphicsConfigurationの3つのクラスを使って、Javaプラットフォーム上でのレンダリング装置とフォントの特定と、ユーザー空間からデバイス空間への座標変換に必要な情報がすべて表されます。アプリケーションはこの情報にアクセスできますが、ユーザー空間とデバイス空間の間の変換を行う必要はありません。

GraphicsEnvironmentでは、特定のプラットフォームのJavaアプリケーションが認識できるレンダリング装置の集合が記述されています。レンダリング装置としては、画面、プリンタ、イメージ・バッファなどがあります。GraphicsEnvironmentには、プラットフォームで利用可能なフォントの一覧も含まれています。

GraphicsDeviceでは、画面やプリンタなど、アプリケーションが認識できるレンダリング装置が記述されています。装置で使用可能な構成は、それぞれGraphicsConfigurationで表されます。たとえば、SVGAディスプレイ装置は、640x480x16色、640x480x256色、800x600x256色など、さまざまなモードで動作できます。SVGAディスプレイはGraphicsDeviceオブジェクトで表されて、個々のモードはGraphicsConfigurationオブジェクトで表されます。

1つのGraphicsEnvironmentには1つ以上のGraphicsDevicesを含めることができ、個々のGraphicsDeviceには1つ以上のGraphicsConfigurationsを含めることができます。

1.2.2 変換

Java 2D APIでは、統一された座標変換モデルが使われています。ユーザー空間からデバイス空間への変換を含むすべての座標変換は、AffineTransformオブジェクトで表されます。AffineTransformでは、座標操作の規則が行列で定義されています。

グラフィックス・コンテキストにAffineTransformを追加すれば、幾何学図形、テキスト、またはイメージをレンダリングするときに、回転、拡大縮小、平行移動、変形などを実行できます。追加した変換は、そのコンテキストでレンダリングされるすべてのグラフィック・オブジェクトに適用されます。変換は、ユーザー空間の座標がデバイス空間の座標に変換されるときに行われます。

1.2.3 フォント

文字列は、一般に、文字列を構成する文字という観点から考えられます。文字列を描画するとき、その体裁は、選択されているフォントで決まります。ただし、文字列を表示するためにフォントで使われている形状は、個々の文字と一致しない場合もあります。たとえば、出版業界などでは、2つ以上の文字の特定の組み合わせを、合字と呼ばれる単一の形状に置き換えることがよく行われます。

文字列の中の文字を表すためにフォントで使われる形状を、グリフと呼びます。フォントでは、鋭アクセントが付いた小文字のaのような文字を複数のグリフで表したり、finalのfiのような特定の文字の組み合わせを最終的に1つのグリフで表したりすることがあります。Java 2D APIの場合、グリフは単なるShapeで、ほかのShapeと同じように操作したりレンダリングしたりできます。

フォントはグリフの集合と考えることができます。1つのフォントには、heavy、medium、oblique、gothic、regularなど多くの派生形がある場合があります。このような異なる派生形を、フェースと呼びます。同じフォントから作られるフェースはすべて似た文字体裁のデザインになっており、同じファミリのメンバーと考えることができます。つまり、特定のスタイルを持つグリフの集合がフォント・フェースを形成し、フォント・フェースの集合がフォント・ファミリを形成し、フォント・ファミリの集合が特定のGraphicsEnvironmentで利用できるフォントのセットを形成しています。

Java 2D APIでは、Helvetica Boldのように特定のフォント・フェースを示す名前を使用してフォントを指定します。

Java 2D APIを使うと、ファミリ、フェース、サイズ、さらには言語まで異なる複数のフォントを含む文字列を、構成したりレンダリングしたりできます。テキストの体裁は、テキストのレイアウトとは論理的に切り離されて保持されます。フォントの体裁はFontオブジェクトを使って記述されて、レイアウトの情報はTextLayoutオブジェクトとTextAttributeSetオブジェクトに格納されます。フォントの情報とレイアウトの情報を別に持つことで、同じフォントを別のレイアウト構成で簡単に使えるようになります。

1.2.4 イメージ

イメージは、空間に組織的に配置されたピクセルの集合です。ピクセルは、1つの表示位置におけるイメージの体裁を定義しています。ピクセルの2次元配列をラスターと呼びます。

ピクセルの表現方法は、直接定義することも、イメージのカラー表に対するインデックスとして定義することもできます。

多くの(256色より多い)色を使うイメージの場合は、通常、スクリーンの個々の位置に対する色、アルファ、およびそのほかの表示特性を、ピクセルで直接表します。このようなイメージは、インデックスで色を指定したイメージよりかなり大きくなりますが、より実物に近い表現になります。

インデックス・カラー・イメージの場合、イメージの色は、カラー表で指定されている色だけに制限されます。その結果、イメージで使用できる色数が少なくなることがよくあります。ただし、一般に、色の値よりインデックスの方が必要な記憶領域が少なくて済むので、インデックス指定の色のセットとして格納されたイメージの方が小さくなります。このピクセル形式は、16色または256色だけで表現されたイメージによく使われています。

Java 2D APIのイメージには、2つの重要な要素があります。

ピクセルを解釈するときの規則は、ColorModelオブジェクトでカプセル化されています。たとえば、値を色として直接解釈するのか、それともインデックスで表された色として解釈するのか、などの情報です。ピクセルを表示するときは、ピクセルとカラー・モデルをあわせて扱う必要があります。

バンドは、イメージに対する色空間の1つの成分です。たとえば、赤、緑、青の各成分は、RGBイメージのバンドです。直接カラー・モデルのイメージで使われるピクセルは、スクリーン上の1地点に対するバンド値の集合として考えることができます。

java.awt.imageパッケージには、ColorModelの複数の実装が含まれています。これには、パックド・ピクセルと成分ピクセルの表現も含まれます。

ColorSpaceオブジェクトは、測定した数値の集合と特定の色の間の対応方法を管理する規則をカプセル化しています。java.awt.colorでのColorSpaceの実装は、RGBやグレー・スケールなど、もっとも一般的な色空間を表しています。色空間は色の集合ではないことに注意してください。色空間は、個々の色の値を解釈する方法についての規則を定義するものです。

色空間とカラー・モデルを切り離すことで、色の表現方法と、異なる表現の間での色の変換方法が、より柔軟になります。

1.2.5 塗りつぶしとストローク

Java 2D APIでは、さまざまなペン・スタイルと塗りつぶしパターンを使ってShapesをレンダリングできます。テキストは最終的にグリフの集合で表されるので、文字列にもストロークによる描画や塗りつぶしを適用できます。

ペン・スタイルは、Strokeインタフェースを実装するオブジェクトで定義されます。Strokeを使うと、直線や曲線に、さまざまな幅や破線パターンを指定できます。

塗りつぶしのパターンは、Paintインタフェースを実装するオブジェクトで定義されます。旧バージョンのAWTで利用できたColorクラスは、単純な型のPaintオブジェクトであり、1色の塗りつぶしを定義するために使います。Java 2D APIでは、Paintインタフェースの新しい実装として、TexturePaintGradientPaintの2つが提供されています。TexturePaintは、規則的に繰り返される単純なイメージ片を使った塗りつぶしパターンを定義します。GradientPaintは、2種類の色の間のグラデーションとして塗りつぶしパターンを定義します。

Java 2Dでは、図形の輪郭線のレンダリングと、パターンを使った図形の塗りつぶしは、2種類の異なる操作です。

文字列のレンダリングでは、そのときのPaint属性が、文字列を形成するグリフに適用されます。ただし、レンダリングされるグリフを実際に塗りつぶすのはdrawStringです。テキスト文字列のグリフの輪郭線をレンダリングするには、輪郭線を取得し、drawメソッドを使って輪郭線を図形としてレンダリングする必要があります。

1.2.6 重ね合わせ

既存のオブジェクトと重なるオブジェクトをレンダリングするときは、レンダリングしようとする領域の現在の色と新しいオブジェクトの色を混合する方法を決める必要があります。Java 2D APIでは、色を混合する際の規則は、Compositeオブジェクトにカプセル化されています。

簡単なレンダリング・システムでは、基本的なブール演算だけで色の混合が行われます。たとえば、ブール演算による合成規則では、ソース色の値とデスティネーション色の値の論理積(AND)、論理和(OR)、または排他的論理和(XOR)を求めることが可能です。このような方法には、いくつか問題があります。

Java 2D APIでは、色を合成するときにカラー・モデルの情報を考慮するアルファ・ブレンディング1規則を実装することで、これらの欠点を回避しています。AlphaCompositeオブジェクトには、ソース色とデスティネーション色の両方のカラー・モデルが含まれています。

1.3 Java 2D APIのパッケージ

Java 2D APIのクラスは、次のパッケージで編成されています。

パッケージjava.awtには、Java 2D APIのクラスとインタフェースのなかでも一般的な性質のもの、および従来のクラスを拡張するものが含まれています。したがって、java.awtには、Java 2D以外のクラスも含まれています。

パッケージjava.awt.geomには、幾何学的プリミティブの定義に関するクラスとインタフェースが含まれています。

幾何学的プリミティブの多くには、対応する.Float.Doubleの実装があります。これは、単精度と倍精度の浮動小数点表現の実装を可能にするために行われました。倍精度の実装を使うとレンダリングの精度は高くなりますが、プラットフォームによってはパフォーマンスが低下します。

パッケージjava.awt.fontには、テキストのレイアウトとフォントの定義に使うクラスとインタフェースが含まれています。

パッケージjava.awt.colorには、色空間とカラー・プロファイルの定義のためのクラスとインタフェースが含まれています。

パッケージjava.awt.image>java.awt.image.renderableには、イメージの定義とレンダリングに関するクラスとインタフェースが含まれています。

パッケージjava.awt.printには、Java 2Dベースのすべてのテキスト、グラフィック、およびイメージを印刷可能にするためのクラスとインタフェースが含まれています。

1アルファ・ブレンディングの詳細は、次を参照してください: 『Computer Graphics: Principles and Practice』第2版のセクション17.6, J.D. Foley, A. van Dam, S.K. Feiner, J.F. Hughes. Addison- Wesley, 1990。

 


目次||

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.
連絡先