如何获得图像的高度和宽度?

时间:2011-11-18 14:33:22

标签: 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 = Toolkit.getDefaultToolkit().createImage(url);

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


    } catch (MalformedURLException e) {
    } catch (IOException e) {
    }

5 个答案:

答案 0 :(得分:15)

改为使用ImageIO.read(URL)ImageIO.read(File)。它会在加载时阻塞,图像宽度和高度在返回后将被人知道。

E.G。

enter image description here

import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.imageio.ImageIO;
import java.net.URL;

class SizeOfImage {

    public static void main(String[] args) throws Exception {
        URL url = new URL("https://i.stack.imgur.com/7bI1Y.jpg");
        final BufferedImage bi = ImageIO.read(url);
        final String size = bi.getWidth() + "x" + bi.getHeight();
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JLabel l = new JLabel( 
                    size, 
                    new ImageIcon(bi), 
                    SwingConstants.RIGHT );
                JOptionPane.showMessageDialog(null, l);
            }
        });
    }
}

或者,向MediaTracker异步加载的图像添加Toolkit,并等待它完全加载。

答案 1 :(得分:2)

你想要这样的东西:

    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并通知观察者(或者在你的情况下不是因为它为空)。如果你确实想要它异步,那么你需要以图像观察者的形式提供回调。

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

答案 2 :(得分:1)

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

正如getHeight() javadoc所说,你需要提供一个ImageObserver(而不是null),这是在加载图像时调用的。

答案 3 :(得分:1)

Toolkit#createImage(...) 非阻止。一般来说,我宁愿使用javax.imageio.ImageIO来阅读图像。

要等待Toolkit#createImage(...),请使用:

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

之后,您可以致电image.getHeight()

答案 4 :(得分:0)

createImage在后台运行以加载Image。

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