负灰阶值 - 位图(Negative grayscale values - Bitmap)

2019-10-17 11:21发布

我使用下面的代码以获取灰度图像的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”值。 那么它是如何负?

Answer 1:

尝试这个

        long temp=bb.getPixel(i, j);
        R = Color.red(temp);
        G = Color.green(temp);
        B = Color.blue(temp);


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


文章来源: Negative grayscale values - Bitmap