我正在尝试显示恰好是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()是一种更简单,更有效的方法,但我仍然希望找到一种解决方法来实现这项工作:)
如果不可能,我会找到另一种方式,实际上没什么大不了的。
答案 0 :(得分:2)
可能图像尚未完全加载。尝试添加MediaTracker
,将图片添加到跟踪器并等待图片完全加载(使用waitForAll
或waitForID
)。
答案 1 :(得分:0)
等待图像完全加载的粗略但有效的方法是用它构造ImageIcon
。在图像完全加载之前,构造函数不会返回。即,
new javax.swing.ImageIcon(image); // force image to load