16 진수 색상 (또는 RGB 및 색상 혼합)을 프로그래밍 방식으로 밝게 또는 어둡게


503

다음은 프로그래밍 방식으로 16 진수 색상을 특정 양만큼 밝게 또는 어둡게하기 위해 작업 한 기능입니다. 밝게 또는 어둡게 할 양에 대해 "3F6D2A"색상 ( col) 및 base10 정수 ( amt) 와 같은 문자열을 전달하십시오 . 어둡게하려면 음수 (예 :)를 입력 -20하십시오.

내가 이것을 한 이유는 내가 찾은 모든 솔루션 덕분에 지금까지는 문제를 지나치게 복잡하게 만드는 것처럼 보였습니다. 그리고 나는 단지 몇 줄의 코드로 할 수 있다고 생각했습니다. 문제가 발견되면 속도를 높이도록 조정하십시오.

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) );

개발 용으로 여기에 읽기 쉬운 버전이 있습니다.

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));

마지막으로 처음에 "#"가 있거나 없을 수있는 색상을 처리하는 버전입니다. 부적절한 색상 값 조정

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 myColor = "3F6D2A";
myColor = LightenDarkenColor(myColor,10);
thePlaceTheColorIsUsed = ("#" + myColor);

내 주요 질문은 여기에 맞습니까? 이것이 일부 (정상적인) 상황을 포함하지 않습니까?


1
색상을 수정할 때 예상 한 결과를 얻지 못하면 인간의 시각에 더 가까운 LAB 색상 공간을 살펴 보는 것이 좋습니다. 많은 언어에는 변환을위한 라이브러리가 있습니다. 내 경험에 따르면 특히 어둡거나 밝게 할 때 주황색 음영이 문제가 될 수 있습니다.
Henrik

아주 좋은 지적입니다. 그러나이 질문의 주요 목적은 첫째, 가장 빠른 런타임 및 가장 작은 크기 공식을 찾는 것입니다. 그러므로 왜 내가 HSL로 변환하는 것을 다루지 않았습니까? 여기서 속도와 크기가 더 중요합니다. 그러나 내 버전 2의 공식에서 볼 수 있듯이. LERP를 사용하여 음영 처리하면 음영 범위 전체에서 쾌적한 오렌지가 만들어집니다. 아래의 컬러 차트를 살펴보고 해당 쉐이드 범위가 실제 정확도에 가깝지 않은지 알려주십시오.
Pimp Trizkit

여기의 구조와 약간 혼동되었지만, 맞습니다. shadeColor1의 주황색 수준이 매우 좋은 것 같습니다.
Henrik

롤, 당신은 shadeColor2를 의미합니다. 나는 당신이 말하는 구조가 답변 자체의 전체 레이아웃이라고 생각합니다. 더 명확한 힌트가 있습니까?
Pimp Trizkit

3
위의 # 함수에서 한 가지 문제는 마지막 16 진수 코드가 0으로 시작하면 선행 0을 만들지 않는다는 것입니다. 예를 들어 16 진 코드가 # 00a6b7이면 # a6b7로 출력되며 CSS로 사용할 경우 작동하지 않습니다. 반환 줄을 다음과 같이 바꾸면 수정할 수 있습니다. var string = "000000"+ (g | (b << 8) | (r << 16)). toString (16); return (usePound? "#": "") + string.substr (string.length-6);
Rafael Levy

답변:


877

글쎄,이 대답은 그 자신의 짐승이되었습니다. 많은 새로운 버전, 어리석은 짓이 길어졌습니다. 이 답변에 많은 기여를 해주신 모든 분들께 감사드립니다. 그러나 대중을 위해 단순하게 유지하기 위해. 이 답변의 진화에 대한 모든 버전 / 역사를 내 github에 보관했습니다 . 그리고 최신 버전으로 여기에서 StackOverflow를 깨끗하게 시작했습니다. 이 버전에 대해 Mike 'Pomax'Kamermans 에게 특별한 감사를드립니다 . 그는 나에게 새로운 수학을 주었다.


이 기능 ( pSBC)은 16 진수 또는 RGB 웹 색상을 사용합니다. pSBC어둡거나 밝게 음영 처리하거나 두 번째 색상과 혼합하고 오른쪽을 통해 전달할 수도 있지만 16 진수에서 RGB (Hex2RGB) 또는 RGB에서 16 진수 (RGB2Hex)로 변환 할 수도 있습니다. 어떤 색상 형식을 사용하고 있는지조차 모릅니다.

특히 많은 기능을 고려할 때 가장 빠르며 아마도 가장 빠릅니다. 제작에 오랜 시간이 걸렸습니다. 내 github 의 전체 이야기를 참조하십시오 . 가장 작고 빠른 음영 처리 또는 혼합 방법을 원하면 아래의 마이크로 기능을 참조하여 2 라이너 속도 악마 중 하나를 사용하십시오. 강렬한 애니메이션에는 훌륭하지만이 버전은 대부분의 애니메이션에 충분히 빠릅니다.

이 기능은 로그 블렌딩 또는 선형 블렌딩을 사용합니다. 그러나 색상을 올바르게 밝게하거나 어둡게하기 위해 HSL로 변환되지 않습니다. 따라서이 기능의 결과는 HSL을 사용하는 훨씬 크고 느린 기능과 다릅니다 .

pSBC가 포함 된 jsFiddle

github> pSBC 위키

