Расширение класса BufferedImage

Я расширяю класс BufferedImage, чтобы добавить некоторые методы, такие как getRed, getBlue, getGreen для получения цвета пикселя. Проблема в том, что мое исходное изображение является объектом BufferedImage, а не моим расширенным объектом. Когда я пытаюсь привести к расширенному типу данных, он не работает. Извините за мой английский

я получаю эту ошибку

Exception in thread "main" java.lang.ClassCastException: java.awt.image.BufferedImage cannot be cast to asciiart.EBufferedImage

Код, в котором я пытаюсь выполнить литье из родительского класса

EBufferedImage character = (EBufferedImage)ImageClass.charToImage(letter, this.matrix_x, this.matrix_y);

Мой расширенный класс

public class EBufferedImage extends BufferedImage 
{
public EBufferedImage(int width, int height, int imageType)
{
    super(width,height,imageType); 
}

/**
* Returns the red component in the range 0-255 in the default sRGB
* space.
* @return the red component.
*/
public int getRed(int x, int y) {
    return (getRGB(x, y) >> 16) & 0xFF;
}

/**
* Returns the green component in the range 0-255 in the default sRGB
* space.
* @return the green component.
*/
public int getGreen(int x, int y) {
    return (getRGB(x, y) >> 8) & 0xFF;
}

/**
* Returns the blue component in the range 0-255 in the default sRGB
* space.
* @return the blue component.
*/
public int getBlue(int x, int y) {
    return (getRGB(x, y) >> 0) & 0xFF;
}
}

person zdarsky.peter    schedule 02.11.2012    source источник
comment
Вы не можете просто привести объект к типу, которым он не является. Это никогда не сработает. Почему бы вместо этого не дать вашему классу конструктор, который принимает объект BufferedImage и не создает экземпляр вашего объекта на основе переданного в него BufferedImage?   -  person Hovercraft Full Of Eels    schedule 03.11.2012


Ответы (1)


У вас есть несколько вариантов:

  1. Добавьте конструктор в расширенный класс, который принимает BufferedImage и устанавливает все соответствующим образом.

    public class ExtendedBufferedImage extends BufferedImage{
    
      public ExtendedBufferedImage(BufferedImage image){
          //set all the values here
      }
    
      //add your methods below
    }
    

    Это похоже на много работы и потенциальных проблем. Если вы забудете установить какую-либо переменную, вы можете ввести некоторые странные ошибки или потерять нужную информацию.

  2. Создайте класс-оболочку с экземпляром BufferedImage, а затем добавьте в него свои методы.

    public class ExtendedBufferedImage{
      private BufferedImage image;  
    
      public ExtendedBufferedImage(BufferedImage image){
         this.image = image;
      }
    
      //add your methods below
    }
    

    Это довольно разумно и не сложно. Сделайте BufferedImage общедоступным или добавьте метод получения, и вы сможете получить из него фактический BufferedImage, если вам это нужно.

  3. Создайте класс Utility, в котором ваши методы являются статическими, и передайте BufferedImage в качестве параметра.

    public class BufferedImageUtil{
    
      public static int getRed(BufferedImage image, int x, int y) {
        return (image.getRGB(x, y) >> 16) & 0xFF;
      }
    
      //add your other methods
    }
    

    Некоторым людям не нравятся служебные классы, но мне они нравятся за такие вещи. Если вы собираетесь использовать эти методы повсеместно, я думаю, что это хороший вариант.

Лично я бы пошел по маршруту служебного класса, но если они вам не нравятся, то обертывание, как это сделано в варианте 2, так же функционально.

person Jacob Schoen    schedule 02.11.2012
comment
Ты прав. Я буду использовать второе решение. В первом решении было бы сложно правильно настроить все параметры. Спасибо - person zdarsky.peter; 03.11.2012