当前位置: 首页 > 知识库问答 >
问题:

负灰度值-位图

曹骞仕
2023-03-14

我使用以下代码来获取灰度图像的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个答案

岳良策
2023-03-14

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

首先,getPixel() 的初始返回值是一个 int(32 位或 4 个字节,ARGB 为一个字节)。在这里,将其放入长线似乎没有必要,因为您只是将其转换回int。但到目前为止,一切顺利。

当您获得字节数组时,您正确地认为ARGB的四个字节是按顺序排列的,因此结果[1]应该是Red值。但是,当您将该字节隐式转换为log语句中的int时,会出现问题。

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

    < li >字节0x48将作为0x00000048扩展到int中 < li >字节0x88将作为0xFFFFFF88扩展到int中

因此,当您将结果打印到日志时,它会将数据的十进制值解释为负数。诚然,即使您没有强制转换并只是打印了<code>byte</code>的值,该类型仍然是有符号的(即,它从-128变为127,而不是0变为255,0x88表示-120),因此日志输出将是相同的。

如果要注销实际的0-255值,请修改代码,对像素数据进行位屏蔽,以消除< code>int中的符号扩展:

int red = (int)(result[1] & 0xFF);
Log.d("gray value is=", String.valueOf(red));
郭子航
2023-03-14

试试这个

        long temp=bb.getPixel(i, j);
        R = Color.red(temp);
        G = Color.green(temp);
        B = Color.blue(temp);
 类似资料:
  • 我是第一次使用openCV。我正在使用openCV3和XCode对其进行编码。我想创建一个16位的灰度图像,但我想我有的数据是这样定义的,4000是像素值为白色和0为黑色。我在int类型的数组中有这些像素的信息。如何创建Mat并将数组中的值分配给Mat?

  • 大家好,我有问题在灰度bmp图像转换成整数2D数组(值0-255)在Java。 我有一个pmb图像,可以被看作一个整数(0-255)2D数组,我想在Java数据结构中看到这个2D数组 我试着这样做: 然后使用我的BufferedImage我创建int[][]这样: 但是现在所有的2D数组都充满了像“-9211021”或类似的数字。 我认为问题在getRGB(j,k)中,但我不知道是否有可能解决它。

  • 我是opencv4android的新手,试图加载16位深度的灰度png图像。 我试过: 但是png被读取为8bit,值在[0,255]中。我尝试了CV_LOAD_IMAGE_ANYDEPTH标志,但还是一样。我试图创建一个alpha通道或将图像作为原始图像加载,但没有成功。 我还尝试在设备上复制图像,并使用imread读取,如下所示,希望imread能够加载16位通道: 当我检查它确实存在。返回的

  • 对于灰度发布,这里主要讲解如何实现,我所在的公司虽然使用这个逻辑实现的. 但是由于掺杂了太多业务相关东西,比如抓包,限流,缓存,校验,sso,云化,监控告警,成为了一个运维平台. 造成无法开源,真是好可惜.做这个系统多年还是想让大家来找找茬刷刷存在感的 我想当前没有一个开源的可能也和这个原因有关,太多功能和业务相关难以抽离成纯粹组件开源. 下面先讲主要逻辑结构,请看下图 这里需要讲解下这里面几个名

  • 我正在尝试转换一个。使用BuffereImage将包含灰度值的csv文件转换为图像。csv最初被读入,其中所有值都是双倍的。 我正在尝试使用BufferedImage使用代码创建100x100px输出图像 但我只有一个100x100的黑色方块作为输出。 我尝试了以及outout的png格式,但没有成功,也找不到导致此错误的原因。

  • 灰度升级简介 灰度升级功能支持产品的平滑发布,让一部分用户使用旧产品,一部分用户使用新产品,逐步扩大新产品用户范围,最后全部迁移到新产品上来。保证整体系统的稳定。 灰度升级使用场景举例 假设有一个旧应用为客户提供服务,在应用引擎中部署为应用A,公司准备上线一个新版本,可以在应用引擎中部署为应用B(两者必须在同一个space下)。 点击进入应用B的详情页面,点击左上角的灰度升级,选择应用A,点击完成