java - example - guardar imagen bufferedimage
Java BufferedImage obtiene rojo, verde y azul individualmente (4)
El método getRGB devuelve un único int. ¿Cómo puedo obtener individualmente los colores rojo, verde y azul como valores entre 0 y 255?
La clase de Color de Java puede hacer la conversión:
Color c = new Color(image.getRGB());
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();
Necesitarás una aritmética binaria básica para dividirla:
int blue = rgb & 0xFF;
int green = (rgb >> 8) & 0xFF;
int red = (rgb >> 16) & 0xFF;
(O posiblemente al revés, sinceramente no puedo recordar y la documentación no me da una respuesta instantánea)
Para manipulaciones de color simples, puede usar
bufImg.getRaster().getPixel(x,y,outputChannels)
El outputChannels es una matriz para almacenar el píxel recuperado. Su longitud depende del recuento de canales reales de su imagen. Por ejemplo, una imagen RGB tiene 3 canales; y una imagen RGBA tiene 4 canales.
Este método tiene 3 tipos de salida: int, float y double. Para obtener un rango de valores de color de 0 ~ 255, el parámetro real outputChannels debe ser una matriz int [].
Un píxel está representado por un entero de 4 bytes (32 bits), como ese:
00000000 00000000 00000000 11111111
^ Alpha ^Red ^Green ^Blue
Entonces, para obtener los componentes de color individuales, solo necesitas un poco de aritmética binaria:
int rgb = getRGB(...);
int red = (rgb >> 16) & 0x000000FF;
int green = (rgb >>8 ) & 0x000000FF;
int blue = (rgb) & 0x000000FF;
Esto es de hecho lo que hacen los métodos java.awt.Color
class:
553 /**
554 * Returns the red component in the range 0-255 in the default sRGB
555 * space.
556 * @return the red component.
557 * @see #getRGB
558 */
559 public int getRed() {
560 return (getRGB() >> 16) & 0xFF;
561 }
562
563 /**
564 * Returns the green component in the range 0-255 in the default sRGB
565 * space.
566 * @return the green component.
567 * @see #getRGB
568 */
569 public int getGreen() {
570 return (getRGB() >> 8) & 0xFF;
571 }
572
573 /**
574 * Returns the blue component in the range 0-255 in the default sRGB
575 * space.
576 * @return the blue component.
577 * @see #getRGB
578 */
579 public int getBlue() {
580 return (getRGB() >> 0) & 0xFF;
581 }