getSize(),getWidth(),getHeight()返回-1

时间:2009-12-03 20:15:14

标签: java

我有一个Image img,当尝试使用上面提到的任何get方法时,返回-1。为什么是这样?什么是ImageObserver对象?

5 个答案:

答案 0 :(得分:2)

根据the documentation for Image,如果还不知道大小,宽度或高度,这些方法返回-1。

此外,ImageObserver只是一个接口,它提供了获取有关正在构造的Image对象信息的通知的方法。

答案 1 :(得分:1)

您可以使用MediaTrack获取图片的宽度和宽度。这样的高度:

 // ...

 Image img;
 // ...
 // ...  loading the image using IO or Toolkit ot something

 MediaTracker MTrack = new MediaTracker(this); // in my case, 'this' is a JFrame

 MTrack.addImage(img,1);
 try 
{
    MTrack.waitForID(1);
} 
catch(InterruptedException e) 
{
   e.getMessage();
}

int width = img.getWidth(null);
int height = img.getHeight(null);

double ratio = (double)width/(double)height;

// ....
// ....

答案 2 :(得分:0)

根据the Java docs,似乎如果你在图像上仍然处于构造阶段时调用getHeight()等,那么高度实际上并不是“已知”,则返回-1并且提供ImageObserver通知。

ImageObserver是一个接口,它为您提供了一种方法,让您可以在以某种方式更新图像时调用回调方法。 ImageObserver由java.awt.Component实现,因此如果在包含类中扩展它,则可以覆盖imageUpdated()并在异步调用函数时存储图像高度(如果Image.getHeight返回-1)。

答案 3 :(得分:0)

在GraphTest中,覆盖imageUpdate:

@Override
public void imageUpdate(Image img, int flags,
               int x, int y, int width, int height) {
    if ((flags & (WIDTH|HEIGHT)) == (WIDTH|HEIGHT)) {
        // width and height have meaningful values, do your resize here
    }
    super.imageUpdate(img, flags, x, y, width, height);
}

答案 4 :(得分:0)

问题是加载图像所需的时间。

只要未加载图像,您就获得-1。最终加载图像时,它触发 ImageObserver。在您的情况下,观察者背景实例 - g.drawImage(bkg, 0, 0, this); - 将强制重新绘制背景,从而导致现在加载的图像被绘制。

您还可以使用java.awt.MediaTracker来跟踪图片的状态。

[]]