Aqui está uma função em que eu estava trabalhando para clarear ou escurecer programaticamente uma cor hexadecimal por uma quantidade específica. Basta passar uma string como "3F6D2A"
para a cor ( col
) e um número inteiro base10 ( amt
) para a quantidade clarear ou escurecer. Para escurecer, passe um número negativo (ou seja,-20
).
A razão de eu fazer isso foi por causa de todas as soluções que encontrei, até agora, pareciam complicar demais o problema. E tive a sensação de que isso poderia ser feito com apenas algumas linhas de código. Informe-me se encontrar algum problema ou se tiver algum ajuste a ser feito para acelerar isso.
function LightenDarkenColor(col, amt) {
col = parseInt(col, 16);
return (((col & 0x0000FF) + amt) | ((((col >> 8) & 0x00FF) + amt) << 8) | (((col >> 16) + amt) << 16)).toString(16);
}
// TEST
console.log( LightenDarkenColor("3F6D2A",40) );
Para desenvolvimento, use aqui uma versão mais fácil de ler:
function LightenDarkenColor(col, amt) {
var num = parseInt(col, 16);
var r = (num >> 16) + amt;
var b = ((num >> 8) & 0x00FF) + amt;
var g = (num & 0x0000FF) + amt;
var newColor = g | (b << 8) | (r << 16);
return newColor.toString(16);
}
// TEST
console.log(LightenDarkenColor("3F6D2A", -40));
E, finalmente, uma versão para lidar com cores que podem (ou não) ter o "#" no começo. Além disso, ajuste para valores de cores incorretos:
function LightenDarkenColor(col,amt) {
var usePound = false;
if ( col[0] == "#" ) {
col = col.slice(1);
usePound = true;
}
var num = parseInt(col,16);
var r = (num >> 16) + amt;
if ( r > 255 ) r = 255;
else if (r < 0) r = 0;
var b = ((num >> 8) & 0x00FF) + amt;
if ( b > 255 ) b = 255;
else if (b < 0) b = 0;
var g = (num & 0x0000FF) + amt;
if ( g > 255 ) g = 255;
else if ( g < 0 ) g = 0;
return (usePound?"#":"") + (g | (b << 8) | (r << 16)).toString(16);
}
OK, agora não são apenas algumas linhas, mas parece muito mais simples e se você não estiver usando o "#" e não precisar verificar cores fora do intervalo, são apenas algumas linhas.
Se não estiver usando o "#", basta adicioná-lo no código como:
var myColor = "3F6D2A";
myColor = LightenDarkenColor(myColor,10);
thePlaceTheColorIsUsed = ("#" + myColor);
Acho que minha pergunta principal é: estou correto aqui? Isso não abrange algumas situações (normais)?
fonte
Respostas:
Bem, essa resposta se tornou sua própria fera. Muitas versões novas estavam ficando muito estúpidas. Muito obrigado a todos os muitos contribuidores desta resposta. Mas, para manter as coisas simples para as massas. Arquivei todas as versões / histórico da evolução desta resposta no meu github . E começou tudo de novo no StackOverflow aqui com a versão mais recente. Um agradecimento especial a Mike 'Pomax' Kamermans por esta versão. Ele me deu a nova matemática.
Esta função (
pSBC
) terá uma cor da web HEX ou RGB.pSBC
pode sombrear ou escurecer ou misturar com uma segunda cor e também pode passar direto, mas converter de Hex para RGB (Hex2RGB) ou RGB para Hex (RGB2Hex). Tudo sem você saber que formato de cor você está usando.Isso roda muito rápido, provavelmente o mais rápido, especialmente considerando seus muitos recursos. Foi um longo período de preparação. Veja toda a história no meu github . Se você deseja a maneira absolutamente menor e mais rápida possível de sombrear ou misturar, consulte as Micro Funções abaixo e use um dos demônios de velocidade de 2 linhas. Eles são ótimos para animações intensas, mas esta versão aqui é rápida o suficiente para a maioria das animações.
Esta função usa mistura de log ou mistura linear. No entanto, NÃO converte em HSL para clarear ou escurecer adequadamente uma cor. Portanto, os resultados dessa função serão diferentes das funções muito maiores e mais lentas que usam HSL.
Recursos:
"#AA6622"
ou"#bb551144"
."rgb(123,45,76)"
ou"rgba(45,15,74,0.45)"
."#C41"
torna - se"#CC4411"
.c0
cor (de) ouc1
(para) tiver um canal alfa, a cor retornada terá um canal alfa. Se ambas as cores tiverem um canal alfa, a cor retornada será uma mistura linear dos dois canais alfa usando a porcentagem fornecida (como se fosse um canal de cores normal). Se apenas uma das duas cores tiver um canal alfa, esse alfa será passado apenas para a cor retornada. Isso permite misturar / sombrear uma cor transparente, mantendo o nível de transparência. Ou, se os níveis de transparência também se misturarem, verifique se ambas as cores possuem alfas. Ao sombrear, passará o canal alfa diretamente. Se você deseja sombreamento básico que também sombreie o canal alfa, usergb(0,0,0,1)
ourgb(255,255,255,1)
comoc1
(a) cor (ou seus equivalentes hexadecimais). Para cores RGB, o canal alfa da cor retornada será arredondado para três casas decimais.c0
cor (de); a cor retornada sempre estará no formato de corc1
(para), se houver. Se não houverc1
(para) cor, passe'c'
como ac1
cor e ela sombreará e converterá ac0
cor que for. Se apenas a conversão for desejada, passe0
como porcentagem (p
) também. Se ac1
cor for omitida ou nãostring
-passada, ela não será convertida.pSBCr
pode receber uma cor Hex ou RGB e retorna um objeto que contém essas informações de cores. Está no formato: {r: XXX, g: XXX, b: XXX, a: X.XXX}. Onde.r
,.g
e.b
tem intervalo de 0 a 255. E quando não há alpha:.a
é -1. Caso contrário:.a
tem um intervalo de 0,000 a 1.000.rgba()
sobrergb()
quando uma cor com um canal alfa foi passado emc0
(de) e / ouc1
(a).null
. Um exemplo:,pSBC(0.5,"salt") == null
onde, como pensa,#salt
é uma cor válida. Exclua as quatro linhas que terminam comreturn null;
para remover esse recurso e torná-lo mais rápido e menor.true
paral
(o quarto parâmetro) para usar a mistura linear.Código:
Uso:
A figura abaixo ajudará a mostrar a diferença nos dois métodos de mesclagem:
Micro Funções
Se você realmente deseja velocidade e tamanho, precisará usar RGB e não HEX. O RGB é mais direto e simples, o HEX escreve muito devagar e apresenta muitos sabores para um simples de duas linhas (ou seja, poderia ser um código HEX de 3, 4, 6 ou 8 dígitos). Você também precisará sacrificar alguns recursos, sem verificação de erros, sem HEX2RGB nem RGB2HEX. Além disso, você precisará escolher uma função específica (com base no nome da função abaixo) para a matemática da mistura de cores e se desejar sombreamento ou mistura. Essas funções suportam canais alfa. E quando ambas as cores de entrada tiverem alfas, elas serão combinadas linearmente. Se apenas uma das duas cores tiver um alfa, ele passará direto para a cor resultante. Abaixo estão duas funções de liner incrivelmente rápidas e pequenas:
Quer mais informações? Leia o artigo completo no github .
PT
(Ps Se alguém tiver a matemática para outro método de mistura, compartilhe.)
fonte
tinycolor.darken(color,amount);
function shadeColor2($color, $percent) { $color = str_replace("#", "", $color); $t=$percent<0?0:255; $p=$percent<0?$percent*-1:$percent; $RGB = str_split($color, 2); $R=hexdec($RGB[0]); $G=hexdec($RGB[1]); $B=hexdec($RGB[2]); return '#'.substr(dechex(0x1000000+(round(($t-$R)*$p)+$R)*0x10000+(round(($t-$G)*$p)+$G)*0x100+(round(($t-$B)*$p)+$B)),1); }
8
, adicione10%
você para8.8
qual round9
. Em seguida, tomar9.09%
longe9
e você começa8.1819
. O que faz com8
que seja um mau exemplo. Mas ainda ilustra que está a tomar9.09%
de9
e não8.8
. Portanto, pode haver alguns números que não sejam exatamente iguais aos do meu exemplo aqui.Eu fiz uma solução que funciona muito bem para mim:
Exemplo Lighten:
Exemplo Escurecer:
fonte
R = ((R<255)?R:255).toString(16);
, em seguida,R = R.length==1 ? "0"+R : R
para a velocidade. E eu não tenho certeza do ponto do toUpperCase?var R = parseInt(color.substring(1, 3), 16) var G = parseInt(color.substring(3, 5), 16) var B = parseInt(color.substring(5, 7), 16) if (R == 0) R = 32; if (G == 0) G = 32; if (B == 0) B = 32;
Aqui está um forro super simples, baseado na resposta de Eric
Exemplos:
fonte
Isto é o que eu usei com base em sua função. Prefiro usar etapas acima da porcentagem, porque é mais intuitivo para mim.
Por exemplo, 20% de um valor de 200 azul é muito diferente de 20% de um valor de 40 azul.
De qualquer forma, aqui está a minha modificação, obrigado pela sua função original.
fonte
Eu tentei sua função e houve um pequeno bug: se algum valor final de 'r' tiver apenas 1 dígito, o resultado será semelhante a: 'a0a0a' quando o valor correto for '0a0a0a', por exemplo. Eu apenas o corrigi rapidamente adicionando isso em vez do seu retorno:
Talvez não seja tão legal, mas faça o trabalho. Ótima função, entre. Apenas o que eu precisava. :)
fonte
você pensou em uma conversão rgb> hsl? então basta mover a luminosidade para cima e para baixo? é assim que eu iria.
Uma rápida olhada em alguns algoritmos me deu os seguintes sites.
PHP: http://serennu.com/colour/rgbtohsl.php
Javascript: http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascriptEDITAR o link acima não é mais válido. Você pode visualizar o git hub para a origem da página ou o gist
Como alternativa, outra pergunta sobre StackOverflow pode ser um bom lugar para procurar.
Mesmo que essa não seja a escolha certa para o OP, a seguir é uma aproximação do código que eu estava sugerindo originalmente. (Supondo que você tenha funções de conversão rgb / hsl)
Isso pressupõe:
hslToRgb
ergbToHsl
.colorValue
é uma sequência no formato #RRGGBBEmbora, se estamos discutindo o css, exista uma sintaxe para especificar o hsl / hsla para o IE9 / Chrome / Firefox.
fonte
Versão C # ... observe que estou recebendo seqüências de cores neste formato # FF12AE34 e preciso cortar o #FF.
fonte
int
e doisvars
para o mesmo tipo de dados.Eu queria mudar uma cor para um nível de brilho específico - independentemente do brilho da cor antes - aqui está uma função JS simples que parece funcionar bem, embora eu tenha certeza de que poderia ser menor
fonte
p
tenha alcance0-100
? Eu nem sei como definir corretamente o brilho em RGB, isso é uma coisa HSL. Por exemplo, é#FF00FF
mais brilhante que#FF0000
? Nesse caso, isso significaria que magenta é duas vezes mais brilhante que vermelho. Portanto, o teste de vermelho puro é usado. Passe em vermelho puro#FF0000
, com um brilho de 50%, e aqui chegamos#FF4040
, não é? Eu imaginaria que o brilho seria 50% vermelho, estaríamos ficando mais escuros, visto que já é totalmente brilhante ... como#800000
seria o brilho ou 150%#FF8080
. Rosa é um vermelho mais brilhante? ou o vermelho já está totalmente claro?L
canal é literalmente brilho. Minha questão [mental pessoal] aqui é que, para mim,#FF0000
é totalmente brilhante. E#FF4040
é mais leve, mas não mais brilhante ... para mim, mais leve significa mais perto do branco, como o rosa. E brilho é o quanto ele tem, e seu vermelho está cheio, tão vermelho, está cheio de brilho. Portanto,#FF0000
não pode ser mais brilhante .. mas sim .. mais leve ... talvez eu seja apenas uma aberração, lol !! Eu realmente não sei teoria da cor, sooo, eu realmente estou apenas falando a minha um ...O método a seguir permitirá clarear ou escurecer o valor da exposição de uma sequência de cores Hexadecimal (Hex):
Para o último valor do parâmetro em GetHexFromRGB (), passe um valor duplo em algum lugar entre -1 e 1 (-1 é preto, 0 é inalterado, 1 é branco):
fonte
Como simples cor de sombra em PHP?
fonte
Eu criei uma porta da excelente biblioteca xcolor para remover sua dependência do jQuery. Existem várias funções, incluindo cores claras e escuras.
Realmente, converter hex para RGB é uma função completamente separada das cores claras ou escuras. Mantenha as coisas secas por favor. De qualquer forma, depois de ter uma cor RGB, você pode adicionar a diferença entre o nível de luz desejado e o nível de luz que você possui para cada um dos valores RGB:
Consulte https://github.com/fresheneesz/xolor para obter mais informações sobre a fonte.
fonte
Há muito que eu queria poder produzir matizes / cores, aqui está minha solução JavaScript:
fonte
#
cores hexadecimais. Desculpe se parecia ... "aprovação" ... eu vi isso como revisão por pares. Se você não quer que alguém analise seu código ou ofereça feedback, peço desculpas.Sua abordagem está correta :) Simplifiquei um pouco sua versão mais curta (para controle de saturação, veja aqui )
Mostrar snippet de código
E versão com verificação de # e de cores
Mostrar snippet de código
fonte
Também fiz um pacote simples. Eu usei a convexidade de IR ^ 3, é claro, os valores RGB estão em IN ^ 3, o que não é convexo, então isso não é realmente perfeito
Para escurecer, usei o seguinte
E para clarear
Aqui está o pacote https://github.com/MarchWorks/colortone
Demo https://colortone.now.sh/
com a maneira como estou fazendo as coisas, se você passar uma proporção de -1, você terminará em preto, branco se a proporção for 1. Passando 0, pois a proporção não mudará de cor
fonte
Eu precisava dele em C #, pode ajudar desenvolvedores .net
fonte