Es gibt bereits Fragen wie diesen Link zu StackOverflow und die akzeptierte Antwort lautet "Casting":
Image image = ImageIO.read(new File(file));
BufferedImage buffered = (BufferedImage) image;
In meinem Programm versuche ich:
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;
Leider erhalte ich einen Laufzeitfehler:
sun.awt.image.ToolkitImage kann nicht in java.awt.image.BufferedImage umgewandelt werden
Offensichtlich funktioniert das Casting nicht.
Die Frage ist: Was ist (oder gibt es) die richtige Art, ein Bild in BufferedImage zu konvertieren?
java
image
casting
bufferedimage
Arek Wilk
quelle
quelle
ImageIO.read(File)
gibt aBufferedImage
durch seine Signatur zurück. ( Referenz ) Es ist nicht erforderlich, zuerst eineImage
Variable zuzuweisen und dann in Typ umzuwandelnBufferedImage
. Das könnte die Leute verwirren, die Ihren Code lesen.Antworten:
Von einer 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; }
quelle
You shouldn't be worrying about the memory when using Java.
Nach dem durchschnittlichen Speicherverbrauch von Java-Anwendungen zu urteilen, machen sich andere Entwickler definitiv keine Sorgen um den Speicher.Image
noch nicht geladen ist , dagetWidth(null)
odergetHeight(null)
wird wieder-1
in dem FallBufferedImage.TYPE_INT_RGB
anstelle von ARGB verwenden, um die Farben meines Miniaturbilds richtig zu machenEine Möglichkeit, dies zu handhaben, besteht darin, ein neues BufferedImage zu erstellen und dessen Grafikobjekt anzuweisen, Ihr skaliertes Bild in das neue BufferedImage zu zeichnen:
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);
Das sollte den Trick ohne Casting machen.
quelle
Wenn Sie ein zurückbekommen
sun.awt.image.ToolkitImage
, können Sie das Image in dieses umwandeln und dann getBufferedImage () verwenden , um das abzurufenBufferedImage
.Anstelle Ihrer letzten Codezeile, in der Sie das Casting durchführen, würden Sie einfach Folgendes tun:
quelle
sun
Paket zu verwenden. Es ist nicht garantiert, dass sie in Nicht-Oracle-JDKs verfügbar sind. 2) Die MethodegetBufferedImage()
funktioniert nur, wenn das gepufferte Bild intern von generiert wurdeTookitImage
. Meistens (99%) ist dies nicht der Fall, daher ist der Rückgabewertnull
. QuellenangabeWenn Sie Kotlin verwenden, können Sie Image auf dieselbe Weise eine Erweiterungsmethode hinzufügen, wie es Sri Harsha Chilakapati vorschlägt.
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 }
Und benutze es so:
quelle