我想获得缓存图像的缩放实例,我做了:
public void analyzePosition(BufferedImage img, int x, int y){
img = (BufferedImage) img.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH);
....
}
但我确实得到了一个例外:
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)
我希望转换为ToolkitImage
,然后使用我在其他文章中读到的方法getBufferedImage
。问题是没有像sun.awt.image.ToolkitImage
这样的类我无法强制转换它,因为Eclipse甚至没有看到这个类。我使用Java 1.7
和jre1.7
。
答案 0 :(得分:13)
您可以使用TookitImage创建一个新图像,一个BufferedImage。
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
答案 1 :(得分:4)
BufferedImage#getScaledInstance
实际上是从java.awt.Image
继承的,并且只保证它会返回Image
所以我想说在这种情况下尝试假设基础返回类型不是一个好主意
getScaledInstance
通常也不是最快或质量最好的方法
要缩放BufferedImage
本身,您有许多不同的选项,但大部分只是将原始图像重新绘制到另一个图像,并在处理过程中应用某种缩放。
例如:
有关getScaledInstance
的详细信息,请阅读The Perils of Image.getScaledInstance()