풍모:

  • 문자열 형태의 표준 16 진수 색상을 자동 감지하고 받아들입니다. 예를 들면 다음 "#AA6622"과 같습니다. 또는 "#bb551144".
  • 문자열 형태의 표준 RGB 색상을 자동 감지하고 수용합니다. 예를 들면 다음 "rgb(123,45,76)"과 같습니다. 또는 "rgba(45,15,74,0.45)".
  • 백분율로 색상을 흰색 또는 검은 색으로 음영 처리합니다.
  • 백분율로 색상을 혼합합니다.
  • Hex2RGB와 RGB2Hex 변환을 동시에 수행하거나 단독으로 수행합니다.
  • #RGB (또는 #RGBA) 형식으로 3 자리 (또는 4 자리 (알파 포함) HEX) 색상 코드를 사용할 수 있습니다. 그것들을 확장시킬 것입니다. 예를 들면 다음과 같습니다 "#C41"된다 "#CC4411".
  • 알파 채널을 수락하고 (선형) 혼합합니다. 중 하나 경우 c0(에서) 색상 또는 c1(을) 색상은 알파 채널을 가지고, 다음 반환 된 색상은 알파 채널을해야합니다. 두 색상에 모두 알파 채널이있는 경우 반환 된 색상은 주어진 비율 (일반 색상 채널 인 것처럼)을 사용하여 두 알파 채널의 선형 혼합입니다. 두 색상 중 하나에 만 알파 채널이있는 경우이 알파는 반환 된 색상으로 전달됩니다. 이를 통해 투명도 수준을 유지하면서 투명 색상을 혼합 / 음영 할 수 있습니다. 또는 투명도 수준도 혼합해야하는 경우 두 색상에 모두 알파가 있는지 확인하십시오. 음영 처리시 알파 채널을 통해 직선으로 전달됩니다. 당신은 또한 알파 채널을 음영 기본 음영을 원한다면, 사용 rgb(0,0,0,1)또는 rgb(255,255,255,1)같은c1(to) 색상 (또는 해당하는 16 진수). RGB 색상의 경우 반환 된 색상의 알파 채널은 소수점 이하 3 자리로 반올림됩니다.
  • 블렌딩을 사용할 때 RGB2Hex 및 Hex2RGB 변환은 암시 적입니다. c0(from) 색상에 관계없이 ; 반환 된 색상은 항상 c1(to) 색상 의 색상 형식입니다 (있는 경우). 어떤이없는 경우 c1(에) 색상, 다음 통과 'c'는 AS의 c1색상과 그늘과 어떤 변환됩니다 c0색상입니다. 변환 만 필요한 경우 0백분율 ( p) 로도 전달 하십시오 . 경우 c1색상이 생략 또는 비가 string전달되고,이 변환하지 않습니다.
  • 보조 기능도 전역에 추가됩니다. pSBCr16 진수 또는 RGB 색상을 전달할 수 있으며이 색상 정보가 포함 된 객체를 반환합니다. {r : XXX, g : XXX, b : XXX, a : X.XXX} 형식입니다. 여기서 .r, .g.b범위는 0 ~ 255입니다. 알파가없는 경우 : .a-1입니다. 그렇지 않은 경우 : .a범위는 0.000 ~ 1.000입니다.
  • RGB 출력의 경우 알파 채널이있는 색상이 (시작) 및 / 또는 ( rgba()끝) rgb()으로 전달되면 출력 됩니다 .c0c1
  • 사소한 오류 검사가 추가되었습니다. 완벽하지 않습니다. 여전히 충돌하거나 혼란 스러울 수 있습니다. 그러나 그것은 약간의 물건을 잡을 것입니다. 기본적으로 구조가 어떤 방식으로 잘못되었거나 백분율이 숫자가 아니거나 범위를 벗어나면을 반환 null합니다. 예를 들어 pSBC(0.5,"salt") == null, #salt올바른 색상 이라고 생각 합니다. return null;이 기능을 제거하기 위해 끝나는 네 줄을 삭제하고 더 빠르고 작게 만드십시오.
  • 로그 블렌딩을 사용합니다. 패스 true에 대한의 l선형 혼합을 사용 (4 매개 변수).

암호:

// Version 4.0
const pSBC=(p,c0,c1,l)=>{
    let r,g,b,P,f,t,h,i=parseInt,m=Math.round,a=typeof(c1)=="string";
    if(typeof(p)!="number"||p<-1||p>1||typeof(c0)!="string"||(c0[0]!='r'&&c0[0]!='#')||(c1&&!a))return null;
    if(!this.pSBCr)this.pSBCr=(d)=>{
        let n=d.length,x={};
        if(n>9){
            [r,g,b,a]=d=d.split(","),n=d.length;
            if(n<3||n>4)return null;
            x.r=i(r[3]=="a"?r.slice(5):r.slice(4)),x.g=i(g),x.b=i(b),x.a=a?parseFloat(a):-1
        }else{
            if(n==8||n==6||n<4)return null;
            if(n<6)d="#"+d[1]+d[1]+d[2]+d[2]+d[3]+d[3]+(n>4?d[4]+d[4]:"");
            d=i(d.slice(1),16);
            if(n==9||n==5)x.r=d>>24&255,x.g=d>>16&255,x.b=d>>8&255,x.a=m((d&255)/0.255)/1000;
            else x.r=d>>16,x.g=d>>8&255,x.b=d&255,x.a=-1
        }return x};
    h=c0.length>9,h=a?c1.length>9?true:c1=="c"?!h:false:h,f=this.pSBCr(c0),P=p<0,t=c1&&c1!="c"?this.pSBCr(c1):P?{r:0,g:0,b:0,a:-1}:{r:255,g:255,b:255,a:-1},p=P?p*-1:p,P=1-p;
    if(!f||!t)return null;
    if(l)r=m(P*f.r+p*t.r),g=m(P*f.g+p*t.g),b=m(P*f.b+p*t.b);
    else r=m((P*f.r**2+p*t.r**2)**0.5),g=m((P*f.g**2+p*t.g**2)**0.5),b=m((P*f.b**2+p*t.b**2)**0.5);
    a=f.a,t=t.a,f=a>=0||t>=0,a=f?a<0?t:t<0?a:a*P+t*p:0;
    if(h)return"rgb"+(f?"a(":"(")+r+","+g+","+b+(f?","+m(a*1000)/1000:"")+")";
    else return"#"+(4294967296+r*16777216+g*65536+b*256+(f?m(a*255):0)).toString(16).slice(1,f?undefined:-2)
}

용법:

// Setup:

let color1 = "rgb(20,60,200)";
let color2 = "rgba(20,60,200,0.67423)";
let color3 = "#67DAF0";
let color4 = "#5567DAF0";
let color5 = "#F3A";
let color6 = "#F3A9";
let color7 = "rgb(200,60,20)";
let color8 = "rgba(200,60,20,0.98631)";

// Tests:

/*** Log Blending ***/
// Shade (Lighten or Darken)
pSBC ( 0.42, color1 ); // rgb(20,60,200) + [42% Lighter] => rgb(166,171,225)
pSBC ( -0.4, color5 ); // #F3A + [40% Darker] => #c62884
pSBC ( 0.42, color8 ); // rgba(200,60,20,0.98631) + [42% Lighter] => rgba(225,171,166,0.98631)

