Foro sobre Java SE > Java colores
@Paposo yo también estoy interesado en la pregunta que ha echo triblack donde debo poner el long valor=0xFFFFFFFFL&argb; ?? Gracias por tu tiempo !!
Buenas,
Efectivamente el algoritmo con getRaster devuelve valores negativos... pero tambien lo hace getRGB!!!
Como comenta Paposo el formato RGBA (http://en.wikipedia.org/wiki/RGBA_color_space), que utiliza cada uno de los 4 bytes del int para almacenar el Red, Green, Blue y el Alfa. El valor que tome finalmente el entero es indiferente (sera negativo si coincide que su primer bit esta a 1, algo que pasara siempre que el canal alpha este a tope - opacidad total). Pero ya te sirve para comparar que es lo que quieres!
Mira, por si lo quieres entender mejor, échale un buen vistazo al link a la wiki que puse antes, especialmente al cuadro que indica las posiciones de los bits.
A partir de este es muy facil, por ejemplo, saber el valor para cada uno de sus componentes (Red, Green, Blue y Alfa).
int pixel= myImage.getRGB(0, 0); //En entero vale -1317399, que en binario es 111111111....
int red = (pixel >> 16) & 0xFF; //red = 235, que son los bits del 16 al 23 del entero pixel
int green = (pixel >> 8) & 0xFF; //green = 229, que son los bits del 8 al 15 del entero pixel
int blue = pixel & 0xFF; //blue = 233, que son los bits del 0 al 7 del entero pixel
int alpha = (pixel >> 24) & 0xFF; //alpha = 255 , que son los bits del 24 al 31 del entero pixel
alpha vale 255 = 11111111, como su primer valor es un 1 y es el primer bit del entero pixel (el primer bit de un entero es el del signo) entonces por eso el valor es negativo.
Espero que haya quedado claro, no se como explicarlo más :-S
Un saludo
Guenas.
Lo del long solo lo puse por si necesitaba el valor en positivo para alguna utilidad especifica, pero no es en absoluto útil para trabajar con ello ya el long tiene 8 bytes y no es una representación correcta de una combinación de 4 bytes.
La verdad es que siempre he echado de menos los tipos unsigned para valores enteros como byte, short, int y long. Jamas entendí porque no se incluyeron en java.
Un saludo
Paposo
Esta es la explicacion de Gosling al respecto:
For me as a language designer, which I don't really count myself as these days, what "simple" really ended up meaning was could I expect J. Random Developer to hold the spec in his head. That definition says that, for instance, Java isn't -- and in fact a lot of these languages end up with a lot of corner cases, things that nobody really understands. Quiz any C developer about unsigned, and pretty soon you discover that almost no C developers actually understand what goes on with unsigned, what unsigned arithmetic is. Things like that made C complex. The language part of Java is, I think, pretty simple. The libraries you have to look up.
Yo personalmente ni me lo he planteado nunca. Ultimamente con tal de acabar mi trabajo e irme a una hora razonable me basta :-)
Un saludo
Guenas.
Lo que pasa es que java no tiene tipos unsigned.
Un color ARGB usa los 4 bytes del int.
Si el bit mas alto del int esta activado como en este caso por el alpha opaco el numero se interpreta como un negativo.
Ahora lo pongo de memoria pero creo que si lo asignas a un long de la forma siguiente podrás obtener el resultado en positivo:
long valor=0xFFFFFFFFL&argb;
Un saludo