이번에 작업한 부분
포토샷에 색상별 밝기를 조절하는 흑백 레이어를 구성했습니다.
포토샷에 색상별 밝기를 조절하는 흑백 레이어를 구성했습니다.
개발 기록 재구성 · 공개 코드 v0.16.0 기준 / 2026.10.13
구현 과정 읽기 ↓
Development journal / 09
기존 개발 기록과 공개 코드를 바탕으로 구현 과정을 정리했습니다. 아래 인물 사진은 2026.10.13에 새로 제작한 동작 예시입니다.
포토샷에 색상별 밝기를 조절하는 흑백 레이어를 구성했습니다.
원래 색상각을 읽고 빨강·노랑·초록·청록·파랑·자홍 중 양옆 두 설정을 섞어 회색 밝기를 구합니다.
채도를 없애는 것만으로는 피부와 배경의 회색 밝기를 따로 조절할 수 없습니다. 색 구간을 딱 잘라 나누면 이웃한 색의 밝기가 끊길 수 있습니다.
여섯 색 사이를 보간하고 원래 무채색인 픽셀은 그대로 유지했습니다. 흑백 계산 뒤에 색조를 입히는 옵션은 별도로 두었습니다.
이 기능의 외부 GitHub 코드 도입 기록은 확인되지 않았습니다. 아래 링크는 직접 작성한 흑백 계산과 조작 화면입니다.
이번 사진은 빨강 55·노랑 60·파랑 5 등을 적용하고 색조 없이 내보냈습니다. 피부 전용 선택이 아니어서 같은 색의 옷에도 영향을 줍니다.

AFTERBEFORE포토샷 흑백 패널에서 색상별 값을 조절하고 새 화면을 촬영했습니다. 단순히 채도를 0으로 낮추는 처리와 다른 지점을 정리했습니다.
사진 위를 좌우로 움직여 비교하세요. 키보드로는 비교 막대에 초점을 맞춘 뒤 방향키를 사용하면 됩니다.
인물 사진은 새로 생성한 AI 이미지입니다. 편집 결과는 실제 Photoshot에서 적용하고 내보냈습니다. 아래 값은 이 사진의 실습값이며 모든 사진에 맞는 권장값은 아닙니다.
STEP 01 / 도구 찾기
사진을 연 뒤 상단 Add Adjustment에서 Black & White를 선택합니다. 아래는 실제 편집기에서 해당 도구의 위치를 확인한 화면입니다.

STEP 02 / 직접 조절
Red 55, Yellow 60, Green 40, Cyan 60, Blue 5, Magenta 80으로 변환합니다. Tint는 끈 상태입니다.

STEP 03 / 레이어 표시를 껐다 켜거나 Hold to Compare로 원본을 비교한 뒤 File → Export As… → Download로 결과를 저장합니다. 위 전후 비교의 AFTER는 이 편집기에서 직접 내보낸 이미지입니다. 화면을 누르면 원본 크기로 확대됩니다.
02 / Behind the tool
아래는 기존 작업기의 공개 코드 v0.16.0 기준 설명과 계산 예제입니다. 2026.10.01 기록의 수치·검증 설명을 보존했습니다. 위의 2026.10.13 새 사진 실습과 설정값은 다를 수 있으며, 현재 편집기의 모든 기능을 이 버전의 코드와 동일하다고 설명하는 것은 아닙니다.
예제는 빨강 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 |
| 초기화 | 슬라이더와 색조 설정을 기본값으로 복원 |