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

Mol*_*Ice 2 java import crop scale

我的问题很简单,我有我编写的代码,首先缩小图像然后裁剪到所需的尺寸(由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);
    }
Run Code Online (Sandbox Code Playgroud)

运行时,这是我得到的错误:

java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage
Run Code Online (Sandbox Code Playgroud)

这对应于这一行:

BufferedImage imageToCrop = (BufferedImage) (java.awt.Image) scaledImage;
Run Code Online (Sandbox Code Playgroud)

现在我没有在任何地方导入sun.awt,实际上这里是这个类的导入项目列表:

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.swing.ImageIcon;
Run Code Online (Sandbox Code Playgroud)

那么为什么会出现这种错误呢?我只是不明白!正如你所看到的,我甚至尝试了许多方法来手动逼迫CAST,但仍无济于事:(

任何帮助真的很感激!谢谢!

Boz*_*zho 5

你没有导入它,但它是它的子类Image,而不是它的子类BufferedImage,所以你不能强制转换它.

要从BufferedImage给定创建一个Image,您必须在新的实例上绘制目标图像BufferedImage.检查此搜索的一些结果

来自dzone的一个例子:

  public BufferedImage bufferImage(Image image, int type) {
    BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
    Graphics2D g = bufferedImage.createGraphics();
    g.drawImage(image, null, null);
    waitForImage(bufferedImage);
    return bufferedImage;
  }
Run Code Online (Sandbox Code Playgroud)