2012-06-04 13 views
16

Kann jemand erklären, wie man ein Array von rgb-Wert von einem BufferedImage bekommt?Get RGB eines BufferedImage

Ich habe ein Graustufenbild in einem BufferedImage und muss ein Array von 0 bis 255 Werten extrahieren, die das Bild beschreiben.
Ich weiß, dass BufferedImage korrekt ist, weil ich es in PNG speichern kann. Wenn ich jedoch int[] dataBuffInt = ((DataBufferInt) heightMap.getDataBuffer()).getData(); verwende, bekomme ich eine Menge großer negativer Zahlen.

Ich habe eine Weile gesucht und einige Hinweise auf die Verschiebung einiger Werte (post) gesehen, aber verstehe nicht wirklich, was sie sagen.

Grundsätzlich möchte ich von einem BufferedImage zu einem Array von 0 bis 255 RBG-Werte gehen.
Ich bin mir nicht sicher, ob ich mich richtig erklärt habe, bitte fragen Sie nach weiteren Details.

Bearbeiten:
@Garbage Danke für den Tipp. Ich versuchte int [] dataBuffInt = heightMap.getRGB (0, 0, heightMap.getWidth(), heightMap.getHeight(), null, 0, heightMap.getWidth()); Aber das gleiche Ergebnis.
@ Greg kopff Das Ergebnis ist 2 und es eingestellt wurde

+0

Was ist das Ergebnis von BufferedImage.getType()? –

+3

Haben Sie versucht, 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 Danke für den Tipp. Ich versuchte int [] dataBuffInt = heightMap.getRGB (0, 0, heightMap.getWidth(), heightMap.getHeight(), null, 0, heightMap.getWidth()); Aber das gleiche Ergebnis. – kotoko

Antwort

26

Sie erhalten negative Zahlen TYPE_INT_ARGB da der int Wert, den Sie von einem der Pixel erhalten werden von Rot, Grün, Blau und Alpha. Sie müssen die Farben aufteilen, um einen Wert für jede Farbkomponente zu erhalten.

Der einfachste Weg, dies zu tun, ist ein Color Objekt zu erstellen und die getRed, getGreen und getBlue (aswell als getAlpha) Methoden verwenden, um die Komponenten zu erhalten:

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 
} 

Ausgänge:

173 
73 
82 
255 
+0

Vielen Dank! Nur um zu überprüfen, um dies für alle Punkte im Bild zu finden, muss ich einige Schleifen machen, gibt es keinen anderen effizienteren Weg, oder? – kotoko

+0

Das Beispiel geändert, um Daten zu verwenden, die von 'int [] getRGB (...)' zurückgegeben werden. Die Daten werden im 'ARGB'-Modus zurückgegeben, so dass Sie die Farbkomponenten selbst extrahieren können, aber hey, immer Profil zuerst, anstatt vorzeitige Optimierungen zu machen. :) – dacwe

+0

Hinzugefügt eine "schnellere" Möglichkeit, das gleiche mit Bitfiddling zu bekommen! :) – dacwe