2011-01-26 35 views
36

Por lo tanto, en un BufferedImage, recibirá un entero único que tiene los valores RGB representados en él. Hasta ahora uso lo siguiente para obtener los valores RGB:Convertir valores RGB a Entero

// rgbs is an array of integers, every single integer represents the 
// RGB values combined in some way 
int r = (int) ((Math.pow(256,3) + rgbs[k])/65536); 
int g = (int) (((Math.pow(256,3) + rgbs[k])/256) % 256); 
int b = (int) ((Math.pow(256,3) + rgbs[k]) % 256); 

Y hasta ahora, funciona.

Lo que necesito hacer es averiguar cómo obtener un número entero para que pueda usar BufferedImage.setRGB(), porque eso toma el mismo tipo de datos que me dio.

Respuesta

68

Creo que el código es algo como:

int rgb = red; 
rgb = (rgb << 8) + green; 
rgb = (rgb << 8) + blue; 

Además, creo que se puede obtener los valores individuales usando:

int red = (rgb >> 16) & 0xFF; 
int green = (rgb >> 8) & 0xFF; 
int blue = rgb & 0xFF; 
+0

No creo que necesite una int en las dos segundas líneas. Y la tercera línea se supone que es "rgb = ...", ¿verdad? –

+0

Es un entero único. Un número entero contiene 32 bits. Los primeros 8 bits son para el valor alfa (que es cero). Los 8 siguientes para el rojo, luego el 8 para el verde y los 8 siguientes para el azul. Intentalo. Si el resultado final es igual a su entrada inicial, sabrá que la conversión se realizó correctamente. – camickr

+0

Erm, creo que dependería de la profundidad de color. Tu ejemplo parece color de 24 bits para mí (8 bits por canal). ¿Es eso lo que 'BufferedImage' espera? –

22
int rgb = ((r&0x0ff)<<16)|((g&0x0ff)<<8)|(b&0x0ff); 

Si usted sabe que su r, g, y los valores b nunca son> 255 o < 0 no es necesario & 0x0ff

Addit ionaly

int red = (rgb>>16)&0x0ff; 
int green=(rgb>>8) &0x0ff; 
int blue= (rgb) &0x0ff; 

No hay necesidad de multiplicar.

17

si r, g, b = 3 valores enteros de 0 a 255 para cada color

entonces

rgb = 65536 * r + 256 * g + b; 

el valor RGB solo es el valor compuesto de r, g, b combinada para una un total de 16777216 sombras posibles.

+1

Yo modificaría esto para que sea 'rgb = 0xFFFF * r + 0xFF * g + b;' para la legibilidad –

+2

0xFF = 255. Tendría que ser 0x100. Del mismo modo para 0XFFFF – geoxile

20
int rgb = new Color(r, g, b).getRGB(); 
1

Para obtener valores de color individuales, puede utilizar Color como los siguientes para pixel (x, y).

import java.awt.Color; 
import java.awt.image.BufferedImage; 

Color c = new Color(buffOriginalImage.getRGB(x,y)); 
int red = c.getRed(); 
int green = c.getGreen(); 
int blue = c.getBlue(); 

Lo anterior le dará los valores enteros de rojo, verde y azul en el rango de 0 a 255.

Para establecer los valores de RGB, puede hacerlo a través de:

Color myColour = new Color(red, green, blue); 
int rgb = myColour.getRGB(); 

//Change the pixel at (x,y) ti rgb value 
image.setRGB(x, y, rgb); 

Tenga en cuenta que lo anterior cambia el valor de un solo píxel. Por lo tanto, si necesita cambiar el valor de la imagen completa, es posible que necesite iterar sobre la imagen utilizando dos bucles for.