2010-11-22 20 views

Respuesta

17

La solución de Robusto es demasiado lenta.

Dado que los valores RGB se almacenan como esto:

8b Red | 8b Green | 8b Blue 

y un valor de 0-255 (que no es una coincidencia) ha 8b también se puede utilizar a nivel de bits izquierda se desplaza para obtener el valor int, y ENTONCES puedes obtener un hex (casi 3 veces más rápido). Por lo tanto:

var intVal:int = red << 16 | green << 8 | blue; 
var hexVal:String = intVal.toString(16); 
hexVal = "#" + (hexVal.length < 6 ? "0" + hexVal : hexVal); 

Dónde rojo, verde y azul son los valores de RGB que desee convertir.

+1

no olvide el canal alfa si está utilizando ARGB (es decir, BitmapData.getPixel32(). 'Alpha << 24 | red << 16 | green << 8 | blue' – gthmb

+0

Pero eso sería _A_RGB, no lo haría it: D También - esto (creo) es para un uso más convencional como selector de paleta, o un convertidor para uso CSS/HTML - un color SIEMPRE está en el formato de #RRGGBB o #RGB - no alfa en cualquier lugar. –

+0

¿Qué pasa si el canal R solo tiene un dígito hexadecimal? Esto devuelve "# 40404".La mayoría de las aplicaciones están buscando "# 040404" – Meekohi

3

Convierte los números RGB en valores hexadecimales y concatenarlos.

var hexVal = (253).toString(16) + (132).toString(16) + (58).toString(16); 
hexVal = "#" + hexVal; 
// returns "#fd843a" 

Esto es menos elegante de lo que debería ser, pero debería darle la idea.

+3

Hay un error en el código. Si cualquier componente toma solo un dígito hexadecimal (es decir, componente <16), los componentes a la izquierda terminarán desplazados hacia la derecha en un solo lugar, lo que dará resultados falsos (a menos que el valor a la izquierda sea cero). Tendrás que rellenar con cero cada componente, pero en este punto, también podrías usar bitshifts, creo. –

+0

@Juan Pablo: No tenía la intención de que fuera una solución exhaustiva, solo una ilustración de una idea, la idea era que convertirías los valores base 10 en la base 16. No tengo tiempo para escribir optimizado sin errores código para otras personas, pero más poder para ti si lo haces. – Robusto

+0

Sí, entiendo lo que dices. Me disculpo si mi comentario sonaba duro, no quise decirlo de esa manera. Solo pensé que valía la pena mencionar que había un problema en caso de que alguien quisiera usar el código publicado tal como está. –

3

Aurel300 es casi la forma estándar, así que iría con eso. La solución de Robusto, como es, es incorrecta.

Otra opción si se quiere evitar operaciones de bits es el uso de aritmética simple:

var intVal:int = red * 0x10000 + green * 0x100 + blue; 

o, si cree que la notación hexadecimal causará confusión.

var intVal:int = red * 65536 + green * 256 + blue; 

Me ha publicado esto sólo para mostrar otra forma de obtener el valor hexadecimal (uno que tiene más claro cómo los componentes trabajan y se suman al valor final, creo), pero, como ya he dicho, Obtuve el código de Aurel300.

2

mayoría de las aplicaciones necesitan un código hexadecimal de seis dígitos para los colores:

function RGBtoHEX(r, g, b) { 
    var s = (r << 16 | g << 8 | b).toString(16); 
    while(s.length < 6) s="0"+s; 
    return "#"+s; 
}