2017-09-23 30 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

非常感謝!這解釋了它,並且完美地工作 –