2012-06-04 58 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