Java 如何获取图像的高度和宽度?

Java 如何获取图像的高度和宽度?,java,image,asynchronous,Java,Image,Asynchronous,为什么下面的代码位返回高度:-1,这意味着高度还未知。如何获得图像的高度 try { // Create a URL for the image's location URL url = new URL("http://bmw-2006.auto-one.co.uk/wp-content/uploads/bmw-m3-2006-3.jpg"); // Get the image java.awt.Image image = To

为什么下面的代码位返回高度:-1,这意味着高度还未知。如何获得图像的高度

 try {
        // Create a URL for the image's location
        URL url = new URL("http://bmw-2006.auto-one.co.uk/wp-content/uploads/bmw-m3-2006-3.jpg");

        // Get the image
        java.awt.Image image = Toolkit.getDefaultToolkit().createImage(url);

        System.out.println("Height: " + image.getHeight(null));


    } catch (MalformedURLException e) {
    } catch (IOException e) {
    }
使用或代替。它将在加载时阻塞,返回后将知道图像的宽度和高度

例如。


或者,向正在由异步加载的映像中添加一个,并等待它完全加载。

您希望这样:

    try {
        // Create a URL for the image's location
        URL url = new URL("http://bmw-2006.auto-one.co.uk/wp-content/uploads/bmw-m3-2006-3.jpg");

        // Get the image
        Image image = ImageIO.read(url);

        System.out.println("Height: " + image.getHeight(null));


    }
    catch(MalformedURLException e) {
        e.printStackTrace();
    }
    catch(IOException e) {
        e.printStackTrace();
    }
java.awt.Toolkit
方法不会阻塞,因此将返回-1,并在加载时通知观察者(在您的情况下不是,因为它是空的)。如果您确实希望异步执行,那么需要以图像观察者的形式提供回调


哦,不要忽略异常,至少要打印堆栈跟踪

因为图像是在后台异步加载的

正如
getHeight()
javadoc所说,您需要提供一个(而不是
null
),在加载映像时调用它。

Toolkit\createImage(…)
非阻塞的。通常我宁愿使用
javax.imageio.imageio
来读取图像

要等待
工具包#createImage(…)
,请使用:

MediaTracker mediaTracker = new MediaTracker(component);
mediaTracker.addImage(image);
try {
    mediaTracker.waitForAll();
} catch (InterruptedException e) {
    e.printStackTrace();
}

之后,您可以调用
image.getHeight()
在后台运行createImage来加载图像


使用MediaTracker等待加载,然后使用getHeight(并使用有效的ImageObserver防止错误)

的可能副本-取决于是否需要使用AWT Image类。@berry120-我想说的是Java不希望看到太长时间的图像是一个问题。。。
MediaTracker mediaTracker = new MediaTracker(component);
mediaTracker.addImage(image);
try {
    mediaTracker.waitForAll();
} catch (InterruptedException e) {
    e.printStackTrace();
}