2013-10-22 32 views
7

volevo ottenere in scala istanza di un'immagine tamponata e ho fatto:Come ottenere esempio in scala di un BufferedImage

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

ma io capisco un'eccezione:

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) 

volevo poi a trasmettere a ToolkitImage quindi utilizzare il metodo getBufferedImage ho letto in altri articoli. Il problema è che non esiste una classe come sun.awt.image.ToolkitImage Non posso eseguire il cast perché Eclipse non vede nemmeno questa classe. Io uso Java 1.7 e jre1.7.

enter image description here

risposta

12

È possibile creare una nuova immagine, un BufferedImage con il TookitImage.

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 è in realtà ereditato da java.awt.Image e garantisce solo che restituisca un Image quindi potrebbe dire che non è una buona idea per cercare di assumere il tipo di ritorno sottostante in questo caso.

getScaledInstance è, anche, normalmente non il metodo più veloce o migliore qualità

Per scalare un BufferedImage stesso, hanno una serie di opzioni diverse, ma la maggior parte semplicemente prendere l'originale e riverniciare ad un'altra immagine, l'applicazione di alcuni tipo di ridimensionamento in corso.

Ad esempio:

Per maggiori dettagli su getScaledInstance, hanno una lettura di The Perils of Image.getScaledInstance()