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

这里的结果 [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为一个字节)。在这里将其放入 long 似乎没有必要,因为您只需将其转换回int. 但到目前为止一切都很好。

当你得到字节数组时,你是正确的,ARGB 的四个字节是按顺序排列的,所以result[1]应该是红色值。但是,当您在日志语句中将该字节隐式转换为 int 时,就会出现问题。

因为int是 4 个字节长,并且intbyte都是有符号类型,所以符号扩展适用于结果,即

  • 字节 0x48 将扩展为 int 为 0x00000048
  • 字节 0x88 将扩展为 int 为 0xFFFFFF88

因此,当您将结果打印到日志时,它会将数据的十进制值解释为负数。诚然,即使您没有强制转换并仅打印 的值byte,该类型仍然是有符号的(即从 -128 到 127 而不是 0 到 255,并且 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 回答