负灰度值 - 位图

时间:2012-12-07 20:00:49

标签: android bitmap grayscale

我使用以下代码获取灰度图像的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'值。那怎么消极呢?

2 个答案:

答案 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长度为四个字节,且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));