gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:06:42 25 4
gpt4 key购买 nike

我正在使用 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,因为我根本不需要颜色。(Color)Depth 应该是 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 行像素,这在我看来是无用的,还是我做错了什么?

最佳答案

您的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();

注意:我用 Your PaletteData 尝试了一个例子,例如

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

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

关于Java/SWT 从字节数组显示 8 位灰度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14645117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com