1

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

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

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

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() 是一种更简单、更有效的方法,但我仍然想找到一种解决方法来完成这项工作:)

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

4

2 回答 2

2

也许图像还没有完全加载。尝试添加 a MediaTracker,将图像添加到跟踪器并等待图像完全加载(使用waitForAllwaitForID)。

于 2013-04-08T12:56:21.357 回答
1

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

new javax.swing.ImageIcon(image); // force image to load
于 2014-06-23T13:20:37.177 回答