以编程方式使十六进制颜色变暗

时间:2009-11-24 00:53:11

标签: colors hex

以编程方式使十六进制颜色变暗的最简单方法是什么?

10 个答案:

答案 0 :(得分:36)

如果你没有太多的控制权,只想要一个颜色较深的版本,那么:

col = (col & 0xfefefe) >> 1;

将颜色值减半是一种很好的快速方法(假设它显然是按通道打包为一个字节)。

同样明亮的是:

col = (col & 0x7f7f7f) << 1;

答案 1 :(得分:25)

将十六进制颜色转换为整数RBG组件:

#FF6600 = rbg(255, 102, 0)

如果你想让它变暗5%,那么只需将所有整数值减少5%:

255 - 5% = 242
102 - 5% = 96
0 - 5% = 0

= rbg(242, 96, 0)

转换回十六进制颜色

= #F26000

答案 2 :(得分:18)

在javascript中实现的功能:

// credits: richard maloney 2006
function getTintedColor(color, v) {
    if (color.length >6) { color= color.substring(1,color.length)}
    var rgb = parseInt(color, 16); 
    var r = Math.abs(((rgb >> 16) & 0xFF)+v); if (r>255) r=r-(r-255);
    var g = Math.abs(((rgb >> 8) & 0xFF)+v); if (g>255) g=g-(g-255);
    var b = Math.abs((rgb & 0xFF)+v); if (b>255) b=b-(b-255);
    r = Number(r < 0 || isNaN(r)) ? 0 : ((r > 255) ? 255 : r).toString(16); 
    if (r.length == 1) r = '0' + r;
    g = Number(g < 0 || isNaN(g)) ? 0 : ((g > 255) ? 255 : g).toString(16); 
    if (g.length == 1) g = '0' + g;
    b = Number(b < 0 || isNaN(b)) ? 0 : ((b > 255) ? 255 : b).toString(16); 
    if (b.length == 1) b = '0' + b;
    return "#" + r + g + b;
} 

示例:

> getTintedColor("ABCEDEF", 10)
> #c6f7f9

答案 3 :(得分:13)

好吧,我没有任何伪代码,但提示。如果要使颜色变暗并保持其色调,则应将该十六进制转换为HSB(色调,饱和度,亮度)而不是RGB。这样,您可以调整亮度,它仍然看起来像没有色调偏移的相同颜色。然后,您可以将该HSB转换回十六进制。

答案 4 :(得分:5)

given arg darken_factor # a number from 0 to 1, 0=no change, 1=black
for each byte in rgb_value
    byte = byte * (1 - darken_factor)

答案 5 :(得分:3)

  • 将十六进制颜色拆分为RGB组件。
  • 将每个组件转换为整数值。
  • 将整数乘以一个分数,例如0.5,确保结果也是整数。
    • 或者,从该整数中减去一个设定数量,确保不低于0.
  • 将结果转换回十六进制。
  • 按RGB顺序连接这些值,然后使用。

答案 6 :(得分:3)

我拼凑了一个漂亮的双线功能:

Programmatically Lighten or Darken a hex color (or rgb, and blend colors)

shadeColor2(hexcolor,-0.05) 5%更暗

shadeColor2(hexcolor,-0.25) 25%更暗

使用积极的方法进行闪电。

答案 7 :(得分:1)

您应该考虑使L * a * b *颜色空间中的颜色变暗。以下是使用chroma.js的JavaScript中的示例:

chroma.hex("#FCFC00").darker(10).hex()  // "#dde000"

答案 8 :(得分:1)

通过调整阴影,按键,亮度或亮度,RGB颜色(十六进制RGB表示法)变得更暗或更亮。参观游乐场:colorizer.org

选项1.将R,G,B值翻译为变暗

这个很简单,但容易搞砸。这里从每个值减去(0,255)标度的16个点:

myHex = 0x8c36a9;
darkerHex = myHex - 0x101010;
#  0x7c2699;

如果R,G,B值中的任何一个为0x0f或更低,则十六进制将下溢。像这样的东西会解决这个问题。

myHex = 0x87f609;
darkenBy = 0x10;
floor = 0x0;

darkerHex = (max((myHex >> 16) - darkenBy, floor) << 16) + \
    (max(((myHex & 0xff00) >> 8) - darkenBy, floor) << 8) + \
    max(((myHex & 0xff) - darkenBy), floor);
# 0x77e600

# substitute `ceiling=0xff;` and `min((myHex ...) + lightenBy, ceiling)` for lightening

选项2.缩放R,G,B值以增加黑色

CMYK模型中,键(黑色)为1 - 最大值为(0,1)的R,G,B值。

这个很简单,你可以在没有太多代码的情况下获得好的结果。您将通过单个缩放因子重新调整R,G,B值的分布。

将缩放系数表示为2位十六进制(因此50%为.5*0x1000x80,1/16为0x10,10%向下舍入为0x19 )。

#  Assumes integer division ... looking at you python3 >:(

myHex = 0x8c36a9;
keyFactor = 0x10;                   #  Lighten or darken by 6.25%
R = myHex >> 16;                    #  0x8c
G = (myHex & 0xff00) >> 8;          #  0x36
B = myHex & 0xff;                   #  0xa9

darkerHex = ((R-R*keyFactor/0x100) << 16) +  # Darker R
            ((G-G*keyFactor/0x100) << 8) +   # Darker G
            (B-B*keyFactor/0x100);           # Darker B
#  0x84339f

#  substitute `(X+keyFactor-X*keyFactor/0x100)` for lightening 
#  0x9443af

选项3.在恒定色调下降低亮度或亮度

在RGB的HSL表示中,亮度是R,G,B值的最小值和最大值之间的中点。对于HSV,亮度是R,G,B值的最大值。

考虑使用您的语言的内置或外部RGB / HEX到HSL / HSV转换器。然后调整L / V值并转换回RGB / HSL。您可以手动进行转换,如#1&amp; #2,但实施可能无法在现有转换器上保存任何时间(请参阅数学链接)。

答案 9 :(得分:0)

六角形颜色,如#FCFCFC,由三对代表RGB组成。每对的第二部分可以缩小以使任何颜色变暗而不会显着改变颜色。

例如。要使#FCFCFC变暗,请降低C的值以给出#F0F0F0

减少每对的第一部分也会使颜色变暗,但是你会开始更多地影响颜色(例如,将绿色变为蓝色)。