代码之家  ›  专栏  ›  技术社区  ›  mk12

以编程方式使十六进制颜色变暗[关闭]

  •  31
  • mk12  · 技术社区  · 16 年前

    10 回复  |  直到 9 年前
        1
  •  37
  •   NoDataDumpNoContribution    10 年前

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

    这是一种将颜色值减半的快速方法(显然,假设每个通道压缩一个字节)。

    以同样的方式,将是:

    col = (col & 0x7f7f7f) << 1;
    
        2
  •  26
  •   lubos hasko    16 年前

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

    #FF6600 = rbg(255, 102, 0)
    

    如果要使其暗5%,只需将所有整数值减少5%:

    255 - 5% = 242
    102 - 5% = 96
    0 - 5% = 0
    
    = rbg(242, 96, 0)
    

    转换回十六进制颜色

    = #F26000
    
        3
  •  19
  •   miku    16 年前

    // 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
    
        4
  •  13
  •   Nate B    16 年前

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

        5
  •  5
  •   John Zwinck    16 年前
    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)
    
        6
  •  3
  •   Community Mohan Dere    9 年前

    我拼凑了一个很好的两线性函数:

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

    shadeColor2(hexcolor,-0.05)

    shadeColor2(hexcolor,-0.25) 颜色深25%

    用正片照明。

        7
  •  2
  •   Adam Bellaire    16 年前
    • 将十六进制颜色拆分为其RGB组件。
    • 将每个组件转换为整数值。
    • 将该整数乘以一个分数,例如 0.5 ,确保结果也是整数。
    • 按RGB顺序连接这些值,然后使用。
        8
  •  2
  •   Dave    9 年前

    RGB颜色(十六进制RGB表示法)通过调整阴影、关键点、亮度或亮度而变暗或变亮。参观操场: colorizer.org


    这个很简单,但很容易搞糟。以下是从每个值中减去(0255)刻度的16个点:

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

    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值的最大值。

    .5*0x100 0x80 ,1/16是 0x10 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。在恒定色调下降低亮度或亮度

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

        9
  •  1
  •   gka    13 年前

    您应该考虑在L*A*B*颜色空间中加深颜色。下面是一个JavaScript示例,使用 chroma.js

    chroma.hex("#FCFC00").darker(10).hex()  // "#dde000"
    
        10
  •  0
  •   adrianbanks    16 年前

    例如,要使#fcfc变暗,请降低C的值以给出#f0