Java:我得到一个类强制转换异常错误,指向我甚至没有导入的类
我的问题很简单,我有我写的代码,首先缩小图像,然后裁剪到由Constants类获得的所需维度Java:我得到一个类强制转换异常错误,指向我甚至没有导入的类,java,import,scale,crop,Java,Import,Scale,Crop,我的问题很简单,我有我写的代码,首先缩小图像,然后裁剪到由Constants类获得的所需维度 if(image != null){ Image originalImage = image.getImage(); int width = Constants.width; //Algorithm: get the original width and divide with desired width int height = or
if(image != null){
Image originalImage = image.getImage();
int width = Constants.width;
//Algorithm: get the original width and divide with desired width
int height = originalImage.getHeight(null)/(originalImage.getWidth(null)/width);
Image scaledImage = originalImage.getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH);
//Now to crop it to specified dimensions
BufferedImage imageToCrop = (BufferedImage) (java.awt.Image) scaledImage;
height = Constants.height;
imageToCrop = imageToCrop.getSubimage(imageToCrop.getWidth() - width, imageToCrop.getHeight() - height, width, height);
image.setImage(imageToCrop);
}
运行时,这是我得到的错误:
java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage
这对应于一行:
BufferedImage imageToCrop = (BufferedImage) (java.awt.Image) scaledImage;
现在我没有在任何地方导入sun.awt,事实上,下面是该类的导入项列表:
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.swing.ImageIcon;
那么为什么会出现这种错误呢?我就是不明白!正如你所看到的,我甚至尝试了许多手动强制施放的方法,但仍然无效:
非常感谢您的帮助!谢谢 您无法强制转换它,因为在运行时您的ScaleImage具有类型ToolkitImage,它不是BuffereImage的子类。您没有导入它,但它是Image的子类,而不是BuffereImage的子类,因此您无法强制转换到它 要从给定图像创建BuffereImage,必须在BuffereImage的新实例上绘制目标图像。从中检查一些结果 一个例子:
Sun类是实际的实现。您不需要导入它,工具箱需要创建它。我不熟悉库的特定部分,但它似乎不是BuffereImage 还有,为什么这里有两个演员
BufferedImage imageToCrop = (BufferedImage) (java.awt.Image) scaledImage;
没有导入ToolkitImage这一事实并不会改变GetScaleInstance返回的actualy对象是该类的实例这一事实。无论您是否想要它,它都是一个工具套件映像 我认为这里要做的就是使用ToolkitImage和/或找到某种方法将其转换为您想要使用的任何映像实现。GetScaleInstance不保证返回比映像更具体的任何内容。你可能很幸运得到了一个BuffereImage,也可能没有。理论上,我看不到任何东西可以说它不允许返回一个伪映像,它的实现只是扩展您传入的所有维度,并调用底层映像上的方法来完成所有工作
除此之外,您根本不应该真正使用getScaledInstance,因为其他缩放图像的方法更快、更灵活。您可以修改Bozho的代码,但要替换原始图像,并为所需的高度和宽度传递两个额外参数。您可能还想在图形上下文中设置渲染提示。谢谢大家的快速回复,我按照@Bozho在这里说的做了,但不幸的是它给了我java.lang.IllegalArgumentException:Width-1和height-1不能是@Meltured Ice-请看更新的片段,我复制的不正确
BufferedImage imageToCrop = (BufferedImage) (java.awt.Image) scaledImage;