SLOHERO
08

PHOTOSHOT / DEVELOPMENT JOURNAL

흑백 사진도
색상별로 밝기 조절

빨간 옷과 파란 배경을 모두 흑백으로 바꿔도, 두 부분의 밝기는 따로 조절할 수 있습니다. 포토샷은 원래 색을 먼저 읽고 그 색에 해당하는 회색 밝기를 계산합니다.

조정 레이어 08 · 흑백
2026.10.01 · SLOHERO · 공개 코드 v0.16.0 기준
보정 전흑백 보정 전 AI 생성 인물 예시
보정 후흑백 보정 후 AI 생성 인물 예시
사진과 패널은 기존 릴스 제작 자료입니다. AI 생성 인물 사진을 사용했으며, 계산 도표와 수치는 공개 코드 v0.16.0을 별도로 실행해 확인했습니다.

08편은 채도를 0으로 만드는 기능과 다릅니다. 색상별 슬라이더가 흑백 결과에 어떻게 반영되는지 살펴보고, 마지막에 따뜻한 색조를 넣는 과정까지 연결합니다.

  1. 01빨강과 노랑을 올려 얼굴 밝기 조절하기
  2. 02원래 색상각으로 두 슬라이더를 고르기
  3. 03채널 최솟값에 색의 차이를 더합니다
  4. 04흑백이 완성된 뒤 따뜻한 색조 넣기
  5. 05자동 흑백과 사진에서 직접 고르는 버튼
01

빨강과 노랑을 올려 얼굴 밝기 조절하기

예제는 빨강 75, 노랑 90입니다. 나머지는 기본값인 초록 40·청록 60·파랑 20·자홍 80을 유지했습니다. 피부에서 흔히 나타나는 빨강과 노랑 계열의 흑백 밝기를 올린 설정입니다.

패널의 색 이름은 최종 사진에 남길 색이 아닙니다. 원본에서 그 색에 가까운 부분을 얼마나 밝은 회색으로 바꿀지 정하는 값입니다. 피부 전용 조절은 아니므로 같은 색의 사물도 영향을 받습니다.

위의 보정 후 사진에는 마지막 단계의 색조 입히기까지 포함되어 있습니다. 옆의 화면은 색조를 넣기 전, 빨강과 노랑의 밝기를 조절하는 부분입니다.

슬라이더는 −100~300 범위입니다. 값이 크다고 항상 디테일이 더 잘 보이는 것은 아닙니다. 계산 결과가 흰색이나 검정으로 제한되면 그 부분의 차이는 줄어듭니다.

빨강75 노랑90으로 설정한 흑백 조정 패널
빨강·노랑 슬라이더 부분만 표시했습니다. 전체 조작 화면 보기 ↗
02

원래 색상각으로 두 슬라이더를 고르기

픽셀의 RGB를 HSL로 바꿔 색상각을 읽습니다. 색상 원을 빨강·노랑·초록·청록·파랑·자홍의 여섯 구간으로 나누고, 양옆 두 슬라이더의 값을 섞습니다.

const pos = h * 6;
const i = Math.floor(pos) % 6;
const f = pos - Math.floor(pos);
const weight = (
  v['color' + i] * (1 - f)
  + v['color' + ((i + 1) % 6)] * f
) / 100;

예를 들어 색상각 30°는 빨강 0°와 노랑 60°의 중간입니다. 빨강 75와 노랑 90을 절반씩 섞으면 가중치는 0.825가 됩니다. 인접한 색이 서로 전혀 다른 밝기로 끊기지 않게 연결하는 방식입니다.

순색 여섯 개의 기본 흑백 결과와 빨강 노랑 변경 후 결과
각 칸의 숫자는 출력 회색값입니다. 입력은 최대 채도의 순색이며, 표의 변경 설정은 빨강 75·노랑 90입니다.
03

채널 최솟값에 색의 차이를 더합니다

회색 밝기는 RGB의 최솟값과 최댓값, 앞서 구한 가중치로 계산합니다. 채널값은 0~1로 정규화되어 있습니다. 계산한 회색을 R·G·B 세 채널에 똑같이 넣으면 흑백이 됩니다.

