2015-11-25 44 views
5

Sto cercando il modo più veloce per scrivere pixel su javafx.scene.image.Image. La scrittura sul backing array di BufferedImage è molto più veloce. Almeno sull'immagine di prova ho preso solo ~ 20ms per BufferedImage, WritableImage d'altra parte ha ~ 100ms. Ho già provato SwingFXUtils ma senza fortuna.JavaFX: il modo più veloce per scrivere pixel su PixelWriter

Codice in BufferedImage (più veloce):

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

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

Codice in WritableImage (più lento):

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

forse c'è un modo per scrivere a WritableImage s' allineamento supporto troppo?

risposta

1

Per le prestazioni del pixel writer è assolutamente fondamentale scegliere il giusto formato di pixel. È possibile verificare il formato pixel nativo è via

pw.getPixelFormat().getType() 

Sul mio Mac questo è PixelFormat.Type.BYTE_BGRA_PRE. Se i tuoi dati grezzi sono conformi a questo formato pixel, il trasferimento all'immagine dovrebbe essere piuttosto veloce. Altrimenti i dati dei pixel devono essere convertiti e ciò richiede del tempo.

+0

Questo non risponde alla domanda. Il formato Pixel dipende dall'immagine sorgente utilizzata. Se non si utilizza il formato che corrisponde al formato dell'immagine di origine, si otterrà un'eccezione in fase di esecuzione. – jjhavokk

+1

Ho ipotizzato che il formato pixel di origine possa essere adattato in modo da poter raggiungere la massima velocità di trasferimento. Questo è spesso il caso quando crei tu stesso il contenuto dei pixel. – mipa