扩展BufferedImage类

时间:2012-11-02 21:10:59

标签: java casting bufferedimage extending

我正在扩展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;
}
}

1 个答案:

答案 0 :(得分:2)

您有几个选择:

  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设为公开或添加getter方法,如果需要,可以从中获取实际的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
    }
    

    有些人不喜欢实用类,但我喜欢这样的东西。如果您打算在所有地方使用这些方法,我认为这是一个不错的选择。

  4. 就个人而言,我会去实用程序类路径,但是如果你不喜欢那些,那么像选项2中所做的那样包装就行了。