【问题标题】:How can I get height and width of an image?如何获取图像的高度和宽度?
【发布时间】:2011-11-18 14:33:21
【问题描述】:

为什么下面的代码会返回 Height: -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) {
    }

【问题讨论】:

标签: java image asynchronous


【解决方案1】:

请改用ImageIO.read(URL)ImageIO.read(File)。加载时会阻塞,返回后就知道图片的宽高了。

例如

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 异步加载的图像中,然后等待它完全加载。

【讨论】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-31
            • 2010-11-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-23
            • 2011-11-26
            • 1970-01-01
            相关资源
            最近更新 更多