// Shade with Conversion (use "c" as your "to" color)
pSBC ( 0.42, color2, "c" ); // rgba(20,60,200,0.67423) + [42% Lighter] + [Convert] => #a6abe1ac

// RGB2Hex & Hex2RGB Conversion Only (set percentage to zero)
pSBC ( 0, color6, "c" ); // #F3A9 + [Convert] => rgba(255,51,170,0.6)

// Blending
pSBC ( -0.5, color2, color8 ); // rgba(20,60,200,0.67423) + rgba(200,60,20,0.98631) + [50% Blend] => rgba(142,60,142,0.83)
pSBC ( 0.7, color2, color7 ); // rgba(20,60,200,0.67423) + rgb(200,60,20) + [70% Blend] => rgba(168,60,111,0.67423)
pSBC ( 0.25, color3, color7 ); // #67DAF0 + rgb(200,60,20) + [25% Blend] => rgb(134,191,208)
pSBC ( 0.75, color7, color3 ); // rgb(200,60,20) + #67DAF0 + [75% Blend] => #86bfd0

/*** Linear Blending ***/
// Shade (Lighten or Darken)
pSBC ( 0.42, color1, false, true ); // rgb(20,60,200) + [42% Lighter] => rgb(119,142,223)
pSBC ( -0.4, color5, false, true ); // #F3A + [40% Darker] => #991f66
pSBC ( 0.42, color8, false, true ); // rgba(200,60,20,0.98631) + [42% Lighter] => rgba(223,142,119,0.98631)

// Shade with Conversion (use "c" as your "to" color)
pSBC ( 0.42, color2, "c", true ); // rgba(20,60,200,0.67423) + [42% Lighter] + [Convert] => #778edfac

// RGB2Hex & Hex2RGB Conversion Only (set percentage to zero)
pSBC ( 0, color6, "c", true ); // #F3A9 + [Convert] => rgba(255,51,170,0.6)

// Blending
pSBC ( -0.5, color2, color8, true ); // rgba(20,60,200,0.67423) + rgba(200,60,20,0.98631) + [50% Blend] => rgba(110,60,110,0.83)
pSBC ( 0.7, color2, color7, true ); // rgba(20,60,200,0.67423) + rgb(200,60,20) + [70% Blend] => rgba(146,60,74,0.67423)
pSBC ( 0.25, color3, color7, true ); // #67DAF0 + rgb(200,60,20) + [25% Blend] => rgb(127,179,185)
pSBC ( 0.75, color7, color3, true ); // rgb(200,60,20) + #67DAF0 + [75% Blend] => #7fb3b9

/*** Other Stuff ***/
// Error Checking
pSBC ( 0.42, "#FFBAA" ); // #FFBAA + [42% Lighter] => null  (Invalid Input Color)
pSBC ( 42, color1, color5 ); // rgb(20,60,200) + #F3A + [4200% Blend] => null  (Invalid Percentage Range)
pSBC ( 0.42, {} ); // [object Object] + [42% Lighter] => null  (Strings Only for Color)
pSBC ( "42", color1 ); // rgb(20,60,200) + ["42"] => null  (Numbers Only for Percentage)
pSBC ( 0.42, "salt" ); // salt + [42% Lighter] => null  (A Little Salt is No Good...)

// Error Check Fails (Some Errors are not Caught)
pSBC ( 0.42, "#salt" ); // #salt + [42% Lighter] => #a5a5a500  (...and a Pound of Salt is Jibberish)

// Ripping
pSBCr ( color4 ); // #5567DAF0 + [Rip] => [object Object] => {'r':85,'g':103,'b':218,'a':0.941}

아래 그림은 두 가지 혼합 방법의 차이점을 보여줍니다.


마이크로 기능

속도와 크기를 정말로 원한다면 16 진수가 아닌 RGB를 사용해야합니다. RGB는 더 간단하고 간단합니다. HEX는 쓰기 속도가 너무 느리고 간단한 두 줄짜리 (IE, 3, 4, 6 또는 8 자리 HEX 코드 일 수 있음)에 비해 너무 많은 맛이 있습니다. 또한 일부 기능, 오류 검사, HEX2RGB 또는 RGB2HEX를 희생해야합니다. 또한 색상 혼합 수학 및 음영 또는 혼합을 원하는 경우 특정 기능 (아래의 기능 이름을 기준으로)을 선택해야합니다. 이 기능은 알파 채널을 지원합니다. 두 입력 색상에 모두 알파가 있으면 선형 혼합됩니다. 두 색상 중 하나에 만 알파가있는 경우 결과 색상으로 그대로 전달됩니다. 다음은 매우 빠르고 작은 두 가지 라이너 기능입니다.

const RGB_Linear_Blend=(p,c0,c1)=>{
    var i=parseInt,r=Math.round,P=1-p,[a,b,c,d]=c0.split(","),[e,f,g,h]=c1.split(","),x=d||h,j=x?","+(!d?h:!h?d:r((parseFloat(d)*P+parseFloat(h)*p)*1000)/1000+")"):")";
    return"rgb"+(x?"a(":"(")+r(i(a[3]=="a"?a.slice(5):a.slice(4))*P+i(e[3]=="a"?e.slice(5):e.slice(4))*p)+","+r(i(b)*P+i(f)*p)+","+r(i(c)*P+i(g)*p)+j;
}

const RGB_Linear_Shade=(p,c)=>{
    var i=parseInt,r=Math.round,[a,b,c,d]=c.split(","),P=p<0,t=P?0:255*p,P=P?1+p:1-p;
    return"rgb"+(d?"a(":"(")+r(i(a[3]=="a"?a.slice(5):a.slice(4))*P+t)+","+r(i(b)*P+t)+","+r(i(c)*P+t)+(d?","+d:")");
}

const RGB_Log_Blend=(p,c0,c1)=>{
    var i=parseInt,r=Math.round,P=1-p,[a,b,c,d]=c0.split(","),[e,f,g,h]=c1.split(","),x=d||h,j=x?","+(!d?h:!h?d:r((parseFloat(d)*P+parseFloat(h)*p)*1000)/1000+")"):")";
    return"rgb"+(x?"a(":"(")+r((P*i(a[3]=="a"?a.slice(5):a.slice(4))**2+p*i(e[3]=="a"?e.slice(5):e.slice(4))**2)**0.5)+","+r((P*i(b)**2+p*i(f)**2)**0.5)+","+r((P*i(c)**2+p*i(g)**2)**0.5)+j;
}

