【发布时间】:2013-03-30 06:09:01
【问题描述】:
我正在尝试显示恰好是 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);”在“假” 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() 是一种更简单、更有效的方法,但我仍然想找到一种解决方法来完成这项工作:)
如果不可能,我会找到另一种方法,这实际上没什么大不了的。
【问题讨论】:
-
可以解决它,但是我想让它工作并继续使用从工具包创建的 Image 实例(就像在你的线程中一样)。我真的没有可能修改创建图像的代码(使用工具包)并将其替换为 ImageIO.read...:s
-
但是
ImageIO.read(FILE);返回图片?所以你只需要改变 1 行 :) 。您如何实际阅读图像?请添加一些代码:)。 -
我编辑了主帖:)