2012-06-04 19 views
16

¿Alguien puede explicar cómo obtener una matriz de valor rgb de una imagen almacenada?Obtener RGB de una imagen almacenada

Tengo una imagen de escala de grises en una Imagen Buffered y necesito extraer una matriz de 0 a 255 valores que describen la imagen.
Sé que la Imagen Buffered es correcta porque puedo guardarla en PNG. Sin embargo, si uso int[] dataBuffInt = ((DataBufferInt) heightMap.getDataBuffer()).getData(); obtengo un montón de números negativos.

He buscado por un tiempo y he visto algunas referencias al cambio de algunos valores (post) pero realmente no entiendo lo que dicen.

Básicamente quiero pasar de una Imagen Buffered a una matriz de 0 a 255 valores RBG.
No estoy seguro de haberme explicado correctamente, plaese preguntar si se necesitan más detalles.

Edit:
@Garbage Gracias por la propina. Intenté int [] dataBuffInt = heightMap.getRGB (0, 0, heightMap.getWidth(), heightMap.getHeight(), null, 0, heightMap.getWidth()); Pero consigue el mismo resultado.
@ Greg Kopff El resultado es 2 y se establece en TYPE_INT_ARGB

+0

¿Cuál es el resultado de BufferedImage.getType()? –

+3

Probaste 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 Gracias por la sugerencia. Intenté int [] dataBuffInt = heightMap.getRGB (0, 0, heightMap.getWidth(), heightMap.getHeight(), null, 0, heightMap.getWidth()); Pero consigue el mismo resultado. – kotoko

Respuesta

26

Usted obtener números negativos ya que el valor int que se obtiene de uno de los píxeles están compuestos por el rojo, verde, azul y alfa. Necesita dividir los colores para obtener un valor para cada componente de color.

La forma más sencilla de hacer esto es crear un objeto Color y utilizar los (aswell como getAlpha) métodos getRed, getGreen y getBlue para obtener los componentes:

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 
} 

Salidas:

173 
73 
82 
255 
+0

¡Muchas gracias! Solo para comprobar, para encontrar esto para todos los puntos de la imagen tengo que hacer algunos bucles, no hay otra manera más eficiente, ¿verdad? – kotoko

+0

Se cambió el ejemplo para usar datos devueltos por 'int [] getRGB (...)'. Los datos se devuelven en el modo 'ARGB' para que pueda extraer los componentes de color usted mismo, pero hey, siempre haga primero el perfil en lugar de realizar optimizaciones prematuras. :) – dacwe

+0

¡Agregó una manera "más rápida" de obtener lo mismo usando bitfiddling! :) – dacwe

Cuestiones relacionadas