0

MyImage(BufferedImageを拡張)の平均赤RGB値を見つけたい。画像内の各ピクセルの赤の値を配列 red[] に保存します。最後に、これらの ut を合計して、赤の平均値を見つけたいと思います。しかし、このコードを MyImage で実行すると、0 しか出力されません。このメソッドを正しく動作させるにはどうすればよいですか? (ここに含まれていないコードは問題なく動作します)

public class MyImage extends BufferedImage {

    public MyImage(int width, int height, int imageType) {
        super(width, height, imageType);
    }

    public void findAverageRedValue(){

        int height = this.getHeight();
        int width = this.getWidth();
        int[] red = new int[height*width];

        Map m = new HashMap();
        for(int i=0; i < width ; i++)
        {
            for(int j=0; j < height ; j++)
            {
                ColorModel colorModel = this.getColorModel();
                int rCol = colorModel.getRed(j*i);
                red[red.length - 1] = rCol;
            }               
        }

        int sum = 0;
        for(int i = 0; i < red.length; i++)
            sum += red[i];

        int averageRed = sum/red.length;
        System.out.println(averageRed);
    }        
}
4

1 に答える 1

1

配列の要素を次のように割り当てています。

red[red.length - 1] = rCol;

これにより、考えられるすべての状況で、配列の最後の要素のみが割り当てられます。配列の長さプロパティはsize()、コレクションのものとは異なります。これは、配列の初期化された次元に基づく静的な値です。

したがって、配列エントリの 1 つを除くすべてがゼロになります。したがって、最終的に はsum0 から 255 の間になり、(おそらく) より大きな数で割ると、これはゼロになります。(整数除算を行っているという点で問題が発生する可能性がありますが、これはおそらく重要ではありません)。

これを修正するには、割り当てる配列インデックスを変更する必要があります。配列インデックス用に別のカウンターを保持するか、既存のiandjを利用して次のことを行うことができます。

red[i * width + j] = rCol;

いずれにせよ、これにより、各ピクセルの赤成分が個別の配列の場所に配置されるため、それらを正しく合計できます。

整数除算は Java の潜在的な落とし穴であり、それが最後にここで行っていることです。を介して部分平均を取得する方が良い場合がありますsum / (float)red.lengthが、何が起こっているかを知っていて、最も近い整数に切り捨てても構わない限り、これは必要ないかもしれません。

于 2013-01-30T10:39:52.157 に答える