주어진 색상을 조금 더 어둡거나 밝게 만드는 방법은 무엇입니까?


9

이 사진이 있습니다 :

그림 물감

화살표는 서로 다른 두 가지 색상을 표시하지만 실제로는 같은 색상이지만 약간 밝거나 어둡습니다.

나는 내가 만든 응용 프로그램의 스크린 샷을 만들었고 가장자리의 갈색 색상은 30과 합쳐진 파란색입니다. 실제 색상에 30을 추가하면 트릭을 수행하지 않습니다. 그림 물감.

실제 색상

주어진 색상을 어떻게 밝게하거나 어둡게 만들 수 있습니까?

알파로 반투명하게 보이려면 어떻게해야합니까?


나는이 질문을 주제에 맞지 않기로 투표했다.
joojaa

3
색상과 음영 색상에 대한 수학을 논의하여 다양한 색상의 변형을 생성하기 때문에 기술적으로 여전히 그래픽 디자인 문제입니다.
Vlad

1
아니요 16 진 변환에 대해 설명합니다. 나는 색 질문에 대해서는 괜찮을 것이지만 당신은 더 이상 당신의 주장을 충족시키기 위해 계산 환경에 너무 많이 묶었습니다. 그래서 당신은 그것을 자바 스크립트 및 마크 업 노드 질문이되도록 지정했으며 그래픽 디자인이 아닙니다.
joojaa

1
의문의 여지가 없습니다. 색상을 어둡거나 밝게하려면 어떻게해야합니까? 16 진수 값으로의 변환은 유용한 추가 기능이지만 필수 사항은 아닙니다.
Vlad

1
나는 논쟁하지 않을 것이다. 나는 색상과 그 작동 방식을 이해하지 못하고 누군가가 나를 위해 코딩 할 코드가 아닌 "방법"을 요구하고있었습니다.
Vlad

답변:


13

멋진 질문입니다.

16 진 값으로 작업하려면 RGB 값의 상대적인 비율로 생각해야합니다.

문자가 아닌 숫자로 스케일을 사용하므로 그 뒤에 수학을 볼 수 있습니다.

오렌지가 있다고 상상해보십시오.

R255 G128 B0 값을 가질 수 있습니다

더 어두운 색을 원하면 값을 50 %로 줄여야합니다.

이것은 당신에게 줄 것이다 R128 G64 B0 모든 색상이 비례 척도를 사용하여 수정 된 것을 알 수 있습니다.

보다 복잡한 색상은 R255 G200 B100 일 수 있습니다 . 이전 색상보다 어둡게하자. 80 % 만 어둡게하겠습니다.

R255x0.8 G200x0.8 B100x0.8 = R204 G160 B80

하나의 색상을 더 밝게 만드는 아이디어는 거의 동일하지만 색상이 255로 제한되므로 더 까다롭기 때문에 255와 값의 차이를 생각할 수 있습니다.

예를 들어 같은 주황색

R255 G128 B0

더 이상 R을 늘릴 수 없으며 같은 값으로 녹색과 파란색을 증가시킬 수 없습니다 (예 : 100 이상).

R255 G228 B100

너무 노란색입니다.

수학은

1) 255와 현재 값 (R255 G128 B0)의 차이는 다음과 같습니다. R0 G127 B255

2) 더 밝은 오렌지색을 50 % 만들자

3) Rx50 % Gx50 % Bx50 % = R0 G64 B128

4) 초기 값에 추가하십시오 : R255 + 0 G128 + 64 B0 + 128 = R255 G192 B128.

기본 아이디어를 제공하기 위해 이미지를 추가하고 있습니다. RGB 값은 게으른 작업 때문에 내 텍스트와 동일하지 않지만 주황색 "계단"이 고유 비율을 유지한다는 것을 알 수 있습니다.

여기에 이미지 설명을 입력하십시오

편집

나는 너무 바보입니다. HSL 색상 표기법을 사용할 수도 있습니다.

{background-color : hsl (45, 60 %, 70 %);}로 더 어두운 색상의 경우 세 번째 색상을 수정하고 밝은 색상의 경우 두 번째 및 세 번째 색상을 수정하십시오.

hsla 변형을 사용하여 알파를 포함 할 수도 있습니다.


이것이 브라우저 인 경우
오프 코스 그것은