const RGB_Log_Shade=(p,c)=>{
    var i=parseInt,r=Math.round,[a,b,c,d]=c.split(","),P=p<0,t=P?0:p*255**2,P=P?1+p:1-p;
    return"rgb"+(d?"a(":"(")+r((P*i(a[3]=="a"?a.slice(5):a.slice(4))**2+t)**0.5)+","+r((P*i(b)**2+t)**0.5)+","+r((P*i(c)**2+t)**0.5)+(d?","+d:")");
}

더 많은 정보를 원하십니까? github 에서 전체 쓰기를 읽으십시오 .

PT

(Ps 다른 블렌딩 방법에 대한 수학이 있다면 공유하십시오.)


8
필요한 사람들을위한 PHP 버전 : gist.github.com/chaoszcat/5325115#file-gistfile1-php
Lionel Chan

28
TinyColor를 사용 했습니다tinycolor.darken(color,amount);
FWrnr

4
위대한 게시물 ... :) ... 방금 그것의 스위프트 확장을 만들었습니다 : gist.github.com/matejukmar/1da47f7a950d1ba68a95
Matej Ukmar

2
다음은 업데이트 된 shadeColor2 버전 용 PHP 버전입니다. 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); }
Kevin M

2
미안, 나는 그 점을 분명히 놓쳤다. 두 가지 이유가있을 수 있습니다. 첫 번째로 명백한 것은 Math.Round를 사용하고 정확한 색상을 지정하기 위해 10 진수를 사용할 수 없다는 것입니다 (색상에는 16 진수가 없습니다). 예를 들어, 빨간색 채널이 인 8경우 추가 10%8.8라운드를 추가 하십시오 9. 그런 다음을 9.09%빼면 9얻을 수 8.1819있습니다. 어느 것으로 반올림 8하면 나쁜 예입니다. 하지만 여전히 당신이 복용하고 있음을 보여 9.09%9하지 8.8. 따라서 여기에 나와있는 예제와 정확히 일치하지 않는 숫자가있을 수 있습니다.
Pimp Trizkit

121

나는 나를 위해 아주 좋은 해결책을 만들었습니다.

function shadeColor(color, percent) {

    var R = parseInt(color.substring(1,3),16);
    var G = parseInt(color.substring(3,5),16);
    var B = parseInt(color.substring(5,7),16);

    R = parseInt(R * (100 + percent) / 100);
    G = parseInt(G * (100 + percent) / 100);
    B = parseInt(B * (100 + percent) / 100);

    R = (R<255)?R:255;  
    G = (G<255)?G:255;  
    B = (B<255)?B:255;  

    var RR = ((R.toString(16).length==1)?"0"+R.toString(16):R.toString(16));
    var GG = ((G.toString(16).length==1)?"0"+G.toString(16):G.toString(16));
    var BB = ((B.toString(16).length==1)?"0"+B.toString(16):B.toString(16));

    return "#"+RR+GG+BB;
}

예를 들어 밝게 :

shadeColor("#63C6FF",40);

어둡게하는 예 :

shadeColor("#63C6FF",-40);

4
좋아, 나는 백분율을 좋아한다! +1 Tho, 나는 속도 R = ((R<255)?R:255).toString(16);R = R.length==1 ? "0"+R : R위해 할 것 입니다. 그리고 toUpperCase의 요점이 확실하지 않습니까?
Pimp Trizkit

불필요합니다. 테스트하는 동안 예쁜 인쇄를 위해 추가합니다. 편집하겠습니다.
Pablo

아주 좋아요 그러나 어떤 색상이든지 100 % 밝아지면 완전히 흰색이 아니고 100 % 어두워 져야합니다. -100은 색상을 검은 색으로 만들지 만 100 (양수)은 완전히 흰색으로 만들지 않습니다.
Kevin M

4
# ff0000, # 00ff00, # 0000ff와 같은 단색에서는 작동하지 않습니다
Hitori

그것이 검은 색으로 작동하게하기 위해 방금이 해킹을 했어 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;
Irfan Raza

21

여기에 Eric의 답변을 바탕으로 한 매우 간단한 라이너가 있습니다.

function adjust(color, amount) {
    return '#' + color.replace(/^#/, '').replace(/../g, color => ('0'+Math.min(255, Math.max(0, parseInt(color, 16) + amount)).toString(16)).substr(-2));
}

예 :

adjust('#ffffff', -20) => "#ebebeb"
adjust('000000', 20) => "#141414"

7
"슈퍼 간단".
Andrew

5

이것이 내가 당신의 기능에 따라 사용한 것입니다. 나는 더 직관적이기 때문에 백분율보다 단계를 사용하는 것을 선호합니다.

예를 들어 200 파랑 값의 20 %는 40 파랑 값의 20 %와 크게 다릅니다.

어쨌든, 원래 기능에 감사드립니다.

function adjustBrightness(col, amt) {

    var usePound = false;

    if (col[0] == "#") {
        col = col.slice(1);
        usePound = true;
    }

    var R = parseInt(col.substring(0,2),16);
    var G = parseInt(col.substring(2,4),16);
    var B = parseInt(col.substring(4,6),16);

    // to make the colour less bright than the input
    // change the following three "+" symbols to "-"
    R = R + amt;
    G = G + amt;
    B = B + amt;

    if (R > 255) R = 255;
    else if (R < 0) R = 0;

    if (G > 255) G = 255;
    else if (G < 0) G = 0;

    if (B > 255) B = 255;
    else if (B < 0) B = 0;

    var RR = ((R.toString(16).length==1)?"0"+R.toString(16):R.toString(16));
    var GG = ((G.toString(16).length==1)?"0"+G.toString(16):G.toString(16));
    var BB = ((B.toString(16).length==1)?"0"+B.toString(16):B.toString(16));

    return (usePound?"#":"") + RR + GG + BB;

}

상단 답변이 내 색상을 어둡게하는 대신 매우 강렬하게 만들었으므로 상단 답변보다 훨씬 유용하다는 것을 알았습니다. 건배 Eric
Worm

4

함수를 시도했는데 약간의 버그가 있습니다. 예를 들어 일부 최종 'r'값이 1 자리이면 결과는 다음과 같이 나타납니다. 예를 들어 올바른 값이 '0a0a0a'인 경우 'a0a0a'입니다. 방금 반환 대신 다음을 추가하여 방금 수정했습니다.

var rStr = (r.toString(16).length < 2)?'0'+r.toString(16):r.toString(16);
var gStr = (g.toString(16).length < 2)?'0'+g.toString(16):g.toString(16);
var bStr = (b.toString(16).length < 2)?'0'+b.toString(16):b.toString(16);

return (usePound?"#":"") + rStr + gStr + bStr;

어쩌면 그렇게 좋지는 않지만 일을합니다. 훌륭한 기능, BTW. 내가 필요한 것만 :)


