カラーモデル
カラーマップの生成
イメージフィルタをカスタムで生成したり
あるいは、前回のようなピクセルの配列をイメージとして生成する場合
カラーモデルは重要な知識となってきます
カラーモデルは java.awt.image.ColorModel クラスで実装されます
このクラスは特定のイメージのピクセル値をアルファ、赤、緑、青成分に変換する
メソッドをカプセル化した抽象クラスです
MemoryImageSource()コンストラクタに、このクラスのオブジェクトを渡すパラメータがありました
実際には、java.awt.image.IndexColorModelクラスなどが使われます
このクラスは、ColorModelクラスを拡張したクラスで、色の成分とピクセル値を変換します
これは、MemoryImageSourceなどで指定する配列を変換するなどに使用されます
コンストラクタは以下のものがあります
public IndexColorModel(int bits, int size, byte r[], byte g[], byte b[])
public IndexColorModel(int bits, int size, byte r[], byte g[], byte b[], int trans)
public IndexColorModel(int bits, int size, byte r[], byte g[], byte b[], byte a[])
public IndexColorModel(int bits, int size, byte cmap[], int start, boolean hasalpha)
public IndexColorModel(int bits, int size, byte cmap[], int start, boolean hasalpha, int trans)
public IndexColorModel(int bits, int size, int cmap[], int start, boolean hasalpha, int trans, int transferType)
bitsには1ピクセル当たりのビット数を
sizeには色成分の配列のサイズ(要素数)を指定します
r[]には赤成分の配列、g[]には緑成分の配列、b[]には青成分の配列を指定します
たとえば r[0] = 255 , g[0] = 0 , b[0] = 0 で、インデックス0番が赤になります
transには、透明なピクセルのインデックスを指定します
このインデックス番号は、アルファ値0の透明状態になります
a[]にはアルファ透明度の配列を指定します
下の3つのコンストラクタはこの場では説明しません
以上のコンストラクタで生成したインスタンスを、MemoryImageSource()に渡すことで
ピクセルからイメージを生成する配列のインデックスのモデルを変更することができます
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
/* <applet code="App52.class" width="300"height="300">
</applet>
*/
public class App52 extends Applet {
Image img;
MemoryImageSource mi;
public void init() {
byte r[] = { (byte)255 , (byte)0 , (byte)0 };
byte g[] = { (byte)0 , (byte)255 , (byte)0 };
byte b[] = { (byte)0 , (byte)0 , (byte)255 };
IndexColorModel icm = new IndexColorModel(8 , 3 , r , g , b);
int ary[] = { 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 ,
2 , 2 , 2 , 0 , 0 , 0 , 1 , 1 , 1 };
mi = new MemoryImageSource(9 , 2 , icm ,ary , 0 , 9);
img = createImage(mi);
}
public void paint(Graphics g) {
g.drawImage(img , 0 , 0 , 300 , 300 , this);
}
}
今回作成したカラーモデルは0〜2までの3通りの色しか持っていません
そのため、MemoryImageSource()で指定している配列は0〜2までです
0は赤、1は緑、2は青というカラーモデルになっています
実際にメモリーイメージで生成した画像は、横に9ピクセル縦に2ピクセルの小さな画像です
これを、drawImage()メソッドで300×300に引き伸ばしています
以下のプログラムは、上のプログラムにアルファ透明度を指定したものです
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
/* <applet code="test.class" width="300"height="300">
</applet>
*/
public class test extends Applet {
Image img;
MemoryImageSource mi;
public void init() {
byte a[] = { (byte)100 , (byte)255 , (byte)20 };
byte r[] = { (byte)255 , (byte)0 , (byte)0 };
byte g[] = { (byte)0 , (byte)255 , (byte)0 };
byte b[] = { (byte)0 , (byte)0 , (byte)255 };
IndexColorModel icm = new IndexColorModel(8 , 3 , r , g , b , a);
int ary[] = { 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 ,
2 , 2 , 2 , 0 , 0 , 0 , 1 , 1 , 1 };
mi = new MemoryImageSource(9 , 2 , icm ,ary , 0 , 9);
img = createImage(mi);
}
public void paint(Graphics g) {
g.drawImage(img , 0 , 0 , 300 , 300 , this);
}
}
また、デフォルトのカラーモデル(RGB値)を得ることもできます
デフォルトのカラーモデルを得るにはColorModelクラスのgetRGBdefault()メソッドを使用します
public static ColorModel getRGBdefault()
このメソッドは、int型RGB値のデフォルト形式を記述したColorModelを返します
前回のプログラムを、デフォルトのカラーモデルを指定した方法で表現してみましょう
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
/* <applet code="test.class" width="300"height="300">
</applet>
*/
public class test extends Applet {
Image img;
public void init() {
int ary[] = new int[300 * 300] , index = 0;
for (int i = 0 ; i < 300 ; i++) {
int r = (i * 255) / 299;
for (int j = 0 ; j < 300 ; j++)
ary[index++] = ( 255 << 24 ) | ( r << 16 ) | (( j * 255 ) / 299) << 8;
}
ColorModel cm = ColorModel.getRGBdefault();
MemoryImageSource m = new MemoryImageSource(300 , 300 , cm , ary , 0 , 300);
img = createImage(m);
}
public void paint(Graphics g) {
g.drawImage(img , 0 , 0 , 300 , 300 , this);
}
}
getRGBdefault()が、デフォルトのカラーモデルを返していることがわかりますね