const lo = Math.min(r, g, b);
const hi = Math.max(r, g, b);
const gray = clamp(lo + (hi - lo) * weight);
out.fill(gray);

원래부터 회색인 픽셀은 세 채널값이 같습니다. 따라서 hi − lo가 0이 되어 색상별 슬라이더를 움직여도 그대로 남습니다. 반대로 순수한 빨강은 가중치의 영향이 크게 나타납니다.

이 식은 RGB에 고정 가중치를 곱해 더하는 일반적인 휘도 계산과 다릅니다. 여섯 색의 밝기를 개별적으로 조절하는 기능에 맞춰 구현한 변환입니다.

색조 입히기 전 빨강75 노랑90 흑백 인물 결과
기존 릴스 중간 단계 · 색조 입히기 전입니다. 위쪽 대표 사진의 따뜻한 결과와 비교할 수 있습니다.
04

흑백이 완성된 뒤 따뜻한 색조 넣기

색조 입히기를 켜면 앞 단계의 회색값을 HSL의 명도 L로 사용합니다. 여기에 지정한 색상각과 채도를 넣어 RGB로 돌아옵니다. 예제 설정은 색상각 35°, 채도 20%입니다.

if (v.tint) {
  fromHsl(
    v.tintHue / 360,
    v.tintSaturation / 100,
    gray, out
  );
}

세 채널에 같은 회색을 넣은 뒤, 원하는 색조로 변환하는 순서입니다. 이때 유지되는 기준은 HSL의 L입니다. 지각적 밝기나 물리적인 휘도가 정확히 일정하다는 뜻은 아닙니다.

Adobe의 흑백 문서에서도 색상별 회색 조절과 Tint를 별도 항목으로 설명합니다. 포토샷에서도 두 설정을 분리해, 흑백 톤을 먼저 다듬고 색조를 나중에 바꿀 수 있게 했습니다.

흑백 색조 입히기 색상35 채도20 패널
실제 색조 입히기 컨트롤. 이 설정을 적용한 최종 결과가 글 상단의 보정 후 사진입니다.
  1. 흑백 밝기 계산원래 색상에 따라 회색값을 구합니다.
  2. HSL 조합색상각 35°와 채도 20%, 앞 단계의 명도를 함께 넣습니다.
  3. RGB로 변환따뜻한 색조의 최종 픽셀을 만듭니다.
05

자동 흑백과 사진에서 직접 고르는 버튼

자동 흑백은 사진의 R·G·B 평균값으로 슬라이더의 시작값을 제안합니다. 각 채널의 평균과 전체 평균의 차이를 구하고, 여기에 0.3을 곱해 기본 슬라이더값에 더합니다. 사진의 의미를 판단하는 AI 기능은 아닙니다.

‘사진의 색을 밝게 +10’과 ‘어둡게 −10’은 클릭한 색에 가장 가까운 기본 색상 하나를 고릅니다. 해당 슬라이더를 10만큼 바꾸는 방식입니다. 회색처럼 채널 간 차이가 작은 픽셀은 색 선택 대상에서 제외합니다.

흑백 변환에서 두 색 사이를 보간하는 계산과, 버튼으로 가장 가까운 색 하나를 고르는 동작은 서로 다릅니다. 구현 목적에 따라 이렇게 나누었습니다.

자동과 사진 선택의 구현은 advanced-adjustment.tsx, tone-tools.ts에서 확인할 수 있습니다.
기능입력 → 동작
자동 흑백채널별 평균 → 여섯 시작값 제안
사진의 색 밝게클릭 색 → 가까운 슬라이더 +10
사진의 색 어둡게클릭 색 → 가까운 슬라이더 −10
초기화슬라이더와 색조 설정을 기본값으로 복원

구현 코드와 참고 자료

공개 코드는 구현을 설명하기 위한 참조입니다. 사용·배포 조건은 저장소의 라이선스 표기를 확인하세요. 사진·패널은 자체 제작 자료, 장식 이미지는 AI 생성 이미지입니다.