1
디버그와 칭찬에 감사드립니다! 더 빠른 방법이 있는지 없는지에 대한 대답이 너무 나쁘다. 이것이 나의 주요 질문이다. 모든 16 진수를 사용하고 기본 변환을 사용하지 않는 것 같습니다. 도, 내가 올바른 코드 (+1)를 가지고 있다고 말한 것 같습니다. 불행히도이 수정은 오버 헤드 (현재 6 번의 String 호출)를 훨씬 더 많이 추가하고 KISS를 약간 줄였습니다. base16 변환 전에 base10 숫자가 15 이하인지 확인하는 것이 더 빠를 수도 있습니다. 하지만 난 좋아한다!
Pimp Trizkit

4

RGB> hsl 변환에 대해 생각해 보셨습니까? 광도를 위아래로 움직입니까? 그것이 내가 갈 길입니다.

일부 알고리즘을 간략히 살펴보면 다음 사이트를 얻었습니다.

PHP : http://serennu.com/colour/rgbtohsl.php

자바 스크립트 : http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript

위 링크를 수정 하면 더 이상 유효하지 않습니다. 페이지 소스 또는 요지에 대한 자식 허브를 볼 수 있습니다

또는 다른 StackOverflow 질문 을 살펴 보는 것이 좋습니다.


이것이 OP에 대한 올바른 선택은 아니지만 다음은 원래 제안했던 코드의 근사치입니다. (rgb / hsl 변환 기능이 있다고 가정)

var SHADE_SHIFT_AMOUNT = 0.1; 

function lightenShade(colorValue)
{
    if(colorValue && colorValue.length >= 6)
    {
        var redValue = parseInt(colorValue.slice(-6,-4), 16);
        var greenValue = parseInt(colorValue.slice(-4,-2), 16);
        var blueValue = parseInt(colorValue.slice(-2), 16);

        var hsl = rgbToHsl(redValue, greenValue, blueValue);
        hsl[2]= Math.min(hsl[2] + SHADE_SHIFT_AMOUNT, 1);
        var rgb = hslToRgb(hsl[0], hsl[1], hsl[2]);
        return "#" + rgb[0].toString(16) + rgb[1].toString(16) + rgb[2].toString(16);
    }
    return null;
}

function darkenShade(colorValue)
{
    if(colorValue && colorValue.length >= 6)
    {
        var redValue = parseInt(colorValue.slice(-6,-4), 16);
        var greenValue = parseInt(colorValue.slice(-4,-2), 16);
        var blueValue = parseInt(colorValue.slice(-2), 16);

        var hsl = rgbToHsl(redValue, greenValue, blueValue);
        hsl[2]= Math.max(hsl[2] - SHADE_SHIFT_AMOUNT, 0);
        var rgb = hslToRgb(hsl[0], hsl[1], hsl[2]);
        return "#" + rgb[0].toString(16) + rgb[1].toString(16) + rgb[2].toString(16);
    }
    return null;
}

이것은 다음을 가정합니다.

  1. 당신은 기능을 가지고 hslToRgbrgbToHsl.
  2. 매개 변수 colorValue#RRGGBB 형식의 문자열입니다.

CSS를 논의하고 있지만 IE9 / Chrome / Firefox에 hsl / hsla 를 지정하는 구문이 있습니다.


흥미롭지 만 16 진수 문자열에서 RGB로 변환하여 HSL로 변환하지 않아도됩니까? 더 복잡한 것 같습니다. 어쩌면 뭔가 빠졌을 수도 있습니다. 그러나 가능한 한 빨리 (실행 시간) KISS 방법을 찾고 있습니다. 이상적으로, 16 진수로 모든 것을 할 수 있다면 가장 빠를 것입니다. 그러나 여기에서 개발 한 솔루션에는 rgb를 사용하여 증분 금액을 추가 할 수 있습니다.
Pimp Trizkit

예, 느리고 복잡 할 것으로 가정하고 rgb를 사용하여 hsl 변환을 사용하지 않으면 가장 단순한 솔루션이 아닐 것입니다. 그러나 나는 색이 많은 사람이 아니지만 RGB 값에 추가하는 것보다 더 정확합니다. 그것은 모두 당신이 얼마나 정확하게되고 싶어하는지에 달려 있습니다.
James Khoury

언급 한 정확도의 손실은 무엇입니까? 나는 당신이 모든 [웹] 색상이 RGB 또는 다른 것으로 도달 할 수 없다는 것을 의미한다고 가정합니까?
Pimp Trizkit

내가 말했듯이 나는 색상에 대해 많이 모른다 : wiki Color Theory
James Khoury

@Pimp Trizkit : 시작한 색상의 양에 상관없이 각 채널을 같은 양으로 이동하기 때문에 정확도가 떨어집니다. 내가 생각 하는 당신이 (백분율로) 가까이 서로 채널을 가져 있기 때문에 채도를 감소 될 것입니다. 물론 오버플로 / 언더 플로 인 경우 어쨌든 피할 수 없습니다.
Matthew Crumley

2

C # 버전 ... # FF12AE34 형식의 색상 문자열이 표시되며 #FF를 잘라 내야합니다.

    private string GetSmartShadeColorByBase(string s, float percent)
    {
        if (string.IsNullOrEmpty(s))
            return "";
        var r = s.Substring(3, 2);
        int rInt = int.Parse(r, NumberStyles.HexNumber);
        var g = s.Substring(5, 2);
        int gInt = int.Parse(g, NumberStyles.HexNumber);
        var b = s.Substring(7, 2);
        int bInt = int.Parse(b, NumberStyles.HexNumber);

        var t = percent < 0 ? 0 : 255;
        var p = percent < 0 ? percent*-1 : percent;

        int newR = Convert.ToInt32(Math.Round((t - rInt) * p) + rInt);
        var newG = Convert.ToInt32(Math.Round((t - gInt) * p) + gInt);
        var newB = Convert.ToInt32(Math.Round((t - bInt) * p) + bInt);

        return String.Format("#{0:X2}{1:X2}{2:X2}", newR, newG, newB);
    }

