Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:我得到一个类强制转换异常错误,指向我甚至没有导入的类_Java_Import_Scale_Crop - Fatal编程技术网

Java:我得到一个类强制转换异常错误,指向我甚至没有导入的类

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

我的问题很简单,我有我写的代码,首先缩小图像,然后裁剪到由Constants类获得的所需维度

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;