Java/SWT显示来自字节数组的8位灰度图像

Java/SWT显示来自字节数组的8位灰度图像,java,swt,Java,Swt,我正在使用Eclipse窗口生成器编辑器构建GUI。 我制作了一个带有Gridlayout的合成图,并在其中添加了一个标签。 来自另一个类的某些方法生成原始8位1280x1024灰度图像,该图像保存在字节数组中。 这是我在Main方法中生成ImageData等的方式: Color white = display.getSystemColor(SWT.COLOR_WHITE); Color black = display.getSystemColor(SWT.COLOR_BLACK); Pale

我正在使用Eclipse窗口生成器编辑器构建GUI。 我制作了一个带有Gridlayout的合成图,并在其中添加了一个标签。 来自另一个类的某些方法生成原始8位1280x1024灰度图像,该图像保存在字节数组中。 这是我在Main方法中生成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方法,当字节[]充满数据时,它会从另一个线程调用:

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

好的,第一行现在显示正确。。。
似乎我只能用imgData设置1行像素。setPixels(…)在我看来是无用的,还是我做了什么错事?

您的
调色板数据使用构造函数直接调色板。我猜您需要的是索引调色板的构造函数。有关更多说明,请参见和

下面的代码片段显示

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

    它的工作原理是显示一些灰度图(实际上是一个视频)。然而,在给定的代码片段中使用的索引版本更为直观。看看上面提供的第一个链接。它很好地解释了索引调色板和直接调色板之间的区别

    imgLabel.setImage(grayImg);
    
    // 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 palette = new PaletteData( 255, 255, 255 );