索引图(Indexed palette):
就是在palette中定义了一个RGB的数组,然后,每一个像素点都是一个RGB数组的坐标来到palette中去取值。
public class PaletteIndexExample {
static Display display;
public void drawImage(final Image image) {
Shell shell = new Shell (display);
shell.setLayout (new FillLayout ());
shell.setSize(400, 300);
shell.setLocation(600,300);
Canvas canvas = new Canvas (shell, SWT.NONE);
canvas.addPaintListener (new PaintListener () {
public void paintControl (PaintEvent e) {
e.gc.drawImage (image, 20, 20);
}
});
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ())
display.sleep ();
}
}
public Image createIndexImage() {
RGB redRGB = new RGB(255,0,0);
RGB greenRGB = new RGB(0,255,0);
PaletteData paletteData = new PaletteData(new RGB[]{redRGB,greenRGB});
ImageData imageData = new ImageData(48,48,1,paletteData);
for(int x=11;x<35;x++){
for(int y=11;y<35;y++){
imageData.setPixel(x,y,1);
}
}
return new Image(display,imageData);
}
public static void main(String[] args) {
display = new Display();
PaletteIndexExample e = new PaletteIndexExample();
e.drawImage(e.createIndexImage());
}
}
直接图(Direct palette):
ImageData中的data存的直接的RGB,但这个RGB怎么对应的是有Palette的(redMask, greenMask, blueMask)来决定的,如下面的(redMask, greenMask, blueMask)为(0xFF0000 , 0xFF00 , 0xFF),这样在利用ImagaData的setPixel(int)的时候,如imageData.setPixel(x,y,0xFF0055),(x,y)这个像素点的red设置成的FF、green设置成了00、blue设置成了55.
public class PaletteDirectExample {
static Display display;
public void drawImage(final Image image) {
Shell shell = new Shell (display);
shell.setLayout (new FillLayout ());
shell.setSize(400, 300);
shell.setLocation(600,300);
Canvas canvas = new Canvas (shell, SWT.NONE);
canvas.addPaintListener (new PaintListener () {
public void paintControl (PaintEvent e) {
e.gc.drawImage (image, 20, 20);
}
});
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ())
display.sleep ();
}
}
public Image createIndexImage() {
// *** PaletteData(redMask, greenMask, blueMask)
PaletteData palette = new PaletteData(0xFF0000 , 0xFF00 , 0xFF);
ImageData imageData = new ImageData(48,48,24,palette);
for (int x=0;x<48;x++) {
for(int y=0;y<48;y++) {
if(y > 11 && y < 35 && x > 11 && x < 35) {
imageData.setPixel(x,y,0xFFFFFF); // Set the center to green
} else {
imageData.setPixel(x,y,0xFF); // and everything else to red
}
}
};
return new Image(display,imageData);
}
public static void main(String[] args) {
display = new Display();
PaletteDirectExample e = new PaletteDirectExample();
e.drawImage(e.createIndexImage());
}
}