【问题标题】:java.awt.Image getWidth and getHeight methods not working well?java.awt.Image getWidth 和 getHeight 方法不能正常工作?
【发布时间】: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 行 :) 。您如何实际阅读图像?请添加一些代码:)。
  • 我编辑了主帖:)

标签: java image height width


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-02
      • 2014-06-10
      • 2011-09-02
      • 2014-03-02
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 2020-06-20
      相关资源
      最近更新 更多