PHOTOSHOT / DEVELOPMENT JOURNAL
사진의 색을
몇 단계로 줄일까
포스터화는 부드러운 명암을 몇 개의 값으로 정리하는 기능입니다. 단계 수 하나를 받아 R·G·B 각각의 출력값을 정하도록 만들었습니다.


13편은 단계 수를 4로 정한 결과입니다. 사진 전체를 네 가지 색으로 만드는 것이 아니라, 각 채널이 사용할 수 있는 값을 네 개로 줄입니다.
사용자가 정하는 값은 단계 수 하나입니다
단계 수는 2~256, 기본값은 6입니다. 예제에서는 8에서 6을 거쳐 4로 줄였고, 위의 사진에는 최종 4단계를 적용했습니다. 불투명도는 100%입니다.
256단계에서는 각 입력값에 대응하는 출력이 그대로 유지됩니다. 단계 수를 줄일수록 이웃한 여러 입력이 같은 출력값에 모이므로, 피부나 배경의 부드러운 변화가 넓은 색면으로 보입니다.
슬라이더의 단계 수와 사진에 실제 나타나는 색의 개수는 다릅니다. 사용하지 않는 채널 조합은 사진에 나타나지 않고, 합성이나 다른 레이어를 추가하면 새로운 중간값이 생길 수 있습니다.
입력을 구간 번호로 바꿉니다
입력 채널값 i에 단계 수를 곱하고 256으로 나눈 뒤 소수점을 버립니다. 이렇게 얻은 번호를 단계 수 − 1로 나누면 0~1 출력값이 됩니다.
const bucket = Math.min(
steps - 1, Math.floor(i * steps / 256)
);
const output = bucket / (steps - 1);4단계라면 입력을 64개씩 묶습니다. 각 구간은 최종적으로 0·85·170·255 중 하나가 됩니다. 아래 표는 경계의 양쪽 값을 실제 함수에 넣어 확인했습니다.
| 입력 구간 | 출력 | 경계 확인 |
|---|---|---|
| 0~63 | 0 | 63 → 0 |
| 64~127 | 85 | 64 → 85 / 127 → 85 |
| 128~191 | 170 | 128 → 170 / 191 → 170 |
| 192~255 | 255 | 192 → 255 |
단계 수가 줄수록 경계가 분명해집니다
그림은 0~255 회색 띠를 실제 포스터화 함수에 통과시킨 결과입니다. 사진보다 단순한 입력을 사용하면 단계 경계가 어디서 바뀌는지 바로 볼 수 있습니다.
계산은 각 채널에 독립적으로 적용합니다. 4단계면 가능한 RGB 조합은 최대 4³, 즉 64가지입니다. 입력 사진에 따라 실제 사용되는 조합은 이보다 적을 수 있습니다.
검정·흰색 두 값만 남기는 임계값과도 다릅니다. 포스터화를 2단계로 설정하면 각 채널에 0과 255가 남아 빨강·초록·파랑 같은 색도 나올 수 있습니다.
이전 프로젝트의 계산은 그대로 남겼습니다
기존 revision 1은 0~1 값을 단계 수에 맞춰 반올림했습니다. revision 2는 256개 입력을 구간으로 나누는 방식입니다. 두 식은 구간 경계가 달라 같은 설정에서도 결과가 달라질 수 있습니다.
// 예전 프로젝트
Math.round(x * (steps - 1)) / (steps - 1)
// 새 조정 레이어
Math.min(steps - 1, Math.floor(i * steps / 256))
/ (steps - 1)저장된 프로젝트의 revision을 읽어 해당 계산을 선택합니다. 알고리즘을 바꿔도 예전에 저장한 작업이 다른 색으로 열리지 않게 하기 위한 분기입니다. 기존 16종 프로젝트의 픽셀 유지 테스트도 통과했습니다.
- 설정 읽기단계 수와 조정 버전을 확인합니다.
- 변환표 만들기0~255 입력의 출력값을 채널별로 준비합니다.
- 픽셀 처리표를 읽고 공통 레이어 합성에 넘깁니다.
구현 코드와 참고 자료
- 단계 수 범위와 기본값
Photoshot v0.16.0 · 실제 구현과 테스트 - revision별 포스터화 계산
Photoshot v0.16.0 · 실제 구현과 테스트 - 이전 조정 레이어의 픽셀 유지 검사
Photoshot v0.16.0 · 실제 구현과 테스트 - Adobe · Posterize의 채널별 단계 수 설명
기능 의미를 비교하기 위한 참고 문서입니다. Adobe의 내부 구현 코드 출처는 아닙니다.
