2014-02-24 57 views
1

我使用ImageIO.read()来从磁盘获取一些JPEG文件,但它是如此之慢...它需要250毫秒读取每个文件,而Toolkit.getDefaultToolkit()的getImage()只需要不到10毫秒(实际它在我的测试中显示0ms)!与Toolkit.getDefaultToolkit()。getImage()相比,ImageIO.read()为什么这么慢?

现在,我问自己:为什么是ImageIO.read()如此缓慢,如果Toolkit.getDefaultToolkit()的getImage()是如此之快?


这是超级快,但不会返回一个BufferedImage:

Image image = Toolkit.getDefaultToolkit().getImage(f.getAbsolutePath()); 

这是缓慢的(〜250毫秒读取2.3MB 3264x1840 JPEG文件):

BufferedImage image = ImageIO.read(f); 

回答

4

一般不是。

ImageIO在它被调用的同一线程上下文中读取图像,Toolkit.getDefaultToolkit().getImage()使用单独的背景Thread来加载图像并立即返回(几乎)。

这就是为什么你有MediaTracker#waitForAllMediaTracker#waitForIDImageObserver。这一切都监视这是由Toolkit.getDefaultToolkit().getImage()所以当图像加载完成,他们知道创建了一个图像加载过程的状态...

+0

嗯......你确定吗?如果是的话,我怎么能用ImageIO.read()来做同样的事情? – ceklock

+2

将'ImageIO.read'包装到一个单独的线程中。这将意味着,直到'ImageIO.read',你将不会有任何图像数据... – MadProgrammer

+0

是的,你是对的。如果我在调用getImage()之后尝试检查其大小,图像并未完全加载。 – ceklock