¿Alguien puede explicar cómo obtener una matriz de valor rgb de una BufferedImage?
Tengo una imagen en escala de grises en un BufferedImage y necesito extraer una matriz de 0 a 255 valores que describan la imagen.
Sé que BufferedImage es correcta porque puedo guardarlo en PNG. Sin embargo, si lo uso int[] dataBuffInt = ((DataBufferInt) heightMap.getDataBuffer()).getData();
, obtengo un montón de números negativos enormes.
He buscado durante un tiempo y he visto algunas referencias al cambio de algunos valores ( publicación ), pero realmente no entiendo lo que están diciendo.
Básicamente, quiero pasar de un BufferedImage a una matriz de 0 a 255 valores RBG.
No estoy seguro de haberme explicado correctamente, por lo que es necesario pedir más detalles.
Editar:
@Garbage Gracias por el consejo. Intenté int [] dataBuffInt = heightMap.getRGB (0, 0, heightMap.getWidth (), heightMap.getHeight (), null, 0, heightMap.getWidth ()); Pero obtén el mismo resultado.
@Greg Kopff El resultado es 2 y se estableció en TYPE_INT_ARGB
Obtienes números negativos ya que el valor int que obtienes de uno de los píxeles está compuesto por rojo, verde, azul y alfa. Debe dividir los colores para obtener un valor para cada componente de color.
La forma más sencilla de hacer esto es crear un Color
objeto y usar los métodos getRed
, getGreen
y getBlue
(así como getAlpha
) 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
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras