2015-07-23 8 views
5

Sto scrivendo un server FTP che riceve immagini e quindi le ridimensiona e le carica.Interfaccia utente per una sorta di immagine Java/Scala. Considerazioni sulle prestazioni

mio processo corrente (pseudocodice) è la seguente:

val imagesAsBytes: Array[Byte] = ... 
val bufferedImage: BufferedImage = ImageIO.read(new ByteArrayInputStream(bytes)) 
uploadImage(bufferedImage) 

Questo è l'essenza di esso. Ho omesso il ridimensionamento perché non è importante. In sostanza, serializzo lo Array[Byte] in un BufferedImage utilizzando il modulo ImageIO e quindi lo ridimensiono.

Ho effettuato alcuni profili e ho notato che la creazione di un BufferedImage utilizzando ImageIO è terribilmente lenta.

Se ho appena caricato il Array[Byte], posso ottenere circa 4 volte il throughput, rispetto a se effettivamente provo a convertirlo in un BufferedImage. Il motivo per cui non posso semplicemente caricare il Array[Byte], è che ho bisogno di ridimensionare l'immagine. Non sono legato a BufferedImage, è solo il mio primo tentativo.

Qualcuno sa di alcune idee che posso usare per accelerare questo? C'è un formato migliore che dovrei usare su BufferedImage?

Ho già pensato di ridimensionare il ridimensionamento su un microservice separato ed eseguirlo in modo asincrono, ma non è un'opzione per la prima versione.

Edit: ho rivisto this domanda, e sono consapevoli di questo: ImageIO.setUseCache(false)

+0

Questo aiuto? http://docs.oracle.com/javase/7/docs/api/javax/swing/ImageIcon.html – Allison

+0

Non penso che decodificare un'immagine, ricampionarla (ridimensionandola) e infine ricodificare possa essere considerata lenta (4x) in base ai tuoi numeri. In realtà, è sorprendentemente veloce, rispetto al solo copiare i byte ... O era solo rispetto alla decodifica? Ad ogni modo, quale formato di file stai usando? Alcuni formati sono più pesanti da decodificare di altri. – haraldK

risposta

0

vorrei suggerire guardando biblioteca più sostenuto attivamente (ultima release a maggio 2016), come scrimage. Sotto il cofano usa java.awt.*. Almeno in caso di problemi sarete in grado di affrontarli e risolverli, inoltre utilizzando più API "scalare".

Spero che aiuti.

Problemi correlati