El método getRGB devuelve una sola int. ¿Cómo puedo obtener individualmente los colores rojo, verde y azul como valores entre 0 y 255?Java BufferedImage obteniendo rojo, verde y azul individualmente
Respuesta
clase de Java Color puede hacer la conversión:
Color c = new Color(image.getRGB());
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();
que necesitará un poco de aritmética binaria básica para dividirlo:
int blue = rgb & 0xFF;
int green = (rgb >> 8) & 0xFF;
int red = (rgb >> 16) & 0xFF;
(O, posiblemente, a la inversa, honestamente puedo lo recuerdo y la documentación no me da una respuesta instantánea)
Creo que tienes razón. – HyperNeutrino
Un píxel está representado por un entero de 4 bytes (32 bits), como el siguiente:
00000000 00000000 00000000 11111111
^ Alpha ^Red ^Green ^Blue
Por lo tanto, para obtener los componentes de color individuales, sólo se necesita 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 precisamente lo que los métodos de la clase java.awt.Color
hacen:
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 }
Para sencilla manipulaciones de color, puede usar
bufImg.getRaster().getPixel(x,y,outputChannels)
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 [].
- 1. ¿Cómo obtengo el azul verde rojo y el alfa de un objeto UIColor?
- 2. BufferedImage dibujar blanco cuando digo rojo
- 3. UIColor colorWithRed: verde: azul: siempre produce negro
- 4. Agregando colores (colores) juntos como Paint (azul + amarillo = verde, etc.)
- 5. BufferedImage to Bytes Java
- 6. Cargando un BMP en una texturas OpenGL cambia los colores rojo y azul. (C++/Windows)
- 7. Generar colores entre rojo y verde para un rango de entrada
- 8. Compromiso automático de git entre los pasos rojo, verde y refactorizador?
- 9. Haciendo un poco de texto en printf aparecen en verde y rojo gcc
- 10. exclamación java eclipse rojo
- 11. BufferedImage a BMP en Java
- 12. Obteniendo una imagen de Mathematica en Java
- 13. Ajusta el brillo y el contraste de BufferedImage en Java
- 14. ¿Qué desencadena "imágenes copiadas en color" y "huellas de color verde y falta rojo" en los instrumentos?
- 15. Cómo reemplazar colores en BufferedImage en JAVA
- 16. Java: VolatileImage más lento que BufferedImage
- 17. Rotar instancias de BufferedImage
- 18. Establecer la máscara alfa BufferedImage en Java
- 19. Java BufferedImage to PNG format Base64 String
- 20. UIColor colorWithRed: verde: azul: alpha: siempre vuelve blanco a menos que un argumento es 0
- 21. Windows Elasticidad azul y dinámica
- 22. Problemas rotando BufferedImage
- 23. BufferedImage a SWT imagen
- 24. ¿Cómo codigo un botón verde en UIActionSheet?
- 25. ¿Cómo puedo saber dónde tiene BufferedImage Alpha en Java?
- 26. ¿Cómo convierto un InputStream a BufferedImage en Java/Groovy?
- 27. BufferedImage produciendo fondo negro
- 28. Java BufferedImage cómo saber si un píxel es transparente
- 29. Cómo calcular el tamaño del archivo BufferedImage java
- 30. Java BufferedImage ahorra con el color de fondo no deseado
Crear una nueva instancia 'Color' de cada píxel de una imagen genera una gran cantidad de basura y puede ser * muy * ineficiente. Si planea procesar cada píxel de una imagen, es mucho más eficiente obtener el color RGB de cada píxel con 'bufferImage.getRGB (x, y)', y extraer los componentes rojo, verde y azul como se describe en la respuesta por João Silva. – Marco13