Ya hay una pregunta como este enlace 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, aparece 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 una imagen en una imagen con búfer?
java
image
casting
bufferedimage
Arek Wilk
fuente
fuente
ImageIO.read(File)
devuelve aBufferedImage
por su firma. ( Referencia ) No es necesario asignar primero a unaImage
variable y luego convertir para escribirBufferedImage
. Eso podría confundir a la gente que lee su código.Respuestas:
Desde un motor de juegos 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; }
fuente
You shouldn't be worrying about the memory when using Java.
A juzgar por el consumo medio de memoria de las aplicaciones Java, otros desarrolladores definitivamente no se preocupan un poco por la memoria.Image
aún no está cargado, ya quegetWidth(null)
ogetHeight(null)
volverá-1
en el estucheBufferedImage.TYPE_INT_RGB
lugar de ARGB para obtener los colores de mi miniatura correctosUna forma de manejar esto es crear una nueva BufferedImage y decirle a su objeto gráfico que dibuje su imagen escalada en la nueva 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);
Eso debería funcionar sin lanzar.
fuente
Si está recuperando un
sun.awt.image.ToolkitImage
, puede convertir la imagen a eso y luego usar getBufferedImage () para obtener elBufferedImage
.Entonces, en lugar de su última línea de código donde está transmitiendo, simplemente haría:
fuente
sun
paquete. No se garantiza que estén disponibles en JDK que no sean de Oracle. 2) El métodogetBufferedImage()
solo funciona si la imagen almacenada en búfer ha sido generada internamente porTookitImage
. La mayoría de las veces (99%) no lo es, por lo que el valor de retorno esnull
. Fuente de referenciaSi 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 utilícelo así:
fuente