2012-06-04 20 views
16

Czy ktoś może wyjaśnić, jak uzyskać tablicę wartości rgb z BufferedImage?Uzyskaj RGB z BufferedImage

Mam obraz w skali szarości w obrazie BufferedImage i muszę wyodrębnić tablicę od 0 do 255 wartości opisujących obraz.
Wiem, że obraz BufferedImage jest poprawny, ponieważ mogę go zapisać do PNG. Jednak jeśli użyję int[] dataBuffInt = ((DataBufferInt) heightMap.getDataBuffer()).getData();, otrzymam mnóstwo ogromnych liczb ujemnych.

Szukałem przez chwilę i widziałem kilka odniesień do przesuwania niektórych wartości (post), ale tak naprawdę nie rozumiem, co mówią.

Zasadniczo chcę przejść z BufferedImage do tablicy wartości od 0 do 255 RBG.
Nie jestem pewien, czy dobrze się wyjaśniłem, bo trzeba poprosić o więcej szczegółów.

Edycja:
@Garbage Dzięki za cynk. Próbowałem int [] dataBuffInt = heightMap.getRGB (0, 0, heightMap.getWidth(), heightMap.getHeight(), null, 0, heightMap.getWidth()); Ale uzyskaj taki sam wynik.
@Greg Kopff Wynik to 2 i został ustawiony na TYPE_INT_ARGB

+0

Jaki jest wynik BufferedImage.getType()? –

+3

Czy próbowałeś http://docs.oracle.com/javase/6/docs/api/java/awt/image/BufferedImage.html#getRGB%28int,%20int,%20int,%20int,%20int [], % 20int,% 20int% 29 – Garbage

+0

@Garbage Dzięki za cynk. Próbowałem int [] dataBuffInt = heightMap.getRGB (0, 0, heightMap.getWidth(), heightMap.getHeight(), null, 0, heightMap.getWidth()); Ale uzyskaj taki sam wynik. – kotoko

Odpowiedz

26

Otrzymujesz liczby ujemne, ponieważ wartość int, którą otrzymujesz z jednego z pikseli, składa się z czerwonego, zielonego, niebieskiego i alfa. Musisz podzielić kolory, aby uzyskać wartość dla każdego składnika koloru.

Najprostszym sposobem na to jest stworzenie Color obiekt i użyć (aswell jak getAlpha) metod getRed, getGreen i getBlue aby uzyskać składniki:

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 
} 

Wyjścia:

173 
73 
82 
255 
+0

Dziękuję bardzo! Aby to sprawdzić, aby znaleźć wszystkie punkty na obrazku, muszę zrobić kilka pętli, nie ma innej, bardziej wydajnej metody, prawda? – kotoko

+0

Zmieniono przykład użycia danych zwróconych przez 'int [] getRGB (...)'. Dane są zwracane w trybie 'ARGB', więc możesz wyodrębnić składniki koloru samodzielnie, ale hej, zawsze najpierw profiluj zamiast robić przedwczesne optymalizacje. :) – dacwe

+0

Dodano "szybszy" sposób, aby uzyskać to samo za pomocą bitfiddling! :) – dacwe