Ok, ecco il mio scoperte finora (e ad essere onesti, sono un po 'preoccupanti ...).
Utilizzando il plugin standard JPEG per ImageIO in bundle con l'Oracle JRE:
BufferedImage image = ImageIO.read(file);
legge l'immagine in circa 18 secondi sul mio computer (un MacBookPro/2.8GHz i7).
Usando il mio JPEG plugin for ImageIO, che utilizza un percorso di codice leggermente diverso (per esempio, probabilmente si può ottenere gli stessi risultati per ottenere il ImageReader
e invocando il metodo readRaster()
, quindi la creazione di un BufferedImage
da questo. Il codice non è banale, in modo da consultare la pagina del progetto tho se volete vedere il codice):
BufferedImage image = ImageIO.read(file);
legge l'immagine in circa 8 secondi sul mio computer.
Utilizzando la mia classe BufferedImageFactory
e AWT Toolkit
:
BufferedImage image = new BufferedImageFactory(Toolkit.getDefaultToolkit().createImage(file.getAbsolutePath())).getBufferedImage();
legge l'immagine in ~ 2,5 secondi sul mio computer.
Utilizzando il deprecato JPEGImageDecoder
classe da sun.awt.codec
:
BufferedImage image = new JPEGImageDecoderImpl(new FileInputStream(file)).decodeAsBufferedImage();
legge l'immagine in ~ 1,7 secondi sul mio computer.
Quindi, questo significa che dovremmo essere in grado di leggere questa immagine in meno di 2 secondi, anche in Java. Le prestazioni dello JPEGImageReader
sono ridicole in questo caso e mi piace davvero sapere perché. Come già accennato, sembra essere necessario con la progressiva decodifica, ma comunque, dovrebbe essere migliore di questo.
Aggiornamento:
Solo per il gusto di farlo, ho creato un rapido PoC ImageReader
plug sostenuto dalla LibJPEG-Turbo Java API. Non è molto sofisticato ma, ma consente il codice come:
BufferedImage image = ImageIO.read(file);
Per leggere l'immagine in < 1,5 secondi sul mio computer.
PS: I used to maintain ImageIO wrappers for JMagick (simile al codice menzionato da @Jordan Doyle, ma consente di programmare contro l'API ImageIO), tuttavia ho smesso poiché era troppo lavoro. Forse dovrò riconsiderare ... Almeno vale la pena di dare un'occhiata anche alla sua soluzione, se non ti interessa affidarti all'installazione di codice JNI/nativo.
Il caricamento dell'immagine (da un file locale) utilizzando 'ImageIO' in un semplice programma java richiede circa 1-2 secondi sul mio PC - da dove viene l'immagine? quando lo fai? – BretC
@Bret Non mi sono reso conto che StackOverflow probabilmente ha ridimensionato e/o ricodificato quell'immagine durante il caricamento sul loro server. Questa è l'immagine originale: https://dl.dropboxusercontent.com/u/73774/slow2.jpg (domanda originale modificata con questo collegamento) – the21st
Hai provato a utilizzare 'InputStreamReader' e/o' BufferedReader'? –