예, JS / 브라우저 애플리케이션 그러나 Js는 # 345464 형식의 색상을 인식하지 못합니다. parseInt (hashString.replace ( '#', ''), 16);을 사용합니다. 여기서 hashString은 # 345464와 같은 CSS 형식 색상입니다.
Vlad

당신은 당신이 원하는대로 숫자를 번역합니다. 나는 그것이 숫자를 사용하고 있다고 말했기 때문에 그 뒤에있는 수학을 볼 수 있습니다. 그러나 원칙은 동일합니다. 8은 F의 절반입니다.
Rafael

그리고 항상 rgba (255,128,0,1) 표기법을 사용할 수 있습니다.
라파엘

실제로 Canvas 요소를 사용하고 순수 JS이며 CSS가 없습니다. 그러나 코드로 이것을 해결하는 방법에 대한 아이디어가 있습니다.
Vlad

2

JavaScript는 색상을 16 진수로 모델링하지 않으며 시스템도 모델링하지 않습니다. 16 진 표기법은 사람이 읽을 수있는 문서를위한 것입니다. 내부적으로 시스템은 3 개의 정수 값을 저장합니다. 그것들을 직접 쿼리하고 조작 할 수 있습니다.

그러나 시스템 내부 대신 실제 문서를 조작한다고 가정 해 봅시다. 그런 다음 계산을 연기하는 일부 라이브러리로 연기하는 것이 가장 좋습니다. 브라우저는 여러 가지 방법으로 색상을 나타낼 수 있으므로 ad rgb 및 hsv 입력과 같은 모든 종류의 경우를 프로그래밍해야합니다. 따라서 Color.js 와 같은 것을 사용하는 것이 좋습니다. 혼합, 어둡게, 밝게 등을 직접 구현할 필요가 없으므로 많은 두통을 덜어줍니다.

편집 :

이 작업을 직접하고 싶을 때 권장하지 않습니다. hexarepresentation을 0-1 범위의 정수 또는 부동 소수점 숫자의 숫자 삼중으로 변환하여 시작하면 계산이 더 쉬워집니다.

이제 색상 변환 RGB 값을 HSL 또는 HSB로 쉽게 조작 할 수 있으므로 밝기 계산이 간단합니다 (Wikipedia에 공식화). 그런 다음 밝기 또는 밝기를 더하거나 뺍니다. 실제 조명 시뮬레이션의 경우 밝은 색상에 기본 색상을 곱하면 계산이 쉽습니다. 따라서 중립 빛의 경우 간단하게 :

결과 = 강도 * 색

라파엘이 설명했듯이 공식은 컬러 채널로 반복됩니다. 다음을 수행하여 컬러 조명을 시뮬레이션 할 수 있습니다

결과 = 강도 * LigtColor * 색상

플로팅으로 변환하는 것이 가장 좋으며 선형 일 수도 있습니다. 이것은 당신의 지역에서 따뜻하고 시원한 빛을 허용하여보다 자연스러운 느낌을 줄 수 있습니다.

알파 블렌딩 (다른 색상의 레이어 이미지)은 간단합니다.

결과 = ColorTop * alpha + ColorBottom * (1-alpha)

최종 편집

마지막으로 여기에 당신이 요구하는 것에 뭔가를하는 코드가 있습니다. 이것이보기 어려운 이유는 현재 추상적 인 형태이기 때문입니다. 여기에서 사용 가능한 라이브 코드

여기에 이미지 설명을 입력하십시오

이미지 1 : 아래 코드 결과는 라이브 버전 도 참조하십시오 .

