색온도

Color temperature

빛의 색을 절대온도(K, 켈빈)로 나타낸 값. 숫자가 낮을수록 따뜻한(붉은) 빛, 높을수록 차가운(푸른) 빛입니다 — 색채 감각의 "난색·한색"과는 반대 방향입니다.

다른 이름: Kelvin scale켈빈 색온도
···
html
<div class="wrap">
  <div class="swatch" id="sw"></div>
  <div class="readout"><b id="kval">3200K</b><span id="klabel">Tungsten</span></div>
  <div class="strip" id="strip"><i id="dot"></i></div>
</div>
css
.wrap{width:min(480px,92%);display:grid;gap:clamp(8px,2.2vmin,14px)}
.swatch{height:clamp(48px,15vmin,70px);border-radius:14px;border:1px solid var(--line)}
.readout{display:flex;justify-content:space-between;align-items:baseline}
.readout b{font:800 clamp(14px,3.6vmin,18px)/1 ui-monospace,monospace;color:var(--fg)}
.readout span{font:700 clamp(9px,2.4vmin,11px)/1 system-ui;color:var(--muted)}
.strip{position:relative;height:clamp(12px,3.2vmin,16px);border-radius:8px;border:1px solid var(--line);cursor:pointer;touch-action:none}
.strip i{position:absolute;top:50%;width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;background:#fff;border:2px solid var(--fg);pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.35)}
js
function kelvinToRgb(k) {
  var temp = k / 100, r, g, b;
  if (temp <= 66) { r = 255; } else { r = 329.698727446 * Math.pow(temp - 60, -0.1332047592); }
  if (temp <= 66) { g = 99.4708025861 * Math.log(temp) - 161.1195681661; } else { g = 288.1221695283 * Math.pow(temp - 60, -0.0755148492); }
  if (temp >= 66) { b = 255; } else if (temp <= 19) { b = 0; } else { b = 138.5177312231 * Math.log(temp - 10) - 305.0447927307; }
  var clampV = function (v) { return Math.max(0, Math.min(255, Math.round(v))); };
  return [clampV(r), clampV(g), clampV(b)];
}
function label(k) {
  if (k < 2200) return 'Candle';
  if (k < 3200) return 'Tungsten';
  if (k < 4500) return 'Fluorescent';
  if (k < 6000) return 'Daylight';
  if (k < 8000) return 'Overcast';
  return 'Blue sky';
}
var MIN = 1500, MAX = 12000;
var k = 3200, autoPlay = true;
var sw = document.getElementById('sw'), kval = document.getElementById('kval'), klabel = document.getElementById('klabel');
var strip = document.getElementById('strip'), dot = document.getElementById('dot');
function buildGradient() {
  var stops = [];
  for (var i = 0; i <= 10; i++) {
    var kk = MIN + (MAX - MIN) * (i / 10);
    var rgb = kelvinToRgb(kk);
    stops.push('rgb(' + rgb.join(',') + ') ' + (i * 10) + '%');
  }
  strip.style.background = 'linear-gradient(90deg,' + stops.join(',') + ')';
}
function render() {
  var rgb = kelvinToRgb(k);
  sw.style.background = 'rgb(' + rgb.join(',') + ')';
  kval.textContent = Math.round(k) + 'K';
  klabel.textContent = label(k);
  dot.style.left = ((k - MIN) / (MAX - MIN) * 100) + '%';
}
buildGradient();
render();
function fromEvent(e) {
  var r = strip.getBoundingClientRect();
  var p = Math.min(1, Math.max(0, (e.clientX - r.left) / r.width));
  k = MIN + p * (MAX - MIN);
  render();
}
strip.addEventListener('pointerdown', function (e) { autoPlay = false; strip.setPointerCapture(e.pointerId); fromEvent(e); });
strip.addEventListener('pointermove', function (e) { if (e.buttons) fromEvent(e); });
(function tick() {
  if (autoPlay) { k += 40; if (k > MAX) k = MIN; }
  render();
  requestAnimationFrame(tick);
})();

색온도는 원래 흑체(black body)를 가열했을 때 나오는 빛의 색을 온도(K)로 표현한 물리량입니다. 촛불은 약 1900K, 백열전구는 약 2700K, 정오의 햇빛은 약 5500~6500K, 흐린 하늘은 약 7000~8000K 정도로 알려져 있습니다 — 실제 조명·환경에 따라 값은 달라질 수 있는 대략적인 기준입니다.

헷갈리기 쉬운 지점은 "따뜻함"의 방향입니다. 디자인에서 난색(따뜻한 색)이라 부르는 빨강·주황은 색온도로는 오히려 낮은(차가운) 쪽 숫자입니다. 반대로 한색이라 부르는 파랑은 색온도로는 높은(뜨거운) 쪽입니다 — 색채 감각의 난색·한색과 물리적 색온도는 서로 반대 방향으로 매핑됩니다.

아래 데모는 Tanner Helland가 공개한 근사식으로 켈빈 값을 RGB로 환산합니다 — 실제 분광 데이터를 조회하는 정밀 변환이 아니라, 시각적으로 그럴듯한 근사치임을 감안하세요. 사진 편집의 화이트 밸런스 슬라이더가 바로 이 개념을 색 보정에 응용한 것입니다.

언제 쓰나

조명 색을 숫자로 다뤄야 할 때(화이트 밸런스, 조명 설계) 씁니다. "난색·한색"이라는 감각적 표현과 방향이 반대라는 점을 헷갈리지 마세요.