懒惰地用Java加载图像

时间:2013-01-03 06:44:40

标签: java image swing lazy-loading

让我们考虑一下这段代码

Image img=Toolkit.getDefaultToolkit().getImage("1.png");
g.drawImage(img,0,0,null);

代码的作用是加载图像1.png并将其绘制在图形上下文中。现在我观察的是drawImage在第一次调用时不会绘制任何图像。相反,它会在进一步调用时绘制图像。现在我认为这种行为是由于异步图像加载或方法的惰性行为造成的。

要解决问题,我可以使用javax.swing.ImageIcon这样的类。

Image img=new ImageIcon("1.png").getImage();
g.drawImage(img,0,0,null);

我想知道执行相同任务的其他更好方法是什么。

2 个答案:

答案 0 :(得分:6)

取决于。

如果您通过“慢速”连接(如互联网)加载图像,或者您正在加载相当大的图像,则最好使用延迟加载方法。

这允许应用程序在图像开始加载时继续运行。

Andrew是正确的,您应该使用g.drawImage(img,0,0,this),因为这样一旦图像加载完成后,组件就会自动更新,而不需要执行任何其他操作。

如果您的应用程序依赖于图像的某些部分操作,或者您在本地加载小图像,那么使用像...这样的东西就足够了。

BufferedImage image = ImageIO.read(imageResource); 
// Where image resource is either a file or local URL (such as an embedded resource)

我个人倾向于在大多数情况下使用后台线程加载我的图片并使用ImageIO。在我的paint方法中,如果需要让我知道我正在加载图片,我可能会使用一个小的占位符图片。

您还需要考虑要加载的图像类型。虽然ImageIO对图片格式有更大的支持,但加载动画GIF是有问题的,需要您完成更多的工作才能实现。

ps - 不要在组件paint方法中加载图像 - 可以多次调用paint,加载图像(或其他资源)会大大减慢重绘过程,使应用程序滞后......

答案 1 :(得分:2)

尝试使用ImageIO.read()加载图片。这将阻止,直到图像完全加载。查看this页面。