5
이전에 C #을 사용한 적이 없지만 마지막 3 개의 변수 선언이 우선합니다. 동일한 유형의 데이터에 대한 하나 int와 둘 vars.
Pimp Trizkit

4
C #의 var 키워드는 컴파일러가 컴파일 타임에 형식을 유추하도록합니다. 따라서 위의 예제에서 int와 var는 같은 유형-int로 변수를 정의합니다. 긴 유형 이름이 있거나 익명 유형을 참조하려는 경우 유용합니다. user1618171에 두 가지 변수 선언 스타일이 혼합되어 있기 때문에 이상합니다.
Daniel James Bryars

2

색상이 특정 밝기 레벨 로 변경되기를 원했습니다. 이전 색상의 밝기에 관계없이 더 짧을 수는 있지만 잘 작동하는 간단한 JS 함수가 있습니다.

function setLightPercentage(col: any, p: number) {
    const R = parseInt(col.substring(1, 3), 16);
    const G = parseInt(col.substring(3, 5), 16);
    const B = parseInt(col.substring(5, 7), 16);
    const curr_total_dark = (255 * 3) - (R + G + B);

    // calculate how much of the current darkness comes from the different channels
    const RR = ((255 - R) / curr_total_dark);
    const GR = ((255 - G) / curr_total_dark);
    const BR = ((255 - B) / curr_total_dark);

    // calculate how much darkness there should be in the new color
    const new_total_dark = ((255 - 255 * (p / 100)) * 3);

    // make the new channels contain the same % of available dark as the old ones did
    const NR = 255 - Math.round(RR * new_total_dark);
    const NG = 255 - Math.round(GR * new_total_dark);
    const NB = 255 - Math.round(BR * new_total_dark);

    const RO = ((NR.toString(16).length === 1) ? "0" + NR.toString(16) : NR.toString(16));
    const GO = ((NG.toString(16).length === 1) ? "0" + NG.toString(16) : NG.toString(16));
    const BO = ((NB.toString(16).length === 1) ? "0" + NB.toString(16) : NB.toString(16));

    return "#" + RO + GO + BO;}

쿨 리오! p범위가 있다고 가정 0-100합니까? RGB에서 밝기를 올바르게 정의하는 방법조차 모릅니다 .HSL입니다. 예를 들어 ? #FF00FF보다 밝습니다 #FF0000. 그렇다면 마젠타가 빨강보다 두 배 밝다는 것을 의미합니다. 따라서 순수한 적색 테스트가 사용됩니다. 순수한 빨간색 #FF0000으로 전달하고 50 % 밝기로 설정하면 여기 #FF4040에 맞습니까? 나는 붉은 색을 50 %로 만드는 것으로 추측했는데 어두워 질 것입니다. 이미 완전히 밝아진 것을 볼 #800000수 있습니다 #FF8080. 분홍색이 더 밝은 빨간색입니까? 아니면 이미 완전히 밝습니까?
Pimp Trizkit

네 말이 맞아-p는 1-100 범위에 있어야한다고 언급 했어야합니다!
Torbjörn Josefsson

# FF00FF는 빨간색 채널에서 255, 녹색 채널에서 0, 파란색 채널에서 255를 갖습니다. 채널에서 결합 된 값이 높을수록 색상의 밝기가 높아집니다. 숫자 p는 새 색상이 원래 색상보다 50 % 밝아지기를 원한다는 것을 나타냅니다. # FF4040이 "최대 50 % 밝은 빨간색"에 대한 정답이라고 100 %는 아닙니다. 더 어두운 음영을 생성하려면 (이 경우 빨간색 채널에서 더 낮은 값으로) 수정해야합니다.
Torbjörn Josefsson

예, RGB의 밝기에 대한 모호성을 지적했습니다. HSL로 변환되면 L채널은 문자 그대로 밝기입니다. 나의 [개인적인 정신] 문제는 나에게 #FF0000완전히 밝다는 것입니다. 그리고 #FF4040더 가볍지 만 밝지 않습니다 .... 나에게 가벼움은 분홍색과 같이 흰색에 더 가깝다는 것을 의미합니다. 그리고 밝기는 얼마를 얻었는지, 빨간색이 가득 찼으므로 빨간색이 너무 밝습니다. 따라서, #FF0000더 밝게 만들 수 없습니다 .. 오히려 오히려 .. 더 가벼워 요 ... 어쩌면 난 그냥 괴물, 롤 !! 난 정말 색 이론을 몰라, sooo, 난 정말 그냥 내 얘기를 해요 ...
Pimp Trizkit

그러나 모니터의 밝기를 변경하면 Reds가 분홍색으로 변하지 않는다는 것을 알고 있습니다. 그래서 이것은 아마도 내가 논리를 시작한 곳일 것입니다.
Pimp Trizkit

1

다음 방법을 사용하면 16 진 색상 문자열의 노출 값을 밝게하거나 어둡게 할 수 있습니다.

private static string GetHexFromRGB(byte r, byte g, byte b, double exposure)
{
    exposure = Math.Max(Math.Min(exposure, 1.0), -1.0);
    if (exposure >= 0)
    {
        return "#"
            + ((byte)(r + ((byte.MaxValue - r) * exposure))).ToString("X2")
            + ((byte)(g + ((byte.MaxValue - g) * exposure))).ToString("X2")
            + ((byte)(b + ((byte.MaxValue - b) * exposure))).ToString("X2");
    }
    else
    {
        return "#"
            + ((byte)(r + (r * exposure))).ToString("X2")
            + ((byte)(g + (g * exposure))).ToString("X2")
            + ((byte)(b + (b * exposure))).ToString("X2");
    }

}

GetHexFromRGB ()의 마지막 매개 변수 값의 경우 -1과 1 사이의 이중 값을 전달하십시오 (-1은 검은 색, 0은 변경되지 않음, 1은 흰색 임).

