1

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;
}
}
4

1 に答える 1

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
    }
    

    これはかなり合理的であり、難しいことではありません。公開するか、 getterBufferedImageメソッドを追加すると、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で行ったようにラップすることも同様に機能します。

于 2012-11-02T21:21:04.463 に答える