java.awt.Image getWidth和getHeight方法效果不好?

时间:2013-04-08 08:18:37

标签: java image height width

我正在尝试显示恰好是Image类(http://docs.oracle.com/javase/7/docs/api/java/awt/Image.html)实例的图像。 我需要有一个BufferedImage,我发现了一段适用于此目的的代码(使用Graphics)。 但是要创建BufferedImage,我需要知道图像的宽度和高度。 Image类确实有getWidth和getHeight方法,但它们似乎不能正常工作。使用调试我发现有时,宽度和高度设置为-1。我还发现实际调用getWidth和getHeight方法会“更新”宽度和高度值,因此高度和宽度在此之后具有正确的值。所以我在调用getWidth和getHeight“for real”之前添加了一个假的“image.getWidth(null)”并得到了正确的值。 当我在调试模式下逐步执行它时工作正常,但是当我正常运行它时它不能正常工作。我添加了一个“Thread.sleep(5);”在“假”getWidth调用之后,它使它工作。

这种行为很奇怪,也许某人会有一个解释和/或一种方法让它在没有睡眠技巧的情况下工作?

编辑: 这是图像的加载方式:

URL url = "path/to/img";
Image img = Toolkit.getDefaultToolkit().getImage(url);

我已经说过对这段代码的只读访问了,这就是为什么我想从那里开始获取我的BufferedImage。

我添加的内容是

image.getWidth(null); // "Fake" call to force the image to update his width&height
try {
Thread.sleep(5);
} catch...
if(image.getWidth(null) != -1 && image.getHeight(null) != -1) {
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics bg = bi.getGraphics();
bg.drawImage(image, 0, 0 null);
bg.dispose();
}

如果我移除睡眠,似乎getWidth“没有时间”来完成,对于某些图像我仍然有宽度/高度= -1。 用于计算尺寸的一些方法可能是异步的。 我知道ImageIO.read()是一种更简单,更有效的方法,但我仍然希望找到一种解决方法来实现这项工作:)

如果不可能,我会找到另一种方式,实际上没什么大不了的。

2 个答案:

答案 0 :(得分:2)

可能图像尚未完全加载。尝试添加MediaTracker,将图片添加到跟踪器并等待图片完全加载(使用waitForAllwaitForID)。

答案 1 :(得分:0)

等待图像完全加载的粗略但有效的方法是用它构造ImageIcon。在图像完全加载之前,构造函数不会返回。即,

new javax.swing.ImageIcon(image); // force image to load