// split color (#e04006) into three strings
var r = Convert.ToByte("e0", 16);
var g = Convert.ToByte("40", 16);
var b = Convert.ToByte("06", 16);

GetHexFromRGB(r, g, b, 0.25);  // Lighten by 25%;

0

PHP에서 간단한 색조를 만드는 방법?

<?php
function shadeColor ($color='#cccccc', $percent=-25) {

  $color = Str_Replace("#",Null,$color);

  $r = Hexdec(Substr($color,0,2));
  $g = Hexdec(Substr($color,2,2));
  $b = Hexdec(Substr($color,4,2));

  $r = (Int)($r*(100+$percent)/100);
  $g = (Int)($g*(100+$percent)/100);
  $b = (Int)($b*(100+$percent)/100);

  $r = Trim(Dechex(($r<255)?$r:255));  
  $g = Trim(Dechex(($g<255)?$g:255));  
  $b = Trim(Dechex(($b<255)?$b:255));

  $r = ((Strlen($r)==1)?"0{$r}":$r);
  $g = ((Strlen($g)==1)?"0{$g}":$g);
  $b = ((Strlen($b)==1)?"0{$b}":$b);

  return (String)("#{$r}{$g}{$b}");
}

echo shadeColor(); // #999999

이것은 파블로의 대답의 PHP 버전입니다. 불행히도 최종 솔루션보다 길고 느리며 색상이 정확하게 밝아지지 않습니다. 그것들을 정확하게 어둡게합니다. 순수한 빨간색 (# FF0000)으로 테스트하면 25 %의 밝게 (# FF4040)가됩니다. 최종 솔루션 v2의 Kevin M의 PHP 버전에 대한 내 답변의 끝을 확인하십시오.
Pimp Trizkit

0

jQuery 의존성을 제거하기 위해 우수한 xcolor 라이브러리의 포트를 만들었습니다. 밝고 어두워지는 색상을 포함하여 많은 기능이 있습니다.

실제로 16 진수를 RGB로 변환하는 것은 밝거나 어두워지는 색상과는 완전히 별개의 기능입니다. 물건을 건조하게 유지하십시오. 어쨌든 RGB 색상을 얻은 후에는 원하는 조명 수준과 필요한 조명 수준의 차이를 각 RGB 값에 추가하면됩니다.

var lightness = function(level) {
    if(level === undefined) {
        return Math.max(this.g,this.r,this.b)
    } else {
        var roundedLevel = Math.round(level) // fractions won't work here
        var levelChange = roundedLevel - this.lightness()

        var r = Math.max(0,this.r+levelChange)
        var g = Math.max(0,this.g+levelChange)
        var b = Math.max(0,this.b+levelChange)

        if(r > 0xff) r = 0xff
        if(g > 0xff) g = 0xff
        if(b > 0xff) b = 0xff

        return xolor({r: r, g: g, b: b})
    }
}

var lighter = function(amount) {
    return this.lightness(this.lightness()+amount)
}

자세한 소스는 https://github.com/fresheneesz/xolor 를 참조 하십시오 .


OP (속도 / 크기 / 정확도)와 관련된 코드를 아직 분석하지 않았습니다. 그러나 처음 읽을 때 몇 가지 의견이 있습니다 : 1) 16 진수를 RGB로 변환하는 것은 완전히 별개의 기능으로 간주 될 수 있음에 동의합니다. 내 문제가 건조 기능으로 해결되어야하는 경우, 요구 사항은 아닙니다. 여기서 의도는 매우 빠르고 매우 작은 답변 (2 라인!)과 16 진수 색상을 밝게하고 어둡게 한 답변 (자체 독립형으로)에 대한 답변 (내 버전 2 참조)이었습니다. 함수. 따라서 최종 사용시 간단한 단일 함수 호출이됩니다. <cont.>
Pimp Trizkit

2) 그리고 인기있는 요구에 따라 버전 3의 경우 가능한 한 빠르고 독립적으로 완전히 독립 된 자체 포함 된 범용 기능을 사용하여 16 진수 또는 RGB 색상을 맹목적으로 취할 수 있습니다. 변형. 따라서 16 진수를 RGB로 변환해야합니다. <cont.>
Pimp Trizkit

3) 간단한 코드 분석시. 훨씬 느리게 실행되는 것으로 보이며 내 버전 2보다 훨씬 큽니다 (이것은 내 OP에 대한 진정한 대답입니다. 버전 3은 대중을위한 것입니다). 공평하게, 나는이 코드를 변환하지 않고 건조에 대한 당신의 요점에 대답하는 RGB 버전 2와 비교해야합니다. 그리고 진실로 말해서, 귀하의 포트는 16 진수 용 2 라이너보다 이해하기가 훨씬 간단하지 않습니다. 따라서 건조기는되지만 실제로는 그다지 단순하지 않습니다. (건조 함은 이해 능력에 큰 도움이되지 않았습니다) <cont.>
Pimp Trizkit

4) 원하는 경우 내 RGB 버전 2는 변환 없음 2 라인 기능입니다. 원래의 OP에 대한 나의 특정 솔루션은 16 진법을 원했습니다. 그렇기 때문에 버전 2에는 두 가지 유형이 있습니다. 그러나 건조 및 16 진 변환에 대한 요점을 언급하므로 버전 3에 중점을두고 있습니다. 버전 3은 훨씬 후에 나왔습니다. 버전 2가 인기를 얻은 후에 만. <cont.>
Pimp Trizkit

5) 건조 함은 일반적으로 보편성에 도움이된다는 데 동의합니다. 대부분의 경우 이해하기 쉽도록합니다. 불행히도이 예제에서는 비용이 듭니다. 이러한 비용은 스택에서 (재귀와 유사한) 스택과 글로벌 (2 함수, v2와 비교하여) 모두에서 훨씬 더 크고 겉으로는 훨씬 느리고 더 많은 메모리를 사용하는 것입니다.
포주 트리즈 킷

0

나는 색조의 색조 / 음영을 생성 할 수 있기를 오랫동안 원했습니다. 내 JavaScript 솔루션은 다음과 같습니다.

