Me estoy poniendo un valor entero para el píxel de una imagen utilizando este método:

int colour = img.getRGB(x, y);

Entonces tengo la impresión de los valores y veo que los píxeles negros corresponden a un valor como «-16777216», una especie de azul a algo así como «-16755216», etc. Puede alguien por favor me explique la lógica detrás de este valor?

InformationsquelleAutor leonardo | 2014-09-10

5 Comentarios

  1. 32

    getRGB(int x, int y) que devuelva el valor del color del píxel en la posición de (x,y).

    Usted está malinterpretando el valor devuelto.

    Es en el formato binario.
    como 11…11010101 y que se les dio como un valor int.

    Si desea obtener RGB (es decir, Rojo, Verde, Azul) de los componentes de ese valor de uso de la clase de Color. por ejemplo,

    Color mycolor = new Color(img.getRGB(x, y));

    Entonces usted puede conseguir el Rojo, el Verde o el Azul de valor mediante el uso de getRed(), getGreen(), getBlue(), getAlpha().
    A continuación, una int valor será devuelto por estos métodos en formato familiar de tener valor 0 < value < 255

    int red = mycolor.getRed();

    Si usted no quiere usar Color clase, entonces usted tendrá que utilizar las operaciones bit a bit para obtener su valor.

    • Esta respuesta es buena, pero no aborda el canal alfa. Ver otras respuestas.
    • Clase de Color también han getAlpha() método que le dará un valor de alfa. Y que he mencionado en mi respuesta.
  2. 47

    El RGB int color contiene el Rojo, el Verde, el Azul de los componentes del color en sus bits. Usted tiene que mirar a su binario o hexadecimal de la representación y no lo ven como un número entero (número de no mirar a su representación decimal).

    Un int tiene 32 bits, 3×8 = 24 se utiliza para almacenar los componentes RGB (8 bits para cada uno) en el siguiente formato:

                   2          1          0
    bitpos      32109876 54321098 76543210
    ------   --+--------+--------+--------+
    bits     ..|RRRRRRRR|GGGGGGGG|BBBBBBBB|

    Puede extraer o conjunto de los componentes utilizando máscaras de bits:

    int color = img.getRGB(x, y);
    
    //Components will be in the range of 0..255:
    int blue = color & 0xff;
    int green = (color & 0xff00) >> 8;
    int red = (color & 0xff0000) >> 16;

    Si el color también tiene un componente alfa (transparencia) ARGB, se obtiene de los últimos 8 bits.

               3          2          1          0
    bitpos    10987654 32109876 54321098 76543210
    ------   +--------+--------+--------+--------+
    bits     |AAAAAAAA|RRRRRRRR|GGGGGGGG|BBBBBBBB|

    Y el valor:

    int alpha = (color & 0xff000000) >>> 24; //Note the >>> shift
                                             //required due to sign bit

    Un valor alfa de 255 significa que un color es completamente opaco y un valor de 0 significa que el color es completamente transparente.

    Su color:

    Su color es color = -16755216 que tiene:

    blue : 240         //Strong blue
    green:  85         //A little green mixed in
    red  :   0         //No red component at all
    alpha: 255         //Completely opaque
    • He votado como esta es la explicación más clara que he encontrado, Todavía, no entiendo el significado de 32222222 22222222 111111 por encima de bitpos Podrían aclarar?
    • Un int ha de 32 bits, que van de 0 a 31 (si es cero, es decir, si la primera es 0). Escribí el bitpos verticalmente: el 33 2222222222 1111111111 son el primer dígito (las decenas) de la bitpos. El bit de más a la derecha tiene bitposition 0, por lo que la posición de bit más a la izquierda es el 31, junto a la que es de 30, junto a la que tiene 29 años y así sucesivamente. Tienes que leer el dígito y el bajo juntos: verticalmente. Esto es sólo un formato de buen diseño.
  3. 6

    Ver el la aplicación de ColorModel.getRgb:

    589  public int getRGB(int pixel) {
    590        return (getAlpha(pixel) << 24)
    591             | (getRed(pixel) << 16)
    592             | (getGreen(pixel) << 8)
    593             | (getBlue(pixel) << 0);
    594   }
  4. 5

    Es se explica en la documentación:

    Devuelve un entero de píxeles por defecto en el modelo de color RGB (TYPE_INT_ARGB) […]

    Por lo que obtener 8 bits con canal alfa de 8 bits de color rojo, 8 bits de color verde, 8 bits de color azul.

    Un simple (y lenta) para examinar el valor es el uso de new java.awt.Color(colour, true); y, a continuación, llamar a los getters.

    O puede imprimir el valor como un entero de 32 bits con valor hexadecimal: Integer.toString(colour, 16). Cada uno de los dos personajes de la salida será de una parte de la ARGB conjunto.

  5. 3

    De hecho,Usted puede transformar el int en cadena binaria por Entero.toBinaryString(-16755216),que es 11111111000000000101010111110000.se compone de 4 bytes: alfa, rojo, verde, azul. Los valores son unpremultiplied, es decir, cualquier transparencia se almacena únicamente en el componente alfa, y no en los componentes de color. Los componentes se almacenan de la siguiente manera (alfa << 24) | (rojo << 16) | (green << 8) | azul. Cada componente varía entre 0..255 0 significa ninguna contribución para ese componente y 255 lo que significa el 100% de la contribución. Por lo tanto opaco-negro sería 0xFF000000 (100% opaco, pero no de las contribuciones de rojo, verde o azul), y opaco blanco sería 0xFFFFFFFF.

Dejar respuesta

Please enter your comment!
Please enter your name here