为什么下面的代码返回高度:-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) {
}
答案 0 :(得分:15)
改为使用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
,并等待它完全加载。
答案 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来防止错误)