DATE : 2006/07/26 (Wed)
Java Advanced Imaging は、先日の記事のように簡単に使えます。
しかし、細かいところを操作しようとすると、Java 2D の知識が欠かせなくなってきます(例えば、画像にアルファ成分を追加するなどといった操作です)。
そこで、Java 2D のイメージングについてメモしようと思います。
イメージの構造
ここでは、RenderedImage などの、Java 2D での構造についてメモします。
Java 2D でのイメージは、次のような構成となっています。
- ラスター
- サンプルモデル
- データバッファ
- カラーモデル
- カラー領域
ラスター
ラスター(Raster)とは、ピクセルの値を集めたものです。ピクセルの「値」を集めたものなので、そこに色の概念は関係しません。ただ単に、ビット列としての画素値を扱います。
サンプルモデルとデータバッファ
データバッファ(DataBuffer)は、データを納めるもの、サンプルモデル(SampleModel)は、画素値をどのようにしてデータバッファに納めているかを表すものです。
データバッファは、1つのデータを表す形式(整数、浮動小数点数、符号なしなど)やビット幅を指定します。例えば、DataBuffer.BYTE を使用すると、8ビットでデータひとつを表現することになります。また、値を別々の配列に格納するバンクという仕組みもあります。
サンプルモデルは、イメージの大きさやバンド数を決めます。バンド数とは、各色成分のことをいいます。例えば、RGB で表現される色は赤成分・緑成分・青成分に分けられるので3バンド、ARGB ではアルファ成分が加わるので4バンド、グレイスケールは1つの成分しかないので1バンドとなります。
なお、データバッファに格納されるのはあくまでも「データ」であって、「画素値」ではありません。画素値をどのようなデータにして、どこのバンクに格納するかも、サンプルモデルが定めます。例えば、SinglePixelPackedSampleModel の場合は、1画素の全バンドを1つのデータ格納します。また、MultiPixelPackedSampleModel では、1バンドの複数画素を1つのデータに格納します。ComponentSampleModel では、1バンド1画素を1つのデータに格納します。このサブクラスには、異なるバンドを同じバンクに格納するか、別々のバンクに格納するかといった指定を行うものもあります。
カラーモデル
カラーモデル(ColorModel)は、画素値を色として解釈する方法を表します。例えば、 IndexColorModel は、1バンドの画素値を特定の色と対応付けます。例えば、0は黒、1は赤という具合です。また、PackedColorModel は、1バンドの画素値ひとつの中に複数成分の画素値があると見なします。例えば、0xffffff を、0xff, 0xff, 0xff と3成分に分けるようにです。ComponentColorModel は、1つの画素値には1つの成分があると見なします。
カラーモデルには、ラスターで表現された画素値を解釈するという機能上、扱えるサンプルモデルには制限があります。そのため、java.awt.image.ColorModel には、そのカラーモデルと互換性のあるサンプルモデルを生成するメソッドや、互換性を確かめるメソッドがあります。
カラー領域
カラーモデルで解釈される画素値が、RGB や HSV などのどの色空間に属するかといった情報は、カラー領域(ColorSpace)が管理します。