java中的二值位图,白色为1,黑色为0?

Posted

技术标签:

【中文标题】java中的二值位图,白色为1,黑色为0?【英文标题】:two-value bitmap,white is 1,black is 0 in java? 【发布时间】:2012-01-25 19:29:37 【问题描述】:

我使用PixelGrabber 类来获得一个二值位图的像素数组。但是出现了一个问题,一个二值图像(白色或黑色),我将位图的这些像素存储在一个 int 数组中,数组的这些元素不应该是 1(白色)或 0(黑色),而是在我的我发现白色是-1,黑色是-16777216的代码。有人知道为什么吗?

现在我只想简单地使用 for 循环将 -1 和 -16777216 更改为 1 和 0。

【问题讨论】:

【参考方案1】:

我假设您正在使用 PixelGrabber(ImageProducer ip, int x, int y, int w, int h, int[] pix, int off, int scansize) 构造函数,在这种情况下,您得到的是每个像素的 RGB 值的整数数组。

因为它会以 RGB 值的形式返回 - 您需要将这些值分离出来才能获得真正的 RGB 值。例如 RGB(255,255,255) 是白色,RGB(0,0,0) 是黑色。 API Reference 给出了如何正确执行此操作的一个很好的示例。使用您问题中的-16777216 数字,我进行了一个简单的测试,结果表明它实际上是黑色的:

public class Main 

    public static void main(String[] args) 
        int pixel = -16777216;

        int alpha = (pixel >> 24) & 0xff;
        int red   = (pixel >> 16) & 0xff;
        int green = (pixel >>  8) & 0xff;
        int blue  = (pixel      ) & 0xff;

        System.out.println(alpha);
        System.out.println(red);
        System.out.println(green);
        System.out.println(blue);


    

打印出来:255、0、0、0

按照上面链接的 API 参考,了解如何正确处理像素数据的示例代码。

【讨论】:

嗨,太好了,我现在知道了。谢谢。我确实使用了构造函数 PixelGrabber(ImageProducer ip, int x, int y, int w, int h, int[] pix, int off, int scansize)。我现在知道我错在哪里了。我认为 int 数组以位图格式存储 RGB 调色板的索引,好吧,这是错误的,即使图像是二值图像,如果我得到,int 数组也直接存储 RGB 数据像素通过类PixelGrabber.oh,所以如果我使用类Image来获取图片,无论它是什么格式,它将是一个“java图像对象”,无论持有底部图片格式 - 文件头,信息头,RGB调色板,图像数据?

以上是关于java中的二值位图,白色为1,黑色为0?的主要内容,如果未能解决你的问题,请参考以下文章

图像中颜色的二值化

图像细化函数(背景为黑色像素值为0,前景为白色像素值255,必须只含有0和255的像素值,即二值化后的图像)

解释一下啥是二值化?

Python使用openCV把原始彩色图像转化为灰度图使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本)基于自适应阈值预处理(adaptive thresholding)方法

python图像处理(二值化)

python图像处理(二值化)