获取BufferedImage的RGB

19
有人能解释如何从 BufferedImage 中获取 RGB 值的数组吗?
我有一个灰度图像在 BufferedImage 中,需要提取描述图像的0到255值的数组。
我知道 BufferedImage 正确,因为我可以将其保存为 PNG。但是,如果我使用 int[] dataBuffInt = ((DataBufferInt) heightMap.getDataBuffer()).getData();,我会得到一堆巨大的负数。
我已经搜索了一段时间并看到了一些关于移动某些值的参考(post),但不太理解他们在说什么。
基本上,我想要从 BufferedImage 转换为0到255的 RGB 值数组。
如果需要更多细节,请问清楚明白。
编辑:
@Garbage 感谢提示。我尝试了 int[] dataBuffInt = heightMap.getRGB(0, 0, heightMap.getWidth(), heightMap.getHeight(), null, 0, heightMap.getWidth()); 但是得到相同的结果。
@Greg Kopff 结果为2,并且已设置为 TYPE_INT_ARGB。

BufferedImage.getType() 的结果是什么? - Greg Kopff
3
你试过访问http://docs.oracle.com/javase/6/docs/api/java/awt/image/BufferedImage.html#getRGB%28int,%20int,%20int,%20int,%20int[],%20int,%20int%29吗? - Garbage
@Garbage 感谢你的提示。我尝试了 int[] dataBuffInt = heightMap.getRGB(0, 0, heightMap.getWidth(), heightMap.getHeight(), null, 0, heightMap.getWidth()); 但是得到了相同的结果。 - kotoko
1个回答

30

由于一个像素的int值是由红、绿、蓝和alpha组成的,因此您会得到负数。您需要拆分颜色以获取每个颜色组件的值。

最简单的方法是创建一个Color对象,并使用getRedgetGreengetBlue(以及getAlpha)方法来获取每个颜色组件:

public static void main(String... args) throws Exception {

    BufferedImage image = ImageIO.read(
         new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));

    int w = image.getWidth();
    int h = image.getHeight();

    int[] dataBuffInt = image.getRGB(0, 0, w, h, null, 0, w); 

    Color c = new Color(dataBuffInt[100]);

    System.out.println(c.getRed());   // = (dataBuffInt[100] >> 16) & 0xFF
    System.out.println(c.getGreen()); // = (dataBuffInt[100] >> 8)  & 0xFF
    System.out.println(c.getBlue());  // = (dataBuffInt[100] >> 0)  & 0xFF
    System.out.println(c.getAlpha()); // = (dataBuffInt[100] >> 24) & 0xFF
}

输出:

173
73
82
255

非常感谢!只是想确认一下,要找到图像中所有点的话,我需要做一些循环,没有其他更有效的方法,对吗? - kotoko
将示例更改为使用由 int [] getRGB(...)返回的数据。该数据以ARGB模式返回,因此您可以自行提取颜色组件,但是,请先进行分析而不是进行过早优化。 :) - dacwe
添加了一种使用位操作更快的方法来获取相同的结果! :) - dacwe
大家好,上面代码中获取的图像的平均RGB值是多少?@kotoko - Ashish Augustine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接