我正在使用Eclipse Window Builder Editor构建GUI。 我用Gridlayout做了一个Composite,并在那里放了一个Label。 来自另一个类的某些方法生成原始的8位1280x1024灰度图像,该图像保存在字节数组中。 这就是我在mainMethod中生成ImageData等的方法:
Color white = display.getSystemColor(SWT.COLOR_WHITE);
Color black = display.getSystemColor(SWT.COLOR_BLACK);
PaletteData palette = new PaletteData( 255, 255, 255 );
imgData = new ImageData(1280, 1024, 8, palette);
imgLabel = new Label(composite_3, SWT.NONE);
imgLabel.setImage(null);
imgLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
我仍然无法理解我应该如何处理PaletteData,因为我还不需要颜色。 (颜色)深度应为8,因为我希望它有255个灰度值?
这是我的setImg方法,只要byte []填充了数据,就会从另一个Thread调用:
public static void setImg(final byte[] b) {
Display.getDefault().syncExec( new Runnable() {
@Override
public void run() {
imgData.setPixels(0, 0, 1280, b, 0);
img = new Image(Display.getCurrent(), imgData);
Image grayImg = new Image(Display.getCurrent(), img, SWT.IMAGE_GRAY);
imgLabel.setImage(img);
// img.dispose();
}
});
}
我试过
imgLabel.setImage(img);
和
imgLabel.setImage(grayImg);
好的第一行现在正确显示...... 似乎我只能用imgData.setPixels(...)设置1行像素,这是一种无用的imo或者我做错了什么?
答案 0 :(得分:0)
您的PaletteData
使用直接调色板的构造函数。我想你想要的是索引调色板的构造函数。另请参阅here和here以获取更多说明。
以下代码段显示
如何将图像整体设置(不是逐行)
// pixel depth will be 8-bit, so there is space for 256 different (grey) values
RGB[] rgb = new RGB[256];
// build grey scale palette: 256 different grey values are generated.
for (int i = 0; i < 256; i++) {
rgb[i] = new RGB(i, i, i);
}
// Construct a new indexed palette given an array of RGB values.
PaletteData paletteData = new PaletteData(rgb);
// create an image with given dimensions, depth and color palette
ImageData imageData = new ImageData(1280, 1024, 8, paletteData);
// data represents the pixels of the image. This corresponds to 'b' in Your code
imageData.data = b;
// note that there are also other 'Image', e.g. java.awt.Image
org.eclipse.swt.graphics.Image image = new Image(Display.getCurrent(), imageData);
// paint
imgLabel.setImage(img);
// release operating system resources corresponding to the image
image.dispose();
注意:我尝试了一个使用PaletteData的示例,例如
PaletteData palette = new PaletteData( 255, 255, 255 );
它的工作原理是它显示了一些灰度图片(实际上是一个视频)。但是,在给定的代码段中使用的索引版本更加友好。看看上面提供的第一个链接。它很好地解释了索引和直接调色板之间的区别。