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


08편은 채도를 0으로 만드는 기능과 다릅니다. 색상별 슬라이더가 흑백 결과에 어떻게 반영되는지 살펴보고, 마지막에 따뜻한 색조를 넣는 과정까지 연결합니다.
빨강과 노랑을 올려 얼굴 밝기 조절하기
예제는 빨강 75, 노랑 90입니다. 나머지는 기본값인 초록 40·청록 60·파랑 20·자홍 80을 유지했습니다. 피부에서 흔히 나타나는 빨강과 노랑 계열의 흑백 밝기를 올린 설정입니다.
패널의 색 이름은 최종 사진에 남길 색이 아닙니다. 원본에서 그 색에 가까운 부분을 얼마나 밝은 회색으로 바꿀지 정하는 값입니다. 피부 전용 조절은 아니므로 같은 색의 사물도 영향을 받습니다.
위의 보정 후 사진에는 마지막 단계의 색조 입히기까지 포함되어 있습니다. 옆의 화면은 색조를 넣기 전, 빨강과 노랑의 밝기를 조절하는 부분입니다.
슬라이더는 −100~300 범위입니다. 값이 크다고 항상 디테일이 더 잘 보이는 것은 아닙니다. 계산 결과가 흰색이나 검정으로 제한되면 그 부분의 차이는 줄어듭니다.

원래 색상각으로 두 슬라이더를 고르기
픽셀의 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가 됩니다. 인접한 색이 서로 전혀 다른 밝기로 끊기지 않게 연결하는 방식입니다.
채널 최솟값에 색의 차이를 더합니다
회색 밝기는 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에 고정 가중치를 곱해 더하는 일반적인 휘도 계산과 다릅니다. 여섯 색의 밝기를 개별적으로 조절하는 기능에 맞춰 구현한 변환입니다.
흑백이 완성된 뒤 따뜻한 색조 넣기
색조 입히기를 켜면 앞 단계의 회색값을 HSL의 명도 L로 사용합니다. 여기에 지정한 색상각과 채도를 넣어 RGB로 돌아옵니다. 예제 설정은 색상각 35°, 채도 20%입니다.
if (v.tint) {
fromHsl(
v.tintHue / 360,
v.tintSaturation / 100,
gray, out
);
}세 채널에 같은 회색을 넣은 뒤, 원하는 색조로 변환하는 순서입니다. 이때 유지되는 기준은 HSL의 L입니다. 지각적 밝기나 물리적인 휘도가 정확히 일정하다는 뜻은 아닙니다.
Adobe의 흑백 문서에서도 색상별 회색 조절과 Tint를 별도 항목으로 설명합니다. 포토샷에서도 두 설정을 분리해, 흑백 톤을 먼저 다듬고 색조를 나중에 바꿀 수 있게 했습니다.
자동 흑백과 사진에서 직접 고르는 버튼
자동 흑백은 사진의 R·G·B 평균값으로 슬라이더의 시작값을 제안합니다. 각 채널의 평균과 전체 평균의 차이를 구하고, 여기에 0.3을 곱해 기본 슬라이더값에 더합니다. 사진의 의미를 판단하는 AI 기능은 아닙니다.
‘사진의 색을 밝게 +10’과 ‘어둡게 −10’은 클릭한 색에 가장 가까운 기본 색상 하나를 고릅니다. 해당 슬라이더를 10만큼 바꾸는 방식입니다. 회색처럼 채널 간 차이가 작은 픽셀은 색 선택 대상에서 제외합니다.
흑백 변환에서 두 색 사이를 보간하는 계산과, 버튼으로 가장 가까운 색 하나를 고르는 동작은 서로 다릅니다. 구현 목적에 따라 이렇게 나누었습니다.
| 기능 | 입력 → 동작 |
|---|---|
| 자동 흑백 | 채널별 평균 → 여섯 시작값 제안 |
| 사진의 색 밝게 | 클릭 색 → 가까운 슬라이더 +10 |
| 사진의 색 어둡게 | 클릭 색 → 가까운 슬라이더 −10 |
| 초기화 | 슬라이더와 색조 설정을 기본값으로 복원 |
구현 코드와 참고 자료
- 색상각 보간·흑백 변환·색조 입히기
Photoshot v0.16.0 · 실제 구현과 테스트 - 자동 흑백의 채널 평균 계산
Photoshot v0.16.0 · 실제 구현과 테스트 - 클릭한 색의 흑백 밝기 조절
Photoshot v0.16.0 · 실제 구현과 테스트 - Adobe · Black & White, 색상 슬라이더와 Tint
기능 의미를 비교하기 위한 참고 문서입니다. Adobe의 내부 구현 코드 출처는 아닙니다.

