关于计算深色十六进制颜色的问题

时间:2018-01-10 20:52:46

标签: javascript

使用this solution我试图计算颜色的较暗范围,但输出看起来不像正确的十六进制值!(缺少一个值)

> #84079
你可以告诉我我做错了吗?

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);
  
}
var firstColor = LightenDarkenColor("#3068A1", -20); 
var NewColor = LightenDarkenColor(firstColor, -20); 

console.log(NewColor);

1 个答案:

答案 0 :(得分:3)

改变这个:

(usePound?"#":"") + (g | (b << 8) | (r << 16)).toString(16);

到这个

(usePound?"#":"") + ('00000'+(b | (g << 8) | (r << 16)).toString(16)).slice(-6);

这将确保有6位数字,它会修复原始文章中关闭的绿色和蓝色位置。

  • (r << 16)将红色移至第32至47位
  • (g << 8)将绿色移动到位16到31
  • b在0-15位留下蓝色。

更新

正如所指出的,bg变量也正在读取错误的值。所以你也想做以下事情:

var g = ((num >> 8) & 0x00FF) + amt;

var b = (num & 0x0000FF) + amt;

交换bg获取其值的位置。

如果您不想换掉那些,请将原来的行改为:

(usePound?"#":"") + ('00000'+(g | (b << 8) | (r << 16)).toString(16)).slice(-6);