Nota : ambas versiones de los rgbToHex
valores enteros esperados para r
, g
y b
, por lo que deberá hacer su propio redondeo si tiene valores no enteros.
Lo siguiente hará a la conversión de RGB a hexadecimal y agregará cualquier relleno de cero requerido:
function componentToHex(c) {
var hex = c.toString(16);
return hex.length == 1 ? "0" + hex : hex;
}
function rgbToHex(r, g, b) {
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
alert(rgbToHex(0, 51, 255)); // #0033ff
Convirtiendo a la inversa:
function hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
alert(hexToRgb("#0033ff").g); // "51";
Finalmente, una versión alternativa de rgbToHex()
, como se discutió en la respuesta de @casablanca y se sugirió en los comentarios de @cwolves:
function rgbToHex(r, g, b) {
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}
alert(rgbToHex(0, 51, 255)); // #0033ff
Actualización 3 de diciembre de 2012
Aquí hay una versión hexToRgb()
que también analiza un triplete hexadecimal abreviado como "# 03F":
function hexToRgb(hex) {
// Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
hex = hex.replace(shorthandRegex, function(m, r, g, b) {
return r + r + g + g + b + b;
});
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
alert(hexToRgb("#0033ff").g); // "51";
alert(hexToRgb("#03f").g); // "51";
<<
es el operador de desplazamiento a la izquierda bit a bit. Suponiendo queg
es un número entero distinto de cero,g << 8
por lo tanto , efectivamente se multiplicag
por 256, agregando ceros al final de su representación hexadecimal. Asimismor << 16
agrega 4 ceros. Adición1 << 24
(1000000 en hex) asegura que la representación hexadecimal está acolchado izquierda con los ceros necesarios una vez que el líder1
se elimina usandoslice()
. Por ejemplo, sir
yg
fueran ambos cero yb
51,((r << 16) + (g << 8) + b).toString(16)
devolvería la cadena "33"; agrega1 << 24
y obtienes "1000033". Luego tira el1
y estás allí.(r << 16)
) daría el mismo resultado en computadoras endian grandes y pequeñas? Editar: no lo hace. He aquí por qué: stackoverflow.com/questions/1041554/…rgbToHex
función. Uno querrá convertir sus valores rgb pasados como enteros o modificar ligeramente la función rgbToHex. Ejemplo: jsfiddle.net/cydqo6wj Actual:return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
Modificado:return "#" + ((1 << 24) + ((+r) << 16) + ((+g) << 8) + (+b)).toString(16).slice(1);
En la versión modificada, simplemente fuerzo a que los valores rgb se evalúen en enteros antes del cambio a 16 / hex.Una versión alternativa de hexToRgb:
Editar: 28/03/2017 Aquí hay otro enfoque
eso parece ser aún más rápidoEdición: 11/08/2017 El nuevo enfoque anterior después de más pruebas no es más rápido :(. Aunque es una forma alternativa divertida.
fuente
return [r, g, b].join();
.return [(bigint = parseInt(hex, 16)) >> 16 & 255, bigint >> 8 & 255, bigint & 255].join();
#
) antesparseInt
:hex = hex.replace(/[^0-9A-F]/gi, '');
Versión ECMAScript 6 de la respuesta de Tim Down
Convertir RGB a hexadecimal
Convertir hexadecimal a RGB
Devuelve una matriz
[r, g, b]
. Funciona también con trillizos hexagonales de taquigrafía como"#03F"
.Bonificación: RGB a hexadecimal utilizando el
padStart()
métodoTenga en cuenta que esta respuesta utiliza las últimas funciones de ECMAScript, que no son compatibles con los navegadores más antiguos. Si desea que este código funcione en todos los entornos, debe usar Babel para compilar su código.
fuente
.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,(m, r, g, b) => '#' + r + r + g + g + b + b)
convierte en:.replace(/^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])$/i,(m, r, g, b, a) => '#' + r + r + g + g + b + b + a + a)
Pero, ¿hay alguna manera de hacer que la expresión regular funcione con A de RGBA como un 4to valor hexadecimal opcional? Eso completaría absolutamente la funcionalidad, haciendo que una expresión regular funcione con RGB hexadecimal y RGBA. De lo contrario, son dos expresiones regulares, una con 3 valores, la otra con 4. Debe dividir el 4to valor entre 255 para obtener el 4to argumento para rgba ().Aquí está mi versión:
fuente
rgb2hex
método. ¿Por qué nos sumamos0x1000000
argb
, y por qué tenemos que llamar.slice(1)
al fin?Supongo que te refieres a la notación hexadecimal de estilo HTML, es decir
#rrggbb
. Su código es casi correcto, excepto que tiene el orden invertido. Debería ser:Además, el uso de cambios de bits puede hacer que sea un poco más fácil de leer:
fuente
var decColor = (red < 16 ? '0' : '') + (red << 16) + (green << 8) + blue;
red < 16
necesita anteponer un0
a al resultado final.var hexColor = ((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).substr(1);
fuente
r
,g
,b
:function hex2rgb(hex){return{r:'0x'+hex[1]+hex[2]|0,g:'0x'+hex[3]+hex[4]|0,b:'0x'+hex[5]+hex[6]|0}}
Este código acepta variantes y opacidad #fff y #ffffff.
fuente
HEX a RGBA funcional de una línea
Admite formas cortas
#fff
y largas#ffffff
.Admite canal alfa (opacidad).
No le importa si hash especificado o no, funciona en ambos casos.
ejemplos:
fuente
Esto podría usarse para obtener colores de las propiedades de estilo calculadas:
Ref: https://github.com/k-gun/so/blob/master/so_util.js
fuente
(r.length == 1 ? "0" + r : r)
y lo mismo para el verde y el azul.La solución bit a bit normalmente es extraña. Pero en este caso supongo que es más elegante 😄
Uso:
fuente
// Ignorando la notación hsl, los valores de color se expresan comúnmente como nombres, rgb, rgba o hexadecimal
// Hex puede ser 3 valores o 6.
// Rgb puede ser porcentajes, así como valores enteros.
// Es mejor tener en cuenta todos estos formatos, al menos.
fuente
@ Tim, para agregar a tu respuesta (es un poco incómodo ajustar esto en un comentario).
Tal como está escrito, descubrí que la función rgbToHex devuelve una cadena con elementos después del punto y requiere que los valores r, g, b estén dentro del rango 0-255.
Estoy seguro de que esto puede parecer obvio para la mayoría, pero tardé dos horas en darme cuenta y para entonces el método original se había disparado a 7 líneas antes de darme cuenta de que mi problema estaba en otra parte. Entonces, en aras de ahorrar tiempo y molestias a los demás, aquí está mi código ligeramente modificado que verifica los requisitos previos y recorta los bits extraños de la cadena.
fuente
(2017) Funciones de flecha componibles SIMPLE ES6
No puedo resistirme a compartir esto para aquellos que pueden estar escribiendo algunos js modernos funcionales / compositivos usando ES6. Aquí hay algunas frases ingeniosas que estoy usando en un módulo de color que hace interpolación de color para la visualización de datos.
Tenga en cuenta que esto no maneja el canal alfa en absoluto.
fuente
Tratar
Mostrar fragmento de código
fuente
Si necesita comparar dos valores de color (dados como RGB, color de nombre o valor hexadecimal) o convertir a HEX, use un objeto de lienzo HTML5.
fuente
¿Puedes perseguir algo como esto?
muestra # 9687c8
fuente
Para la función hexToRgb de 3 dígitos de Tim Down se puede mejorar de la siguiente manera:
fuente
Me encontré con este problema porque quería aceptar cualquier valor de color y poder agregar una opacidad, así que creé este complemento rápido de jQuery que usa el lienzo nativo en los navegadores modernos. Parece funcionar muy bien.
Editar
Resulta que no puedo entender cómo convertirlo en un complemento jQuery adecuado, por lo que lo presentaré como una función regular.
fuente
Necesitaba una función que acepte valores no válidos como
rgb (-255, 255, 255) rgb (510, 255, 255)
Esta es una spin off de la respuesta de @cwolves
fuente
Utilice estas funciones para lograr el resultado sin ningún problema. :)
fuente
Versión abreviada que acepta una cadena:
Para comprobar si aún no es hexadecimal
fuente
Si bien es poco probable que esta respuesta se ajuste perfectamente a la pregunta, puede ser muy útil.
var toRgb = document.createElement('div');
toRg.style.color = "hsl(120, 60%, 70%)";
> toRgb.style.color;
< "rgb(133, 225, 133)"
Su color ha sido convertido a RgbFunciona para: Hsl, Hex
No funciona para: colores con nombre
fuente
Mi versión de hex2rbg:
String.replace, String.split, String.match
etc.Es posible que necesite eliminar hex.trim () si está utilizando IE8.
p.ej
código:
fuente
h.join(',')
es lo mismo queh.join()
.Este fragmento convierte hexadecimal a rgb y rgb a hexadecimal.
Ver demo
fuente
Estoy trabajando con datos XAML que tienen un formato hexadecimal de #AARRGGBB (Alfa, Rojo, Verde, Azul). Usando las respuestas anteriores, aquí está mi solución:
http://jsfiddle.net/kvLyscs3/
fuente
Para convertir directamente desde jQuery puedes probar:
fuente
fuente
Teniendo en cuenta que muchas respuestas solo responden parcialmente la pregunta (ya sea de RGB a HEX o al revés), pensé que también publicaría mi respuesta parcial.
Tuve un problema similar y quería hacer algo como esto: ingresar cualquier color CSS válido (HSL (a), RGB (a), HEX o nombre de color) y 1. poder agregar o eliminar un valor alfa, 2. devuelve un objeto rgb (a). Escribí un complemento exactamente para este propósito. Se puede encontrar en GitHub (requiere jQuery, pero si lo desea puede bifurcarlo y hacer una versión vainilla). Aquí hay una página de demostración . Puede probarlo usted mismo y ver la salida generada sobre la marcha.
Copiaré y pegaré las opciones aquí:
RGB Generator acepta un argumento, el color, y ofrece tres opciones: asObject, addAlpha y removeAlpha. Cuando se omiten las tres opciones, el color RGB se devolverá como una cadena.
Tenga en cuenta que, por defecto, se incluyen los componentes alfa. Si el valor de entrada contiene un valor alfa, la salida estará en formato RGBa.
Puede deshabilitar este comportamiento estableciendo removeAlpha en verdadero. Esto eliminará cualquier valor alfa de un color HSLa o RGBa inicial.
Si, por otro lado, desea agregar un canal alfa, puede hacerlo estableciendo addAlpha en cualquier valor entre 0 y 1. Cuando la entrada es un color no transparente, se agregará el valor alfa. Si es transparente, el valor proporcionado sobrescribirá el componente alfa de la entrada.
Finalmente, también es posible generar el color RGB (a) como un objeto. Consistirá en r, g, by opcionalmente a.
fuente
La respuesta mejor calificada por Tim Down proporciona la mejor solución que puedo ver para la conversión a RGB. Sin embargo, me gusta más esta solución para la conversión hexadecimal porque proporciona la comprobación de límites más sucinta y el relleno cero para la conversión a hexadecimal.
El uso de desplazamiento a la izquierda '<<' y o '|' los operadores también hacen de esta una solución divertida.
fuente
Encontré esto y porque creo que es bastante sencillo y tiene pruebas de validación y admite valores alfa (opcional), esto encajará en el caso.
Solo comente la línea regex si sabe lo que está haciendo y es un poco más rápido.
fuente