Android Java Bitmap.getPixels返回仅填充-1作为值的数组

我遇到了问题,我基本上想要分析一个Bitmap来找到位图上不是白色的最低像素。
那是因为我想循环遍历位图的每一行像素。 看代码:

Bitmap bmp = BitmapFactory.decodeFile(fileName); for(int i = 0; i < bmp.getHeight(); i++){ int[] pixels = new int[bmp.getWidth()]; bmp.getPixels(pixels, 0, bmp.getWidth(), 0, i, bmp.getWidth(), 1); //Now when a look at the pixels array at this point all the values are set to -1 everytime } 

fileName有效并且加载了位图,我已经仔细检查了它。 此外,像素不能全部具有相同的颜色,因为当我在图像查看器中查看文件时,它看起来像普通图像。 我真的很厌倦这个问题,我正在寻找几个小时,但没有找到任何有用的东西。

我认为它可能与第三个参数有关,即步幅,我仍然不完全理解该参数的用途。

提前致谢

您也可以使用4字节颜色代码获取颜色值,而不是使用3字节颜色代码,其中最重要的字节用于透明度。 位图中没有透明度,因此可以忽略该字节。 换句话说,你得到黑色的0xFF000000,如果你正在使用int(这是一个有符号的32位,或四个字节,因此前导位为1使其为负),则为-16777216,白色为0xFFFFFFFF,如果你使用int,则为-1。

我已经发现,当一个位图用于android视图时,这在Android中发生。 从相机捕获或图像文件中获取位图时,我的体验并不会发生。

我使用的解决方案是屏蔽透明度字节,因此我的颜色代码都不会被识别为否定:

 int color = pixels[i] & 0x00FFFFFF; 

(无法添加评论。所以把它作为答案)

步幅参数很重要。 它是用于存储一个图像行的字节数。 它可以与宽度相同 – 但可能不是。

当您将其作为字节读取时,您的位图属性很重要。 如果它是24位RGB位图,并且它的宽度为100像素,则需要3 * 100 = 300字节。 所以步幅是300.如果width不是4的倍数,则需要更多的字节才能使其4字节对齐。

因此,检查图像参数并尝试给出正确的步幅值。