2011-10-13 21 views
7

Esto se relaciona con códigos de color CSS:¿Cómo manejan los navegadores rgb (porcentaje) los navegadores? para los números extraños

Para hexcode podemos representar 16.777.216 colores de # 000000 a #ffffff

Según W3C especificaciones, porcentajes RGB válidos encajan en un rango de (0,0% hasta 100.0%) esencialmente dándole 1,003,003,001 combinaciones de colores. (1001^3)

De acuerdo con las especificaciones:

Los valores fuera de la gama del dispositivo debe ser cortado o asignada a la gama cuando la gama es conocida: los valores de rojo, verde y azul deben estar cambiado para estar dentro del rango admitido por del dispositivo. Los agentes de usuarios pueden realizar un mapeo de colores de mayor calidad desde una gama hasta . Para un monitor CRT típico, cuya gama del dispositivo es la misma que sRGB, las cuatro reglas a continuación son equivalentes:

estoy dudoso que los navegadores pueden hacer realidad todos estos valores. (pero si lo hacen por favor díganme e ignoren el resto de esta publicación)

Supongo que hay un mapeo de rgb (porcentaje) a hexadecimal. (Pero de nuevo no estoy muy seguro de cómo funciona esto)

Idealmente me gustaría averiguar la función RGB (porcentaje) -> HEX

Si tuviera que adivinar, probablemente sería uno de éstos 3.

1) Ronda al hexágono más cercano

2) CEIL al hexágono más cercano

3) palabra a los HEX más cercana

el problema es que necesito ser preciso en el mapeo y no tengo idea de dónde buscar. No hay manera de que mis ojos puedan diferenciar el color en ese nivel, pero tal vez haya alguna forma inteligente de probar cada uno de estos 3.

También puede depender del navegador. ¿Esto puede ser probado?

EDIT:

Firefox seems to round from empirical testing. 

EDIT:

Estoy mirando a través del código fuente de Firefox en este momento,

nsColor.h 
// A color is a 32 bit unsigned integer with four components: R, G, B 
// and A. 
typedef PRUint32 nscolor; 

Parece Fiefox solamente tiene espacio para 255 valores para cada R, G y B. Sugerencia de que el redondeo podría ser la respuesta, pero tal vez se hagan algunas cosas con el canal alfa

+3

Si no puede distinguir entre '# 000000' y' # 000001', ¿por qué necesita la fórmula exacta? También una manera tortuosa de probar sería mostrar un bloque del color, presionar Imprimir pantalla, y usar la herramienta cuentagotas de un programa de gráficos para averiguar el valor hexadecimal resultante. – Toomai

+0

Estoy trabajando en un tipo de analizador sintáctico, supongo, el usuario final no debería ser capaz de distinguir entre # 000000 y # 000001, pero el código debe ser equivalente en todas las cuentas. Sin embargo, me gusta la idea del cuentagotas como primer paso, ¡gracias! – Ray

+0

Si la especificación no especifica una asignación, entonces espero que sea dependiente del navegador, o al menos si no depende del navegador, entonces es solo una coincidencia que no lo sea. Imagino que mientras seas consecuente estarás tan preciso como puedas. ¿Has verificado con firebug o algo así en el estilo calculado para ver cómo termina? – jswolf19

Respuesta

1

creo que he encontrado una solución para Firefox de todos modos, pensé que te gustaría un seguimiento:

Mirando a través del código fuente que encontré un archivo:

nsCSSParser.CPP

Para cada rgb porcentajes que hace lo siguiente:

  1. Se toma el componente de porcentaje lo multiplica por 255.0f
  2. lo almacena en un flotador
  3. lo pasa en una función NSToIntRound
  4. El resultado de NSToIntRound se almacena en un tipo de datos entero de 8 bits, antes de combinarse con los otros 2 componentes y un canal alfa

buscando más detalles sobre NSToIntRound:

nsCoord.h 
inline PRInt32 NSToIntRound(float aValue) 
{ 
    return NS_lroundf(aValue); 
} 

NSToIntRound es una función de contenedor para NS_lroundf

nsMathUtils.h 
inline NS_HIDDEN_(PRInt32) NS_lroundf(float x) 
{ 
    return x >= 0.0f ? PRInt32(x + 0.5f) : PRInt32(x - 0.5f); 
} 

Esta función es en realidad muy inteligente, me tomó un tiempo para descifrar (no lo hago realmente tengo un buen fondo de C++).

Suponiendo x es positivo

añade 0.5f para x y luego arroja a un entero

Si la parte fraccionaria de x fue de menos de 0,5, la adición de 0,5 no cambiará el número entero y fraccionario la parte está truncada,

De lo contrario, el valor entero se salta por 1 y la parte fraccionaria se trunca.

  1. Así porcentaje de cada componente se multiplica por primera vez por 255.0f
  2. Entonces redondeado y echado en un entero de 32 bits
  3. Y luego el yeso de nuevo en un entero de 8 bits

Estoy de acuerdo con la mayor parte de usted que dice que esto parece ser un problema dependiente del navegador, por lo que haré más investigación sobre otros navegadores.

¡Muchas gracias!

Cuestiones relacionadas