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

12
为什么下面的代码返回高度为-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) {
    }

可能是重复的问题,取决于是否需要使用AWT Image类。参考https://dev59.com/gnRB5IYBdhLWcg3wSVYI。 - Ed Staub
1
@berry120 - 我本来想说Java不想长时间查看图像是问题的原因... - Brian Roach
5个回答

17

使用ImageIO.read(URL)ImageIO.read(File)代替。它会在加载时阻塞,并且图像的宽度和高度将在返回后得知。

例如:

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://istack.dev59.com/7bI1Y.webp");
        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异步加载的图像中,并等待它完全加载。


3
你想要的是这样的东西:
    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并通知观察者(如果有的话,否则返回null)。如果您确实希望异步处理,则需要提供一个形式为图像观察者的回调函数。
另外,请不要忽略异常,至少打印出堆栈跟踪信息!

1

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

正如 getHeight() javadoc 所说,你需要提供一个 ImageObserver(而不是 null),当图像加载完成时会调用它。


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


0

createImage 在后台运行以加载图像。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接