12 Stimmen

Wie kann ich Höhe und Breite eines Bildes ermitteln?

Warum gibt das folgende Codestück Höhe: -1 zurück, was bedeutet, dass die Höhe noch nicht bekannt ist. Wie kann man die Höhe des Bildes ermitteln?

 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) {
    }

17voto

Andrew Thompson Punkte 166383

Utilisez ImageIO.read(URL) o ImageIO.read(File) stattdessen. Es wird während des Ladens blockiert, und die Bildbreite und -höhe sind nach der Rückkehr bekannt.

Z.B.

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);
            }
        });
    }
}

Alternativ können Sie auch eine MediaTracker auf das Bild, das asynchron von der Anwendung Toolkit und warten Sie, bis sie vollständig geladen ist.

3voto

Michael Berry Punkte 66127

Sie wollen so etwas wie das hier:

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

En java.awt.Toolkit Ansatz wird nicht blockieren, so wird -1 zurückgeben und den Beobachter benachrichtigen (oder nicht in Ihrem Fall, weil es null ist), wenn es geladen wird. Wenn Sie es asynchron wollen, dann müssen Sie einen Callback in Form eines Bildes Beobachter bieten.

Oh, und ignorieren Sie Ausnahmen nicht einfach, sondern geben Sie zumindest den Stack-Trace aus!

1voto

Joonas Pulakka Punkte 35583

Denn das Bild wird asynchron, also im Hintergrund, geladen.

Da die getHeight() javadoc sagt, müssen Sie eine ImageObserver (anstelle von null ), die aufgerufen wird, wenn das Bild geladen wurde.

1voto

Ingo Kegel Punkte 44582

Toolkit#createImage(...) es nicht-blockierend . Im Allgemeinen würde ich lieber Folgendes verwenden javax.imageio.ImageIO um Bilder zu lesen.

Das Warten auf die Toolkit#createImage(...) verwenden:

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

Danach können Sie image.getHeight()

0voto

Hachi Punkte 3197

CreateImage wird im Hintergrund ausgeführt, um das Bild zu laden.

einen MediaTracker verwenden, um auf das Laden zu warten, und dann getHeight verwenden (und einen gültigen ImageObserver verwenden, um Fehler zu vermeiden)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X