const varyHue = function (hueIn, pcIn) {
    const truncate = function (valIn) {
        if (valIn > 255) {
            valIn = 255;
        } else if (valIn < 0)  {
            valIn = 0;
        }
        return valIn;
    };

    let red   = parseInt(hueIn.substring(0, 2), 16);
    let green = parseInt(hueIn.substring(2, 4), 16);
    let blue  = parseInt(hueIn.substring(4, 6), 16);
    let pc    = parseInt(pcIn, 10);    //shade positive, tint negative
    let max   = 0;
    let dif   = 0;

    max = red;

    if (pc < 0) {    //tint: make lighter
        if (green < max) {
            max = green;
        }

        if (blue < max) {
            max = blue;
        }

        dif = parseInt(((Math.abs(pc) / 100) * (255 - max)), 10);

        return leftPad(((truncate(red + dif)).toString(16)), '0', 2)  + leftPad(((truncate(green + dif)).toString(16)), '0', 2) + leftPad(((truncate(blue + dif)).toString(16)), '0', 2);
    } else {    //shade: make darker
        if (green > max) {
            max = green;
        }

        if (blue > max) {
            max = blue;
        }

        dif = parseInt(((pc / 100) * max), 10);

        return leftPad(((truncate(red - dif)).toString(16)), '0', 2)  + leftPad(((truncate(green - dif)).toString(16)), '0', 2) + leftPad(((truncate(blue - dif)).toString(16)), '0', 2);
    }
};

일부 사용 예가 도움이 될 것입니다. 그리고 왜이 버전이 다른 버전보다 더 좋은지에 대한 설명이있을 수 있습니다. 이 버전은 상당히 느리게 실행되는 것 같습니다. 그리고 훨씬 더. 그리고 정확하게 음영 처리되지 않는 것 같습니다. LERP 또는 이와 유사한 것을 사용하는 것처럼 보입니다. 불행히도 하나의 채널에서만 발생하며 모든 채널에서 동일한 값이 사용됩니다. 정확도를 높이려면 각 채널을 개별적으로 LERP해야합니다. 이 질문에 대한 나의 대답처럼. 더 작고 더 빠르며 오류를 확인하고 RGB를 처리하고 변환을 수행합니다.
Pimp Trizkit

사용법 예 : varyHue ( "6e124c", 77) 여기서 첫 번째 인수는 16 진 색상이고 두 번째 인수는 백분율 변경입니다. 양수 백분율은 음영을 어둡게 (어둡게)하는 반면 음수 값은 결과를 색조 (밝게)로 만듭니다. 이 페이지를 방문하기 몇 시간 전에 첫 번째 시도로 루틴을 작성하여 관심의 대상으로 게시했습니다. 나는 당신의 노력을 개선해야하거나 그렇게하기 전에 당신의 승인이 필요하다는 것을 알지 못했습니다. 그것은 다른 사람을 언급하지 않고 전적으로 내 자신의 일입니다. LERP에 대해 들어 본 적이 없습니다. 제안 해 주셔서 감사합니다.
user2655360

물론, 당신은 아무것도 할 필요가 없습니다! 그리고 우리 모두는 당신의 노력에 감사드립니다! 나의 첫 번째 주요 관심사는 첫 번째로 나열된 것들이었습니다. 투표 할 수 있도록 답변을 도와 주려고합니다. (사용법 및 작동 방식에 대한 설명 등을 보여줍니다.) 다른 것들은 모든 사람의 지식을 향상 시키는 데 도움이되는 빠른 분석 입니다. 조금 공격적인 것 같으면 미안합니다. 그러나 또 다른 제안은 #16 진수 색상을 받아들이는 것 입니다. "approval"이라고 생각되면 죄송합니다. 동료 평가로 보았습니다. 다른 사람이 귀하의 코드를 분석하거나 피드백을 제공하지 못하게하려는 경우 사과드립니다.
Pimp Trizkit

0

귀하의 접근 방식은 괜찮습니다 :) 가장 짧은 버전을 약간 단순화합니다 (채도 제어를 보려면 여기를 참조 하십시오 ).

(col,amt)=> (+('0x'+col)+amt*0x010101).toString(16).padStart(6,0)

# 및 색상 범위 확인 버전


0

나는 간단한 패키지도 만들었다. IR ^ 3의 볼록 함을 사용했습니다. 물론 RGB 값은 IN ^ 3에 있습니다. 볼록하지 않으므로 이것이 완벽하지 않습니다.

어둡게하기 위해 다음을 사용했습니다.

for (let i = 0; i < rgb.length; i++) {
   rgb[i] = Math.floor(rgb[i] - ratio * rgb[i]);
}

그리고 밝게

for (let i = 0; i < rgb.length; i++) {
   rgb[i] = Math.ceil(rgb[i] + ratio * (255 - rgb[i]));
}

여기 패키지가 있습니다 https://github.com/MarchWorks/colortone

데모 https://colortone.now.sh/

비율이 -1을 통과하면 내가하는 일을하는 방식으로 비율이 1이면 검은 색, 흰색으로 끝납니다. 비율이 0이므로 색이 변하지 않습니다.


0

C #에서 필요했는데 .net 개발자에게 도움이 될 수 있습니다.

public static string LightenDarkenColor(string color, int amount)
    {
        int colorHex = int.Parse(color, System.Globalization.NumberStyles.HexNumber);
        string output = (((colorHex & 0x0000FF) + amount) | ((((colorHex >> 0x8) & 0x00FF) + amount) << 0x8) | (((colorHex >> 0xF) + amount) << 0xF)).ToString("x6");
        return output;
    }

선행 0을 처리하지 않는 "비 작동"기능을 변환하여 합계에서 FF를 초과 할 수 있습니다. = 위의 색상 구성 요소를 수정하십시오.
B.

함수를 시도했을 때 16 진수가 아닌 값 (16 = 0xF) 및 (8 = 0x8) 때문에 작동하지 않고 8 위치에서 색상을 제공하지만 이제는 잘 작동합니다.
Nassim

FF에서 증가 시키려고 했습니까? (는 0xFFFFFF + 0x000004에서 말) : 그 최대 값 이상의 코드 롤들이 할 수있는 가장 큰 변화 인 00로 2 위 색상 구성 요소의 증가, 특히 설정 (0x1000003에게 말), 대신하지 ...
B를

당신이 옳습니다, fff와 000의 범위의 입력이 잘 작동한다는 것을 제외하고는 말에 감사드립니다.
Nassim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.