Java将Image转换为BufferedImage

时间:2012-11-28 12:37:50

标签: java image casting bufferedimage

在StackOverflow上已经存在类似link的问题,并且接受的答案是“强制转换”:

Image image = ImageIO.read(new File(file));
BufferedImage buffered = (BufferedImage) image;

在我的程序中,我尝试:

final float FACTOR  = 4f;
BufferedImage img = ImageIO.read(new File("graphic.png"));
int scaleX = (int) (img.getWidth() * FACTOR);
int scaleY = (int) (img.getHeight() * FACTOR);
Image image = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH);
BufferedImage buffered = (BufferedImage) image;

不幸的是我得到了运行时错误:

  

sun.awt.image.ToolkitImage无法强制转换为java.awt.image.BufferedImage

显然,施法不起作用 问题是:将Image转换为BufferedImage的正确方法是什么(或有没有)?

4 个答案:

答案 0 :(得分:95)

来自Java Game Engine

/**
 * Converts a given Image into a BufferedImage
 *
 * @param img The Image to be converted
 * @return The converted BufferedImage
 */
public static BufferedImage toBufferedImage(Image img)
{
    if (img instanceof BufferedImage)
    {
        return (BufferedImage) img;
    }

    // Create a buffered image with transparency
    BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);

    // Draw the image on to the buffered image
    Graphics2D bGr = bimage.createGraphics();
    bGr.drawImage(img, 0, 0, null);
    bGr.dispose();

    // Return the buffered image
    return bimage;
}

答案 1 :(得分:20)

处理此问题的一种方法是创建一个新的BufferedImage,并告诉它的图形对象将缩放的图像绘制到新的BufferedImage中:

final float FACTOR  = 4f;
BufferedImage img = ImageIO.read(new File("graphic.png"));
int scaleX = (int) (img.getWidth() * FACTOR);
int scaleY = (int) (img.getHeight() * FACTOR);
Image image = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH);
BufferedImage buffered = new BufferedImage(scaleX, scaleY, TYPE);
buffered.getGraphics().drawImage(image, 0, 0 , null);

这应该在没有施法的情况下完成。

答案 2 :(得分:4)

如果您要返回sun.awt.image.ToolkitImage,则可以将图像转换为该图像,然后使用getBufferedImage()获取BufferedImage

因此,您可以执行以下操作而不是最后一行代码:

BufferedImage buffered = ((ToolkitImage) image).getBufferedImage();

答案 3 :(得分:2)

如果您使用Kotlin,您可以像Sri Harsha Chilakapati所建议的那样为Image添加扩展方法。

fun Image.toBufferedImage(): BufferedImage {
    if (this is BufferedImage) {
        return this
    }
    val bufferedImage = BufferedImage(this.getWidth(null), this.getHeight(null), BufferedImage.TYPE_INT_ARGB)

    val graphics2D = bufferedImage.createGraphics()
    graphics2D.drawImage(this, 0, 0, null)
    graphics2D.dispose()

    return bufferedImage
}

并像这样使用它:

myImage.toBufferedImage()