1

次のコードを使用して、グレースケール画像のR、G、B値を取得しています(これらはすべて同じになります)が、出力には負の値が表示されます。

なんでそうなの?私は完全に混乱しています。

for (int i=0;i<bb.getWidth();i++){
                            for (int j=0;j<bb.getHeight();j++){
                                    long temp=bb.getPixel(i, j);
                                    int a=(int)temp;
                                    ByteBuffer b = ByteBuffer.allocate(4);
                                    b.putInt(a  );
                                    byte[] result = b.array();                                      
                                    Log.d("gray value is=", String.valueOf((int)result[1]));
                                //  Log.d("gray value is=", String.valueOf(getLastBytes(a)));
                            }
                        }

ここで、result[1]は「R」値に対応する必要があります。それで、それはどのように否定的ですか?

4

2 に答える 2

2

これを試して

        long temp=bb.getPixel(i, j);
        R = Color.red(temp);
        G = Color.green(temp);
        B = Color.blue(temp);
于 2012-12-07T20:22:10.050 に答える
2

これは、すべての型の変更、それに関連するキャスト、およびそれらの型が署名されているという事実によるものです。

まず、の初期戻り値getPixel()int(32ビットまたは4バイト、ARGBの場合は1バイト)です。にキャストバックするだけなので、ここでは長い位置に配置する必要はないようですint。しかし、これまでのところとても良いです。

バイト配列を取得すると、ARGBの4バイトが順番に並んでいるのでresult[1]、赤の値である必要があります。ただし、そのバイトをログステートメントのintに暗黙的にキャストすると、問題が発生します。

intは4バイトの長さであり、両方ともint符号付きタイプであるためbyte、符号拡張が結果に適用されます。

  • バイト0x48は、0x00000048としてintに拡張されます
  • バイト0x88は、0xFFFFFF88としてintに拡張されます

したがって、結果をログに出力すると、データの10進値が負の数であると解釈されます。確かに、の値をキャストせずに出力した場合でもbyte、その型は署名されたままです(つまり、0から255ではなく-128から127になり、0x88は-120を意味します)。したがって、ログ出力は次のようになります。同じ。

実際の0〜255の値をログアウトする場合は、コードを変更してピクセルデータをビットマスクし、int:の符号拡張を無効にします。

int red = (int)(result[1] & 0xFF);
Log.d("gray value is=", String.valueOf(red));
于 2012-12-07T20:24:43.263 に答える