java.awt.Image getWidth 和 getHeight 方法不能正常工作?

标签 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 之前添加了一个假“image.getWidth(null)”,并获得了正确的值。 当我在 Debug模式下逐步执行时,效果很好,但当我正常运行时,它就不再工作了。我添加了一个“Thread.sleep(5);”在“假” getWidth 调用之后,它就起作用了。

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

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

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();
}

如果我删除 sleep ,似乎 getWidth“没有时间”完成,并且某些图像的宽度/高度= -1。 一些用于计算维度的方法可能是异步的。 我知道 ImageIO.read() 是一种更简单、更有效的方法,但我仍然想找到一种解决方法来完成这项工作:)

如果不可能的话我会找到其他方法,其实没什么大不了的。

最佳答案

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

关于java.awt.Image getWidth 和 getHeight 方法不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15874379/

相关文章:

javascript - jquery - 设置 float div 的动态等高

java - ArrayList 与 Vector 通过引用传递

java - 新的affectiva SDK ver 3.1.2使用难度

java - Libgdx ModelBuilder.createRect 仅从一侧可见

java - 有没有办法在 Controller 类之外访问 Spring Controller 参数?

c++ - NoDecodeDelegateForThisImageFormat 使用 ImageMagick 读取 .png 文件时出错

java - 在 JavaFX 中的图像上使用 ColorPicker

python - 如何在GAE上过滤图像?

QTextEdit设置固定行高、段落间距

Java - 如何自动设置 img.getScaledInstance( ); 的宽度?