2

我正在使用 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[] 充满数据,就会从另一个线程调用它:

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 中是无用的,还是我做错了什么?

4

1 回答 1

0

PaletteData将构造函数用于直接调色板。我猜你想要的是索引调色板的构造函数。另请参阅此处此处以获取更多说明。

以下代码片段显示

  • 如何使用索引调色板创建灰度调色板
  • 如何将图像设置为一个整体(不是逐行)

    // 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();
    

注意:我尝试了一个使用 Your PaletteData 的示例,例如

    PaletteData palette = new PaletteData( 255, 255, 255 );

从某种意义上说,它显示了一些灰度图片(实际上是视频)。但是,给定代码片段中使用的索引版本对眼睛更友好。看看上面提供的第一个链接。它很好地解释了索引调色板和直接调色板之间的区别。

于 2013-04-04T07:54:04.033 回答