SLOHERO
13

PHOTOSHOT / DEVELOPMENT JOURNAL

사진의 색을
몇 단계로 줄일까

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

조정 레이어 13 · 포스터화
2026.10.01 · SLOHERO · 공개 코드 v0.16.0 기준
보정 전포스터화 보정 전 AI 생성 인물 예시
보정 후포스터화 보정 후 AI 생성 인물 예시
AI 생성 인물 원본에 공개 코드 v0.16.0의 해당 조정만 적용한 결과입니다. 각 글에 설정과 불투명도를 적었습니다. 패널은 기존 릴스 제작 때 캡처한 실제 화면입니다.

13편은 단계 수를 4로 정한 결과입니다. 사진 전체를 네 가지 색으로 만드는 것이 아니라, 각 채널이 사용할 수 있는 값을 네 개로 줄입니다.

  1. 01사용자가 정하는 값은 단계 수 하나입니다
  2. 02입력을 구간 번호로 바꿉니다
  3. 03단계 수가 줄수록 경계가 분명해집니다
  4. 04이전 프로젝트의 계산은 그대로 남겼습니다
01

사용자가 정하는 값은 단계 수 하나입니다

단계 수는 2~256, 기본값은 6입니다. 예제에서는 8에서 6을 거쳐 4로 줄였고, 위의 사진에는 최종 4단계를 적용했습니다. 불투명도는 100%입니다.

256단계에서는 각 입력값에 대응하는 출력이 그대로 유지됩니다. 단계 수를 줄일수록 이웃한 여러 입력이 같은 출력값에 모이므로, 피부나 배경의 부드러운 변화가 넓은 색면으로 보입니다.

슬라이더의 단계 수와 사진에 실제 나타나는 색의 개수는 다릅니다. 사용하지 않는 채널 조합은 사진에 나타나지 않고, 합성이나 다른 레이어를 추가하면 새로운 중간값이 생길 수 있습니다.

단계 수4로 설정한 포스터화 컨트롤
단계 수 컨트롤을 표시한 실제 조작 화면입니다. · 그림을 누르면 전체 패널을 볼 수 있습니다.
02

입력을 구간 번호로 바꿉니다

입력 채널값 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 중 하나가 됩니다. 아래 표는 경계의 양쪽 값을 실제 함수에 넣어 확인했습니다.

revision 2 · 4단계 · 8비트 RGB. 모든 단계 수에서 입력 구간 폭이 정수로 똑같이 나뉘는 것은 아닙니다.
입력 구간출력경계 확인
0~63063 → 0
64~1278564 → 85 / 127 → 85
128~191170128 → 170 / 191 → 170
192~255255192 → 255
03

단계 수가 줄수록 경계가 분명해집니다

그림은 0~255 회색 띠를 실제 포스터화 함수에 통과시킨 결과입니다. 사진보다 단순한 입력을 사용하면 단계 경계가 어디서 바뀌는지 바로 볼 수 있습니다.

계산은 각 채널에 독립적으로 적용합니다. 4단계면 가능한 RGB 조합은 최대 4³, 즉 64가지입니다. 입력 사진에 따라 실제 사용되는 조합은 이보다 적을 수 있습니다.

검정·흰색 두 값만 남기는 임계값과도 다릅니다. 포스터화를 2단계로 설정하면 각 채널에 0과 255가 남아 빨강·초록·파랑 같은 색도 나올 수 있습니다.

회색 띠의 포스터화256 8 4 2단계 비교
256개 입력값을 각각 처리한 도표. 사진 리사이즈로 생기는 중간색은 포함하지 않았습니다.
04

이전 프로젝트의 계산은 그대로 남겼습니다

기존 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종 프로젝트의 픽셀 유지 테스트도 통과했습니다.

  1. 설정 읽기단계 수와 조정 버전을 확인합니다.
  2. 변환표 만들기0~255 입력의 출력값을 채널별로 준비합니다.
  3. 픽셀 처리표를 읽고 공통 레이어 합성에 넘깁니다.

구현 코드와 참고 자료

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