{
  var canvas = document.getElementById('canvas');
  if (canvas.getContext) {
    var ctx = canvas.getContext('2d');

    var Color = function(r, g, b) {
      this.r = r;
      this.g = g;
      this.b = b;
    }
    Color.prototype.asHex = function() {
      return "#" + ((1 << 24) + (this.r << 16) + (this.g << 8) + this.b).toString(16).slice(1);
    }
    Color.prototype.asRGB = function() {
      return 'rgb(' + this.r + ',' + this.g + ',' + this.b + ')';
    }
    Color.prototype.blendWith = function(col, a) {
      r = Math.round(col.r * (1 - a) + this.r * a);
      g = Math.round(col.g * (1 - a) + this.g * a);
      b = Math.round(col.b * (1 - a) + this.b * a);
      return new Color(r, g, b);
    }
    Color.prototype.Mul = function(col, a) {
      r = Math.round(col.r/255 * this.r * a);
      g = Math.round(col.g/255 * this.g * a);
      b = Math.round(col.b/255 * this.b * a);
      return new Color(r, g, b);
    }
    Color.prototype.fromHex = function(hex) {
      // http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb
      hex = hex.substring(1,7)
      var bigint = parseInt(hex, 16);
      this.r = (bigint >> 16) & 255;
      this.g = (bigint >> 8) & 255;
      this.b = bigint & 255;
    }

    ctx.font = "16px Arial";
    ctx.fillText("Manual Alpha Blend", 18, 20);

    var a = new Color(220, 0, 150);

    var b = new Color();
    b.fromHex('#00C864');

    //Alpha blend
    ctx.fillStyle = a.asHex();
    ctx.fillRect(25, 25, 100, 100);
    ctx.fillStyle = '#FFFFFF';
    ctx.fillText(a.asHex(), 30, 45);
    ctx.fillStyle = b.asRGB()
    ctx.fillRect(50, 50, 100, 100);
    ctx.fillStyle = '#FFFFFF';
    ctx.fillText(a.asHex(), 55, 145);
    var bl = a.blendWith(b, 0.3);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(50, 50, 75, 75);
    ctx.fillStyle = '#FFFFFF';
    ctx.fillText(bl.asHex(), 55, 70);

    // lighten 1

    ctx.fillStyle = '#000000';
    ctx.fillText('Neutral Light', 200, 20);

    var c = new Color(100, 100, 100);
    var purelight= new Color(255, 255, 255);

    ctx.fillStyle = c.asRGB();
    ctx.fillRect(200, 25, 100, 100);

    var bl = c.Mul(purelight,1.2);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(225, 50, 100, 100);

    var bl = c.Mul(purelight, 0.8);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(250, 75, 100, 100);

     // lighten 2

    ctx.fillStyle = '#000000';
    ctx.fillText('Yellowish Light', 400, 20);

    var c = new Color(100, 100, 100);
    var yellowlight= new Color(255, 255, 220);

    var bl = c.Mul(yellowlight,1.0);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(400, 25, 100, 100);

    var bl = c.Mul(yellowlight,1.2);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(425, 50, 100, 100);

    var bl = c.Mul(yellowlight, 0.8);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(450, 75, 100, 100);
  }
}

추신 : 실제로 대부분이 stackoverfow에서 발견 될 수 있기 때문에 stackoverflow에 대해 문의해야합니다.


이 라이브러리는 독립형 일 수 있습니까?
Vlad

@ 블라드 내가 이유가없는 이유를 볼 확신합니다.
joojaa

시도했지만 일부 NodeJS 모듈을 사용하지만 타사 라이브러리에서 앱을 무겁게 만들고 싶지 않습니다. 내 자신의 코드를 만들려고합니다.
Vlad

@Vlad는 두피 코드를 추가했습니다
joojaa

: D 와우, 환상적인 작품!
Vlad

1

색상을 보지 않고 손으로 색상의 명암을 변경하려는 경우 수동으로. 16 진수 또는 rgb 에서 각 채널에 동일한 양의 빛을 추가하거나 빼기 만하면 정말 쉽습니다 .
rgb에서 132,145,167이 있다고 가정하면 각 숫자에 30을 더하여 같은 색상의 더 밝은 버전을 얻을 수 있습니다. 16 진수와 동일하지만 16 진수입니다. 따라서 e4c3d5는 e4 c3 d5입니다. 16을 더하여 f4d3e5를 더 밝게 만들거나 16을 빼서 같은 색상의 d4b3c5를 더 어두운 버전으로 만들 수 있습니다.
원하는만큼 더하거나 빼기를 할 수 있으며, 세 채널 모두에 같은 금액을 추가하는 한 (세 개의 숫자 모두) 한 가지 방법 만 변경하면 초과 근무를 더하고 빼는 올바른 금액을 더 잘 추측 할 수 있습니다. 혼합물에서 첨가하거나 제거 할 때 훨씬 더 흰색.


멋있는! 이것은 비코 더에 너무 쉽고 도움이되었습니다!
brookdancer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.