2017-09-23 138 views
0

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

我没有写BufferedImage的一个工作功能,但什么对我来说似乎是等效的方法对图像不会返回我的图像的所有条目等于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的等效方法(它返回设置为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: 它似乎是在与我试过方法对比非常强烈的时间,因为它确实需要我设置一个与当前一样大的新数组3x,然后才将其交给该方法。 反正我尝试过,但没有成功。

感谢所有帮助

回答

1

你忘了的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整数除法被截断。

+0

非常感谢!这解释了它,并且完美地工作 –