2013-10-22 17 views
7

bekommen wollte ich Instanz eines gepufferten Bild skaliert werden, und ich tat:Wie skalierten Instanz eines BufferedImage

public void analyzePosition(BufferedImage img, int x, int y){ 
    img = (BufferedImage) img.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH); 
.... 
} 

aber ich habe eine Ausnahme erhalten:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage 
    at ImagePanel.analyzePosition(ImagePanel.java:43) 

Ich wollte dann Cast to ToolkitImage dann verwenden Sie die Methode getBufferedImage Ich habe darüber in anderen Artikeln gelesen. Das Problem ist, dass es keine Klasse wie sun.awt.image.ToolkitImage gibt, die ich nicht umwandeln kann, weil Eclipse diese Klasse nicht einmal sieht. Ich benutze Java 1.7 und jre1.7.

enter image description here

Antwort

12

Sie können mit dem TookitImage ein neues Bild, eine BufferedImage erstellen.

Image toolkitImage = img.getScaledInstance(getWidth(), getHeight(), 
     Image.SCALE_SMOOTH); 
int width = toolkitImage.getWidth(null); 
int height = toolkitImage.getHeight(null); 

// width and height are of the toolkit image 
BufferedImage newImage = new BufferedImage(width, height, 
     BufferedImage.TYPE_INT_ARGB); 
Graphics g = newImage.getGraphics(); 
g.drawImage(toolkitImage, 0, 0, null); 
g.dispose(); 

// now use your new BufferedImage 
3

BufferedImage#getScaledInstance ist eigentlich aus java.awt.Image geerbt und garantiert nur, dass es wird wieder ein Image so würde ich sagen, es ist keine gute Idee, zu versuchen, den zugrunde liegenden Rückgabetyp in diesem Fall übernehmen.

getScaledInstance ist, auch, normalerweise nicht die schnellste oder beste Qualität Methode

ein BufferedImage selbst, können Sie eine Reihe von verschiedenen Optionen haben zu skalieren, aber die meisten einfach das Original nehmen und es auf ein anderes Bild neu streichen, einige Anwendung Art der Skalierung im Prozess.

Zum Beispiel:

Für weitere Informationen über getScaledInstance, haben eine Lese von The Perils of Image.getScaledInstance()