Как я могу получить высоту и ширину изображения? - PullRequest
9 голосов
/ 18 ноября 2011

Почему следующий бит кода возвращает 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) {
    }

Ответы [ 5 ]

15 голосов
/ 18 ноября 2011

Используйте взамен 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://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 голосов
/ 18 ноября 2011

Вы хотите что-то вроде этого:

    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 и уведомит наблюдателя (или не в вашем случае, потому что он нулевой), когда онзагружен.Если вы хотите сделать это асинхронно, тогда вам нужно будет предоставить обратный вызов в виде наблюдателя изображения.

О, и не просто игнорируйте исключения, по крайней мере, напечатайте трассировку стека!

1 голос
/ 18 ноября 2011

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

1 голос
/ 18 ноября 2011

Поскольку изображение загружается асинхронно, в фоновом режиме.

Как сказано в javadoc getHeight(), вам необходимо предоставить ImageObserver (вместо null), который вызывается при загрузке изображения.

0 голосов
/ 18 ноября 2011

createImage запускается в фоновом режиме для загрузки изображения.

используйте MediaTracker, чтобы дождаться загрузки, а затем используйте getHeight (и используйте допустимый ImageObserver для предотвращения ошибок)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...