write imageio java image casting bufferedimage

imageio - bufferedimage to image in java



Imagen de conversión de Java a BufferedImage (4)

Ya hay una pregunta como este link en StackOverflow y la respuesta aceptada es "casting":

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

En mi programa, intento:

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;

Desafortunadamente recibo un error de tiempo de ejecución:

sun.awt.image.ToolkitImage no se puede convertir en java.awt.image.BufferedImage

Obviamente, el casting no funciona.
La pregunta es: ¿Cuál es (o existe) la forma correcta de convertir Image to BufferedImage?


Desde un 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; }


Si está obteniendo un sun.awt.image.ToolkitImage , puede convertir la imagen en eso, y luego usar getBufferedImage() para obtener la BufferedImage .

Entonces, en lugar de tu última línea de código donde estás lanzando, simplemente harías:

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


Si usa Kotlin, puede agregar un método de extensión a la Imagen de la misma manera que sugiere Sri Harsha Chilakapati.

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 }

Y úsalo así:

myImage.toBufferedImage()


Una forma de manejar esto es crear una nueva Imagen Buffered, y decirle a su objeto de gráficos que dibuje su imagen escalada en la nueva Imagen Buffered:

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

Eso debería hacer el truco sin lanzar.