【问题标题】:Negative grayscale values - Bitmap负灰度值 - 位图
【发布时间】:2023-04-02 03:53:01
【问题描述】:

我正在使用以下代码来获取灰度图像的 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'值。那么它是如何消极的呢?

【问题讨论】:

  • 检查结果变量的大小,灰度没有RGB,它只有二维
  • @Nadosh 这有什么帮助?
  • @Nadosh 你误解了......在android中的灰度存储方面,有8个字段......灰度图像在存储方面具有相等的R,G,B字节。例如。 temp 的值类似于 133585214
  • 灰度是二维的,你不能得到 r,g,b ;还要检查 'a' 本身的值
  • @Nadosh 你请阅读它。 a 的值非常大,相当于十六进制值的十进制表示。

标签: android bitmap grayscale


【解决方案1】:

试试这个

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

【讨论】:

  • 谢谢!!这就是这么简单:)
【解决方案2】:

这是因为所有类型更改、与之相关的强制转换以及这些类型已签名的事实。

首先getPixel()的初始返回值为int(32位或4字节,ARGB为1字节)。在这里将其放入 long 似乎是不必要的,因为您只需将其转换回 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2023-03-31
    • 2013-01-13
    • 2016-06-27
    • 2015-08-11
    • 2014-07-21
    • 1970-01-01
    相关资源
    最近更新 更多