2017-09-23 3 views
0

Ich habe ein Problem bezüglich der Erstellung eines JavaFX WriteableImage mit einem Byte-Array von Graustufen-Bilddaten.Verwenden von PixelWriter.setargb

Ich habe eine Arbeitsfunktion für BufferedImage schreiben, aber was ich scheint, eine gleichwertige Methode, um für Bild mir ein Bild zurückkehrt mit allen Einträgen gleich 0.

Dies ist die Arbeitsweise ist:

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;  
} 

Und das ist mein Versuch einer gleichwertigen Methode für JavaFX (die mit allen Pixeln ein Bild zurück auf 0 gesetzt):

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; 
} 

Nun, der einzige Grund, warum ich konnte Ich habe bis jetzt herausgefunden, warum ich ein mit 0s gefülltes Bild habe, dass ich meine Werte nicht richtig formatiere, das heißt, dass BufferedImage.setRGB die angegebenen Werte formatiert und PixelWriter.argb formatierte Werte erwartet.

Ich habe keine Ahnung, was genau müsste ich es ändern Was

zu arbeiten, warum ich PixelWriter.setPixels nicht verwenden: Es scheint sehr Zeit intensiv im Vergleich mit der Methode zu sein, habe ich versucht, , da muss ich ein neues Array 3x so groß wie der Strom aufstellen und erst dann an die Methode übergeben. Ich habe es sowieso erfolglos versucht.

Vielen Dank für jede Hilfe

Antwort

1

Sie haben vergessen, über den a Teil argb. Das heißt, Sie schreiben ein Pixel mit einem 0 als Alpha-Kanal. Dies bedeutet, dass alle Pixel vollständig transparent sind. Sie müssen den Alphakanal 100% zur Einrichtung ein vollständig undurchsichtiges Bild zu erstellen:

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; 
} 

Bitte beachte, dass ich vereinfacht (i - x)/width-i/width habe seit Ganzahldivision abgeschnitten.

+0

Vielen Dank! Dies erklärt es und funktioniert perfekt –