Nota : tanto a versão de rgbToHex
esperar valores inteiros para r
, g
e b
, por isso, você vai precisar para fazer sua própria arredondamento se você tem valores não inteiros.
O que segue será a conversão de RGB para hexadecimal e adicionará qualquer preenchimento zero necessário:
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
Convertendo para o outro lado:
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";
Por fim, uma versão alternativa do rgbToHex()
, conforme discutido na resposta do @ casablanca e sugerido nos comentários do @cwolves:
function rgbToHex(r, g, b) {
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}
alert(rgbToHex(0, 51, 255)); // #0033ff
Atualização 3 de dezembro de 2012
Aqui está uma versão hexToRgb()
que também analisa um trigêmeo hexadecimal 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";
<<
é o operador de mudança à esquerda bit a bit. Assumindo queg
é um número inteiro diferente de zero,g << 8
multiplica-se efetivamenteg
por 256, adicionando zeros ao final de sua representação hexadecimal. Da mesma formar << 16
adiciona 4 zeros. A adição1 << 24
(1000000 em hexadecimal) garante que a representação hexadecimal seja preenchida à esquerda com os zeros necessários assim que a guia principal1
for retiradaslice()
. Por exemplo, ser
eg
fossem zero eb
51,((r << 16) + (g << 8) + b).toString(16)
retornaria a string "33"; adicione1 << 24
e você obtém "1000033". Em seguida, retire o1
e você está lá.(r << 16)
) produziria o mesmo resultado em computadores grandes e pequenos? Edit: Não. Aqui está o porquê: stackoverflow.com/questions/1041554/…rgbToHex
função mais recente . Alguém quer tipificar seus valores rgb passados como números inteiros ou modificar levemente a função rgbToHex. Exemplo: jsfiddle.net/cydqo6wj Atual: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);
Na versão modificada, simplesmente forço os valores de rgb a serem avaliados em números inteiros antes da alteração para 16 / hex.Uma versão alternativa do hexToRgb:
Edit: 28/03/2017 Aqui está outra abordagem
isso parece ser ainda mais rápidoEdit: 11/08/2017 A nova abordagem acima, após mais testes, não é mais rápida :(. Embora seja uma maneira alternativa divertida.
fonte
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, '');
Versão ECMAScript 6 de da resposta Tim Down
Convertendo RGB em hexadecimal
Convertendo hex para RGB
Retorna uma matriz
[r, g, b]
. Funciona também com trigêmeos hexadecimais de taquigrafia, como"#03F"
.Bônus: RGB para hexadecimal usando o
padStart()
métodoObserve que esta resposta usa os recursos mais recentes do ECMAScript, que não são suportados em navegadores mais antigos. Se você deseja que esse código funcione em todos os ambientes, use o Babel para compilar seu código.
fonte
.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,(m, r, g, b) => '#' + r + r + g + g + b + b)
torna - se:.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)
Mas existe uma maneira de fazer o regexp funcionar com A de RGBA como um valor hexadecimal opcional? Isso completaria absolutamente a funcionalidade, fazendo um regexp funcionar com hexadecimal RGB e RGBA. Caso contrário, são dois regexps, um com 3 valores e o outro com 4. Você deve dividir o quarto valor por 255 para obter o quarto argumento para rgba ().Aqui está a minha versão:
fonte
rgb2hex
método. Por que adicionar0x1000000
argb
, e por isso precisamos chamar.slice(1)
no último?Estou assumindo que você quer dizer notação hexadecimal no estilo HTML, ou seja
#rrggbb
. Seu código está quase correto, exceto pelo fato de a ordem ser revertida. Deveria ser:Além disso, o uso de troca de bits pode facilitar a leitura:
fonte
var decColor = (red < 16 ? '0' : '') + (red << 16) + (green << 8) + blue;
red < 16
você precisar prefixar0
a ao resultado final.var hexColor = ((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).substr(1);
fonte
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 aceita #fff e #ffffff variantes e opacidade.
fonte
HEX funcional para RGBA de uma linha
Suporta formulários curtos
#fff
e longos#ffffff
.Suporta canal alfa (opacidade).
Não se importa se o hash especificado ou não, funciona nos dois casos.
exemplos:
fonte
Isso pode ser usado para obter cores de propriedades de estilo computadas:
Ref: https://github.com/k-gun/so/blob/master/so_util.js
fonte
(r.length == 1 ? "0" + r : r)
e da mesma forma para verde e azul.A solução bit a bit normalmente é estranha. Mas, neste caso, acho que é mais elegante 😄
Uso:
fonte
// Ignorando a notação hsl, os valores de cores são geralmente expressos como nomes, rgb, rgba ou hex-
// Hex pode ter 3 valores ou 6.
// Rgb pode ser porcentagens e valores inteiros.
// Melhor explicar todos esses formatos, pelo menos.
fonte
@ Tim, para adicionar à sua resposta (é um pouco estranho encaixar isso em um comentário).
Como foi escrito, descobri que a função rgbToHex retorna uma string com elementos após o ponto e requer que os valores de r, g, b estejam dentro do intervalo de 0 a 255.
Tenho certeza de que isso pode parecer óbvio para a maioria, mas demorou duas horas para eu descobrir e, então, o método original havia aumentado para sete linhas antes que eu percebesse que meu problema estava em outro lugar. Portanto, no interesse de economizar tempo e aborrecimentos para os outros, aqui está o meu código ligeiramente alterado que verifica os pré-requisitos e apara os bits estranhos da string.
fonte
(2017) Funções de seta composíveis SIMPLE ES6
Não consigo resistir a compartilhar isso para aqueles que podem estar escrevendo alguns js funcionais / composicionais modernos usando o ES6. Aqui estão algumas frases simples que estou usando em um módulo de cores que faz interpolação de cores para visualização de dados.
Observe que isso não lida com o canal alfa.
fonte
Tentar
Mostrar snippet de código
fonte
Se você precisar comparar dois valores de cores (fornecidos como RGB, nome da cor ou valor hexadecimal) ou converter para HEX, use o objeto de tela HTML5.
fonte
Você pode estar atrás de algo assim?
exibe # 9687c8
fonte
Para 3 dígitos, a função hexToRgb de Tim Down pode ser aprimorada como abaixo:
fonte
Me deparei com esse problema, já que queria aceitar qualquer valor de cor e poder adicionar uma opacidade, então criei esse plugin jQuery rápido que usa a tela nativa em navegadores modernos. Parece funcionar muito bem.
Editar
Acontece que eu não consigo descobrir como torná-lo um plug-in jQuery adequado, por isso vou apresentá-lo como uma função regular.
fonte
eu precisava de uma função que aceite valores inválidos também,
rgb (-255, 255, 255) rgb (510, 255, 255)
este é um spin off da resposta @cwolves
fonte
Use estas funções para obter o resultado sem nenhum problema. :)
fonte
Versão abreviada que aceita uma string:
Para verificar se ainda não é hexadecimal
fonte
Embora seja improvável que essa resposta se encaixe perfeitamente na pergunta, ela pode ser muito útil.
var toRgb = document.createElement('div');
toRg.style.color = "hsl(120, 60%, 70%)";
> toRgb.style.color;
< "rgb(133, 225, 133)"
Sua cor foi convertida para RgbTrabalhos para: Hsl, Hex
Não funciona para: cores nomeadas
fonte
Minha versão do hex2rbg:
String.replace, String.split, String.match
etc.pode ser necessário remover o hex.trim () se você estiver usando o IE8.
por exemplo
código:
fonte
h.join(',')
é a mesma coisa queh.join()
.Esse trecho converte hexadecimal para rgb e rgb para hexadecimal.
Ver demonstração
fonte
Estou trabalhando com dados XAML que possuem um formato hexadecimal de #AARRGGBB (alfa, vermelho, verde e azul). Usando as respostas acima, aqui está minha solução:
http://jsfiddle.net/kvLyscs3/
fonte
Para converter diretamente do jQuery, você pode tentar:
fonte
fonte
Considerando que muitas respostas respondem parcialmente à pergunta (de RGB para HEX ou o contrário), pensei em postar minha resposta parcial também.
Eu tive um problema semelhante e queria fazer algo assim: insira qualquer cor CSS válida (HSL (a), RGB (a), HEX ou nome da cor) e 1. seja capaz de adicionar ou remover um valor alfa, 2. retornar um objeto rgb (a). Eu escrevi um plugin exatamente para esse fim. Ele pode ser encontrado no GitHub (requer jQuery, mas se você quiser, pode bifurcá-lo e criar uma versão baunilha). Aqui está uma página de demonstração . Você pode tentar por si mesmo e ver a saída gerada em tempo real.
Vou copiar e colar as opções aqui:
O RGB Generator aceita um argumento, a cor, e fornece três opções: asObject, addAlpha e removeAlpha. Quando as três opções são omitidas, a cor RGB será retornada como uma sequência.
Observe que, por padrão, os componentes alfa estão incluídos. Se o valor de entrada contiver um valor alfa, a saída estará no formato RGBa.
Você pode desativar esse comportamento definindo removeAlpha como true. Isso removerá qualquer valor alfa de uma cor HSLa ou RGBa inicial.
Se, por outro lado, você deseja adicionar um canal alfa, pode fazê-lo definindo addAlpha como qualquer valor entre 0 e 1. Quando a entrada é uma cor não transparente, o valor alfa será adicionado. Se for transparente, o valor fornecido substituirá o componente alfa da entrada.
Finalmente, também é possível imprimir a cor RGB (a) como um objeto. Ele consistirá em r, g, be opcionalmente a.
fonte
A resposta mais bem avaliada por Tim Down fornece a melhor solução que posso encontrar para conversão em RGB. Eu gosto mais desta solução para a conversão Hex, porque ela fornece a verificação de limites mais sucinta e o preenchimento zero para a conversão em Hex.
O uso do deslocamento esquerdo '<<' e ou '|' Os operadores também fazem disso uma solução divertida.
fonte
Descobri isso e, porque acho que é bastante simples, possui testes de validação e suporta valores alfa (opcional), isso será adequado ao caso.
Apenas comente a linha regex se você souber o que está fazendo e é um pouco mais rápido.
fonte