Java: я получаю ошибку исключения класса, указывающую на класс, который я даже не импортировал - PullRequest
2 голосов
/ 27 марта 2011

моя проблема проста, у меня есть код, который я написал, чтобы сначала уменьшить изображение, а затем обрезать его до нужных размеров (полученных классом 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;

Так почему же возникает эта ошибка? Я просто не понимаю! Как вы можете заметить, я даже пробовал много способов ВРУЧНУЮ СИЛУ, но все еще безрезультатно: (

Любая помощь действительно ценится! Спасибо!

Ответы [ 5 ]

5 голосов
/ 27 марта 2011

Вы не импортировали его, но это подкласс 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;
  }
0 голосов
/ 28 марта 2011

getScaledInstance не гарантирует возврата чего-либо более конкретного, чем Image.Возможно, вам повезет и вы получите BufferedImage, а можете и нет.(В теории я не вижу ничего, что говорило бы о том, что нельзя возвращать псевдоизображение, реализация которого просто масштабирует все передаваемые вами измерения и вызывает методы для базового изображения, чтобы выполнить всю работу.)

Кроме того, вы вообще не должны использовать getScaledInstance, поскольку другие способы масштабирования изображения более быстрые и гибкие.Вы можете адаптировать код Божо, но подставив исходное изображение и передавая два дополнительных аргумента для нужной высоты и ширины.(Возможно, вы также хотите установить подсказку рендеринга в графическом контексте.)

0 голосов
/ 27 марта 2011

Тот факт, что вы не импортировали ToolkitImage, не меняет того факта, что объект, возвращаемый getScaledInstance, является экземпляром этого класса. Это ToolkitImage, хотите вы этого или нет.

Я думаю, что здесь нужно просто работать с ToolkitImage и / или найти какой-то способ преобразовать его в любую реализацию Image, с которой вы хотите работать.

0 голосов
/ 27 марта 2011

Класс Sun является фактической реализацией.Вам не нужно импортировать его, инструментарий должен его создать.Я не знаком с внутренностями этой конкретной части библиотеки, но похоже, что это не BufferedImage.

Кроме того, почему у вас здесь два приведения?

BufferedImage imageToCrop = (BufferedImage) (java.awt.Image) scaledImage;
0 голосов
/ 27 марта 2011

Вы не можете разыграть его, потому что во время выполнения ваш scaledImage имеет тип ToolkitImage, который не является подклассом BufferedImage.

...