이 사진이 있습니다 :
화살표는 서로 다른 두 가지 색상을 표시하지만 실제로는 같은 색상이지만 약간 밝거나 어둡습니다.
나는 내가 만든 응용 프로그램의 스크린 샷을 만들었고 가장자리의 갈색 색상은 30과 합쳐진 파란색입니다. 실제 색상에 30을 추가하면 트릭을 수행하지 않습니다. 그림 물감.
주어진 색상을 어떻게 밝게하거나 어둡게 만들 수 있습니까?
알파로 반투명하게 보이려면 어떻게해야합니까?
이 사진이 있습니다 :
화살표는 서로 다른 두 가지 색상을 표시하지만 실제로는 같은 색상이지만 약간 밝거나 어둡습니다.
나는 내가 만든 응용 프로그램의 스크린 샷을 만들었고 가장자리의 갈색 색상은 30과 합쳐진 파란색입니다. 실제 색상에 30을 추가하면 트릭을 수행하지 않습니다. 그림 물감.
주어진 색상을 어떻게 밝게하거나 어둡게 만들 수 있습니까?
알파로 반투명하게 보이려면 어떻게해야합니까?
답변:
멋진 질문입니다.
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 변형을 사용하여 알파를 포함 할 수도 있습니다.
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에 대해 문의해야합니다.
색상을 보지 않고 손으로 색상의 명암을 변경하려는 경우 수동으로. 16 진수 또는 rgb
에서 각 채널에 동일한 양의 빛을 추가하거나 빼기 만하면 정말 쉽습니다 .
rgb에서 132,145,167이 있다고 가정하면 각 숫자에 30을 더하여 같은 색상의 더 밝은 버전을 얻을 수 있습니다. 16 진수와 동일하지만 16 진수입니다. 따라서 e4c3d5는 e4 c3 d5입니다. 16을 더하여 f4d3e5를 더 밝게 만들거나 16을 빼서 같은 색상의 d4b3c5를 더 어두운 버전으로 만들 수 있습니다.
원하는만큼 더하거나 빼기를 할 수 있으며, 세 채널 모두에 같은 금액을 추가하는 한 (세 개의 숫자 모두) 한 가지 방법 만 변경하면 초과 근무를 더하고 빼는 올바른 금액을 더 잘 추측 할 수 있습니다. 혼합물에서 첨가하거나 제거 할 때 훨씬 더 흰색.