2013-10-22 24 views
7

chciałem uzyskać skalowane instancji buforowanego obrazu i zrobiłem:Jak zdobyć powiększonym formacie wystąpienie BufferedImage

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

ale dostaniesz wyjątek:

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) 

chciałem potem odrzuć do ToolkitImage, a następnie użyj metody getBufferedImage o której czytam w innych artykułach. Problem polega na tym, że nie ma klasy takiej jak sun.awt.image.ToolkitImage Nie mogę przesłać do niej, ponieważ Eclipse nie widzi nawet tej klasy. Używam Java 1.7 i jre1.7.

enter image description here

Odpowiedz

12

Można utworzyć nowy obraz, BufferedImage z 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 jest rzeczywiście odziedziczony java.awt.Image i tylko gwarantuje, że będzie zwracać Image więc chciałbym powiedzieć, że to nie jest dobry pomysł, aby spróbować przejąć podstawowej typ zwracany w tej sprawie.

getScaledInstance jest również, nie normalnie najszybciej lub najlepiej metoda jakość

do skalowania sama BufferedImage, masz wiele różnych opcji, ale większość po prostu wziąć oryginału i przemalować go do innego obrazu, stosowania niektórych rodzaj skalowania w procesie.

Na przykład:

Więcej informacji na temat getScaledInstance, mają lektury The Perils of Image.getScaledInstance()