Ok, hier sind meine Erkenntnisse so weit (und um ehrlich zu sein, sie sind ein wenig beunruhigend ...).
Mit dem Standard JPEG-Plugin für ImageIO mit dem Oracle JRE gebündelt:
BufferedImage image = ImageIO.read(file);
Liest das Bild in etwa 18 Sekunden auf meinem Computer (ein MacBookPro/2,8 GHz i7).
meinen JPEG plugin for ImageIO verwenden, die einen etwas anderen Codepfad verwendet (dh, können Sie wahrscheinlich die gleichen Ergebnisse erhalten, indem die ImageReader
zu erhalten und die readRaster()
Methode aufgerufen, dann ein BufferedImage
aus, dass zu schaffen. Der Code ist nicht trivial, so bitte tho Projektseite verweisen, wenn Sie den Code sehen möchte):
BufferedImage image = ImageIO.read(file);
Liest das Bild in etwa 8 Sekunden auf meinem Computer.
Mit meiner BufferedImageFactory
Klasse und die AWT Toolkit
:
BufferedImage image = new BufferedImageFactory(Toolkit.getDefaultToolkit().createImage(file.getAbsolutePath())).getBufferedImage();
Liest das Bild in ~ 2,5 Sekunden auf meinem Computer.
Verwendung der veralteten JPEGImageDecoder
Klasse von sun.awt.codec
:
BufferedImage image = new JPEGImageDecoderImpl(new FileInputStream(file)).decodeAsBufferedImage();
Liest das Bild in ~ 1,7 Sekunden auf meinem Computer.
Dies bedeutet, dass wir dieses Bild in weniger als 2 Sekunden lesen können, sogar in Java. Die Performance von der JPEGImageReader
ist in diesem Fall einfach lächerlich, und ich möchte wirklich wissen warum. Wie bereits erwähnt, scheint es mit der progressiven Decodierung zu tun zu haben, aber trotzdem sollte es besser sein.
Update:
Gerade für den Spaß von ihm, habe ich eine schnelle PoC ImageReader
Plugin von den LibJPEG-Turbo Java API gesichert. Es ist nicht sehr anspruchsvoll und doch, aber es ermöglicht Code wie:
BufferedImage image = ImageIO.read(file);
Um das Bild in < 1,5 Sekunden auf meinem Computer zu lesen.
PS: I used to maintain ImageIO wrappers for JMagick (ähnlich dem von @ Jordan Doyle genannten Code, aber es würde Ihnen erlauben, gegen die ImageIO API zu programmieren), aber ich hörte auf, wie es zu viel Arbeit war. Vielleicht muss ich es noch einmal überdenken ... Zumindest lohnt es sich, auch seine Lösung zu überprüfen, wenn es Ihnen nichts ausmacht, sich auf JNI/native Code-Installation zu verlassen.
Das Laden dieses Bildes (aus einer lokalen Datei) mit 'ImageIO' in einem einfachen Java-Programm dauert etwa 1-2 Sekunden auf meinem PC - woher bekommen Sie das Bild? Wenn du es tust? – BretC
@Bret Ich wusste nicht, dass StackOverflow dieses Bild während des Uploads auf ihren Server wahrscheinlich skaliert und/oder neu codiert hat. Dies ist das Originalbild: https://dl.dropboxusercontent.com/u/73774/slow2.jpg (bearbeitete Originalfrage mit diesem Link) – the21st
Haben Sie versucht, 'InputStreamReader' und/oder' BufferedReader' zu verwenden? –