我使用以下代码获取灰度图像的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'值。那怎么消极呢?
答案 0 :(得分:2)
试试这个
long temp=bb.getPixel(i, j);
R = Color.red(temp);
G = Color.green(temp);
B = Color.blue(temp);
答案 1 :(得分:2)
这是因为所有类型更改,与之关联的转换以及这些类型都已签名的事实。
首先,getPixel()
的初始返回值是int
(32位或4字节,ARGB的一个字节)。在这里放置它似乎是不必要的,因为你只需将它重新放回int
。但到目前为止一切顺利。
当你得到字节数组时,你是正确的,因为ARGB的四个字节是有序的,所以result[1]
应该是红色值。但是,当您在日志语句中隐式地将该字节强制转换为int时,就会出现问题。
由于int
长度为四个字节,且int
和byte
都是有符号类型,因此符号扩展适用于结果,即
因此,当您将结果打印到日志时,它会将数据的十进制值解释为负数。不可否认,即使您没有投射并仅打印byte
的值,该类型仍然是有符号的(即它从-128到127而不是0到255,而0x88表示-120),所以日志输出将是相同的。
如果要注销实际的0-255值,请修改代码以对像素数据进行位掩码以阻止int
中的符号扩展:
int red = (int)(result[1] & 0xFF);
Log.d("gray value is=", String.valueOf(red));