2012-06-04 61 views
16

任何人都可以解释如何从BufferedImage获取rgb值的数组吗?获取BufferedImage的RGB

我在BufferedImage中有一个灰度图像,需要提取一个描述图像的0到255值的数组。
我知道BufferedImage是正确的,因为我可以将它保存到PNG。但是,如果我使用int[] dataBuffInt = ((DataBufferInt) heightMap.getDataBuffer()).getData();,我会得到一堆巨大的负数。

我已经搜索了一段时间,看到一些提及转移一些值(post),但不真正明白他们在说什么。

基本上我想从一个BufferedImage去一个0到255个RBG值的数组。
我不确定我是否正确解释自己,plaese询问更多细节是需要的。

编辑:
@Garbage谢谢你的提示。我试过int [] dataBuffInt = heightMap.getRGB(0,0,heightMap.getWidth(),heightMap.getHeight(),null,0,heightMap.getWidth());但获得相同的结果。
@格雷格Kopff结果为2,它被设置为TYPE_INT_ARGB

+0

BufferedImage.getType()的结果是什么? –

+3

您是否尝试过http://docs.oracle.com/javase/6/docs/api/java/awt/image/BufferedImage.html#getRGB%28int,%20int,%20int,%20int,%20int [], %20int,%20int%29 – Garbage

+0

@垃圾感谢您的提示。我试过int [] dataBuffInt = heightMap.getRGB(0,0,heightMap.getWidth(),heightMap.getHeight(),null,0,heightMap.getWidth());但获得相同的结果。 – kotoko

回答

26

你得到负数,因为你从像素之一获得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 
+0

非常感谢!为了检查,为了找到图像中的所有点,我必须做一些循环,没有其他更有效的方法,对吧? – kotoko

+0

更改了示例以使用'int [] getRGB(...)''返回的数据。数据以“ARGB”模式返回,因此您可以自行提取颜色分量,但是嘿,总是首先进行分析,而不是进行过早的优化。 :) – dacwe

+0

增加了一个“更快”的方式来使用bitfiddling来获得相同的东西! :) – dacwe