Java将Image转换为BufferedImage

Are*_*ilk 71 java bufferedimage casting image

在StackOverflow上已存在类似此链接的问题,并且接受的答案是"强制转换":

Image image = ImageIO.read(new File(file));
BufferedImage buffered = (BufferedImage) image;
Run Code Online (Sandbox Code Playgroud)

在我的程序中,我尝试:

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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sri*_*ati 105

来自Java游戏引擎:

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

  • @SriHarshaChilakapati`使用Java时不应该担心内存.从Java应用程序的平均内存消耗来看,其他开发人员肯定不会担心内存. (5认同)
  • 如果尚未加载Image,则此方法将不起作用,因为在这种情况下,getWidth(null)或getHeight(null)会返回-1。 (4认同)
  • 我必须使用 `BufferedImage.TYPE_INT_RGB` 而不是 ARGB 来获得正确的缩略图颜色 (3认同)
  • @SriHarshaChilakapati所以垃圾收集器不消耗任何资源?GC只会将您从*代码*周围的内存中保存下来.它没有消除硬件限制. (2认同)

sal*_*ira 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);
Run Code Online (Sandbox Code Playgroud)

这应该没有强制转换.

  • 不要忘记处理创建的图形实例 (2认同)
  • 如何“处理创建的图形界面”? (2认同)
  • 你添加了一个buffered.getGraphics().dispose(); 到代码. (2认同)