PaletteDataクラスは、画像に使用される色情報を表します。 PaletteDataクラスには、インデックス型とダイレクト型の使い方があります。
インデックス型のPaletteDataオブジェクトは、PaletteData(RGB[] colors)コンストラクタによって作成します。 colorsには、いくつかの色を指定します。
例えば、赤、青、黄色の3色のパレットを作成して、使用する場合は、次に示すコードのようになります。
RGB[] colors = {
new RGB(0xFF, 0x00, 0x00),
new RGB(0x00, 0x00, 0xFF),
new RGB(0x00, 0xFF, 0xFF)
};
PaletteData palette = new PaletteData(colors);
// 色の取得
RGB red = palette.getRGB(0);
RGB blue = palette.getRGB(1);
RGB yellow = palette.getRGB(2);
色を取得する際には、コンストラクタで指定したRGB配列の順番で取得することができるようになります。
このように、
何番目の色を取得するかという使い方が、インデックス型
です。
ダイレクト型のPaletteDataオブジェクトは、PaletteData(int redMask, int greenMask, int blueMask)コンストラクタによって作成します。 赤、緑、青に使用するビット幅を決めて、その幅の表現する数値の割合の程度で色を表現するのがダイレクト型です。 redMask、greenMask、blueMask引数には、それぞれその情報にどの位置のビットを使うかを指定します。 例えば、色情報に3ビット使うことにして、一番左側のビットを赤、真ん中のビットを緑、右側のビットを青に割り当てる場合は、次のように書きます。
PaletteData palette = new PaletteData(1<<2, 1<<1, 1<<0);この場合、色の有無は、ビットがたっているかどうかで判断するので、色があるかないかの判断だけで、 濃淡の判断はできません(使用するビット数を増やせば濃淡が表現できる)。
先ほどのサンプルプログラムを、ダイレクト形式のPaletteDataオブジェクトを使用して実現するように書き換えたコードを示します。
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class CreateImageDdata {
private static final short IMAGEWIDTH = 100;
private static final short IMAGEHEIGHT = 100;
public static ImageData createImageData() {
// 色情報の作成
/*
PaletteData palette = new PaletteData(new RGB[] {
new RGB(0xFF, 0x00, 0x00),
new RGB(0x00, 0xFF, 0x00),
new RGB(0x00, 0x00, 0xFF)
});
*/
PaletteData palette = new PaletteData(1<%lt;2, 1<<1, 1<<0);
// ImageDataオブジェクトの作成
ImageData imageData = new ImageData(IMAGEWIDTH, IMAGEHEIGHT, 32, palette);
// ImageDataオブジェクトにピクセルを書き込んでいく
for (short h=0 ; h<IMAGEHEIGHT ; h++) {
for (short w=0 ; w < IMAGEWIDTH ; w++) {
int pixelValue = (h/20 + w/20) % 3;
imageData.setPixel(h, w, 1 << pixelValue);
}
}
return imageData;
}
public static void main(String[] args) {
final Display display = new Display();
Shell shell = new Shell(display);
Canvas canvas = new Canvas(shell, SWT.NONE);
canvas.setSize(IMAGEWIDTH, IMAGEHEIGHT);
// ImageDataオブジェクト作成
final ImageData imageData = createImageData();
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
// 描画
Image image = new Image(null, imageData);
e.gc.drawImage(image, 0, 0);
image.dispose();
}
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
