2015-11-25 16 views
5

Ich bin auf der Suche nach dem schnellsten Weg, Pixel auf javafx.scene.image.Image zu schreiben. Schreiben in BufferedImage 's Backing Array ist viel schneller. Zumindest auf dem Testbild, das ich gemacht habe, dauerte es nur ~ 20ms für BufferedImage, WritableImage nahm andererseits ~ 100ms. Ich habe es schon versucht SwingFXUtils aber kein Glück.JavaFX: Schnellste Möglichkeit Pixel in PixelWriter zu schreiben

-Code für BufferedImage (schneller):

BufferedImage bi = createCompatibleImage(width, height); 
WritableRaster raster = bi.getRaster(); 
DataBufferInt dataBuffer = (DataBufferInt) raster.getDataBuffer(); 

System.arraycopy(pixels, 0, dataBuffer.getData(), 0, pixels.length); 

-Code für WritableImage (langsamer):

WritableImage wi = new WritableImage(width, height); 
PixelWriter pw = wi.getPixelWriter(); 
WritablePixelFormat<IntBuffer> pf = WritablePixelFormat.getIntArgbInstance(); 

pw.setPixels(0, 0, width, height, pf, pixels, 0, width); 

Vielleicht gibt es einen Weg zu zu WritableImage ‚s Träger Array zu schreiben?

Antwort

1

Für die Leistung des Pixelschreibers ist es absolut entscheidend, dass Sie das richtige Pixelformat wählen. Sie können überprüfen, was das native Pixelformat über

ist
pw.getPixelFormat().getType() 

Auf meinem Mac ist dies PixelFormat.Type.BYTE_BGRA_PRE. Wenn Ihre Rohdaten diesem Pixelformat entsprechen, sollte die Übertragung auf das Bild ziemlich schnell sein. Ansonsten müssen die Pixeldaten konvertiert werden und das braucht etwas Zeit.

+0

Dies beantwortet die Frage nicht. Das Pixelformat hängt vom verwendeten Quellbild ab. Wenn Sie nicht das Format verwenden, das dem Quellbildformat entspricht, erhalten Sie zur Laufzeit eine Ausnahme. – jjhavokk

+1

Ich ging davon aus, dass das Quellpixelformat so angepasst werden kann, dass die maximale Übertragungsrate erreicht werden kann. Dies ist häufig der Fall, wenn Sie den Pixelinhalt selbst erstellen. – mipa