Java / SWT从字节数组中显示8位灰度图像

时间:2013-02-01 11:16:16

标签: java swt

我正在使用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或者我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的PaletteData使用直接调色板的构造函数。我想你想要的是索引调色板的构造函数。另请参阅herehere以获取更多说明。

以下代码段显示

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

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

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