使用 PixelWriter.setargb

Using PixelWriter.setargb

我有一个关于使用灰度图像数据的字节数组创建 JavaFX WritableImage 的问题。

我确实为 BufferedImage 编写了一个工作函数,但在我看来是 Image 的等效方法 return 我得到了一个所有条目都等于 0 的图像。

这是工作方法:

private  static BufferedImage getBufferedImageFromData(int height, int width, byte[] data) {    
    BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    for(int i = 0; i < width * height; ++i){
        int a = 0xFF << 24;
        int r = (data[i] & 0xFF) << 16;
        int g = (data[i] & 0xFF) << 8;
        int b = data[i] & 0xFF;

        int x = i % width;
        int y = (i - x)/width;

        result.setRGB(x, y, a | r | g | b);
    }

    return result;      
}

这是我对 JavaFX 的等效方法的尝试(其中 return 是一个所有像素都设置为 0 的图像):

private static Image getImageFromData(int height, int width, byte[] data)     {
    WritableImage wr = new WritableImage(width, height);
    PixelWriter pw = wr.getPixelWriter();

    for(int i = 0; i < width * height; ++i) {
        int r = (data[i] & 0xFF) << 16;
        int g = (data[i] & 0xFF) << 8;
        int b = data[i] & 0xFF;

        int x = i % width;
        int y = (i - x)/width;

        pw.setArgb(x, y, r | g | b);
    }
    return wr;
}

现在,到目前为止我能想到为什么我得到一个充满 0 的图像的唯一原因是我没有正确格式化我的值,也就是说 BufferedImage.setRGB 确实格式化给定的值和 PixelWriter.argb 期望被赋予格式化的值。

我不知道我需要更改什么才能让它工作

至于为什么不用PixelWriter.setPixels: 与我尝试的方法相比,它似乎非常耗时,因为它确实需要我设置一个比当前大 3 倍的新数组,然后才将其交给该方法。 反正我试过了,没成功。

感谢您的帮助

您忘记了 argba 部分。这意味着你写一个带有 0 的像素作为 alpha 通道。这意味着您的所有像素都是完全透明的。您需要将 alpha 通道设置为 100% 以创建完全不透明的图像:

private static Image getImageFromData(int height, int width, byte[] data) {
    WritableImage wr = new WritableImage(width, height);
    PixelWriter pw = wr.getPixelWriter();

    for (int i = 0; i < width * height; ++i) {
        int value = data[i] & 0xFF;
        int r = value << 16;
        int g = value << 8;
        int b = value;

        int x = i % width;
        int y = i / width;

        // include alpha here
        pw.setArgb(x, y, (0xFF<<24) | r | g | b);
    }
    return wr;
}

请注意,我已将 (i - x)/width 简化为 i / width,因为整数除法被截断了。