如何在Java中将图片转换为BufferedImage?

4

如何在Java中将Image转换为BufferedImage?

请注意,现有答案显然不正确,因为它使用方法getWidth(null)getHeight(null),如果图像尚未加载,则可以返回-1(按定义,Image是异步对象)。

请提供更正确的答案,或更多证明现有答案已经正确的证据。


你需要创建一个空的BufferedImage来复制像素。因此,你需要原始图像的尺寸。 - Stefan
1
直到原始图像加载完成,我才能知道其尺寸。 - Dims
哦天啊,我试图将两个图像转换为缓冲图像,但我快要发脾气了,因为我不明白为什么一个可以转换而另一个却不行 :) 在修改之前,我必须先加载两个图像并将它们设置为我的JButton的setIcon和setRolloverIcon,这就解决了问题,非常感谢 :) - Georodin
1个回答

4

如果对你很重要,你可以使用 MediaTracker 来等待图片加载完成,这样你就不需要关心提供 ImageObserver 了。

try {
    MediaTracker mt = new MediaTracker(new JPanel());
    Image image = Toolkit.getDefaultToolkit().createImage("...");
    mt.addImage(image, 0);
    System.out.println("Wait for...");
    mt.waitForAll();
    System.out.println("I be loaded");

    BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = bi.createGraphics();
    g2d.drawImage(image, 0, 0, null);
    g2d.dispose();
} catch (InterruptedException ex) {
    ex.printStackTrace();
}

请查看MediaTracker JavaDocs以获取更多详细信息。

我不想添加任何GUI,我只需要下载图像或失败

好的,如果您“需要下载”图像,则可以使用ImageIO.read(URL),请参阅读取/加载图像以获取更多详细信息...然后您将不需要关心ImageMediaTracker,因为ImageIO返回一个BufferedImage

MediaTracker зҡ„жһ„йҖ еҮҪж•°дёӯ Component зҡ„зӣ®зҡ„жҳҜд»Җд№ҲпјҹжҲ‘дёҚжғіж·»еҠ д»»дҪ• GUIпјҢеҸӘйңҖиҰҒдёӢиҪҪеӣҫеғҸжҲ–еӨұиҙҘгҖӮ - Dims
1
Component 充当 MediaTrackerImageObserver。如果您“需要下载”图像,则可以使用 ImageIO.read(URL),请参阅读取/加载图像以获取更多详细信息...然后您就不需要关心 ImageMediaTracker,因为 ImageIO 返回一个 BufferedImage - MadProgrammer
我没有URL,但是有一个以Image实例形式存在的图像。 - Dims
1
然后您需要使用 MediaTracker,创建 Component 不会“启动”任何 UI,它只是用于方便 ImageObserver API 的要求。 - MadProgrammer

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