스프라이트 팔레트 교체 · 램프 재채색과 팀 색상
여기서의 재채색은 모두 팔레트 변환입니다. 픽셀은 팔레트 번호를 그대로 유지하므로, 같은 색을 쓰던 두 프레임은 계속 같은 색을 쓰고 가장 어두운 색은 계속 가장 어둡습니다.
팔레트 교체는 명암 램프의 각 색을 다른 램프의 같은 위치 단계로 옮겨 스프라이트를 다시 칠합니다. 망토의 가장 어두운 빨강은 가장 어두운 파랑이 되고, 하이라이트는 하이라이트가 되며, 나머지는 바뀌지 않습니다. 픽셀 랩의 재채색 단계에서 원본 색을 고르고, 기준 색 하나로 목표 램프를 만들거나 직접 골라 모든 프레임에 적용합니다. 팀 변형(빨강·파랑·초록·노랑 또는 임의 #RRGGBB)은 변형마다 폴더와 .gpl이 든 ZIP 하나로 내보냅니다.

- PNG frames측정 확인· Pillow
- Palette측정 확인· re-import
- pixel-lab.json미검증
가장 가까운 색이 아니라 램프 속 위치로 옮기기
색마다 새 팔레트에서 가장 가까운 색으로 바꾸면 명암이 깨집니다. 이웃한 빨강 두 단계가 같은 파랑으로 가 버리거나, 밝은 빨강이 그림자보다 더 어두운 파랑으로 갈 수 있습니다. 랩은 고른 원본 색을 Oklab 명도로 정렬한 뒤 위치대로 목표 램프에 대응시킵니다. 첫 색은 목표의 가장 어두운 색, 마지막 색은 가장 밝은 색이 되고 순서가 뒤집힐 수 없습니다.
목표 램프는 기준 색 하나로 만들 수 있습니다. 원본 램프의 명도 간격은 그대로 두고, 기준 색의 색상과 채도만 가져오며(기준 색 자체의 명도는 쓰지 않음), 중간 톤의 채도를 높이고 램프를 따라 색상을 최대 12°까지 한쪽 끝은 이쪽, 다른 끝은 저쪽으로 돌립니다. 결과는 다듬기 위한 출발점이지 완성된 아트 결정이 아닙니다.
모든 재채색은 팔레트 변환입니다. 픽셀은 팔레트 번호를 그대로 유지하고 그 번호 뒤의 색만 바뀝니다. 같은 명암을 쓰던 두 프레임은 계속 같은 명암을 쓰므로, 교체 때문에 프레임 사이에 깜박임이나 튀는 색이 생길 수 없습니다.
- 램프 교체
- 고른 원본 색을 어두운 것부터 밝은 것까지의 위치대로 목표 램프에 대응시키는 것.
- 팀 변형
- 팀이나 플레이어마다 기준 색을 달리해 같은 스프라이트를 다시 칠한 것.
- 색상 범위
- 중심 ± 각도로 정한 색상 구간. 그 안의 색은 자기 명도를 유지한 채 바뀜.
- 상태 색조
- 모든 색을 한 색상 쪽으로 당기는 레시피(얼음, 독, 화상, 유령, 피격 번쩍임).
예시: 빨간 망토 램프를 팀 파랑으로
랩의 함수로 직접 계산한 값입니다(L = Oklab 명도, h = 색상).
원본(빨간 망토) #5a1e28 L0.33 h13 | #a02c3a L0.48 h18 | #dc5a50 L0.63 h27 | #f5a08c L0.79 h34
기준: 팀 파랑 #3467d6 (L0.54는 무시, 색상 263°와 채도 0.18을 사용)
만들어진 램프 #002d8c L0.35 | #004ed5 L0.48 | #4f7bff L0.62 | #99acff L0.76
램프를 따른 색상 262° → 262° → 267° → 273°
위치로 대응 가장 어두운 것→가장 어두운 것 … 가장 밝은 것→가장 밝은 것, 검정·흰색은 그대로
3색을 5단계 램프로: 위치 0, 0.5, 1 → 단계 0, 2, 4
시험: 변형 4개 × 프레임 8장 = PNG 32장, 고른 3칸만 바뀌고 13칸은 바이트 그대로만들어진 명도는 원본과 0.03 이내로 맞습니다. 가장 밝은 파랑이 조금 낮게 나온 것은 sRGB가 그 파랑을 최대 채도로 담지 못하기 때문입니다. 하이라이트가 칙칙해 보이면 손으로 조금 올리세요.
이렇게 작동합니다
- 램프 교체: 고른 원본 색을 가장 가까운 색이 아니라 명도 순서의 위치대로 목표 램프에 대응시킵니다.
- 기준 색 하나로 자동 램프를 만들며, 원래 램프의 명도 단계를 유지합니다.
- 팀 색상 일괄: 변형 N개(빨강·파랑·초록… 또는 임의 #RRGGBB)를 변형마다 폴더와 .gpl이 든 ZIP 하나로 내보냅니다.
- 색상 범위 교체와 상태 프리셋(얼음·독·화상·유령·피격 번쩍임). 프리셋은 레시피로 표시합니다.
사용 방법
- 프레임을 끌어다 놓습니다.
- 팔레트에서 바꿀 램프의 색을 고릅니다.
- 램프·기준 색·색상 범위·상태 프리셋을 고르고 미리 봅니다.
- 적용하거나 팀 변형을 내보냅니다.
교체 결과 확인하기
- 적용하기 전에 원본과 목표 견본을 나란히 봅니다. 두 줄 모두 어두운 것에서 밝은 것으로 이어져야 합니다.
- 프레임을 넘겨 봅니다. 모든 프레임에서 고른 색만 바뀌고 외곽선·피부·눈은 그대로여야 합니다.
- 변형 하나의 .gpl을 엽니다. 건드리지 않은 칸은 원래 색이 원래 순서대로 있어야 합니다.
- 변형들을 1배로 나란히 놓습니다. 확대해서가 아니라 게임 크기에서 팀이 구별돼야 합니다.
문제 해결
| 증상 | 유력한 원인 | 확인 방법 | 해결 |
|---|---|---|---|
| 명암이 뒤집히거나 밋밋해짐 | 램프가 아닌 색(외곽선, 피부)까지 함께 골랐음 | 고른 견본이 어두운 것에서 밝은 것으로 한 줄로 이어지지 않음 | 램프의 색만 고르기. 클릭 순서는 상관없고 명도가 순서를 정함 |
| 다른 부분 색까지 바뀜 | 망토가 스프라이트의 다른 부분과 팔레트 칸을 함께 씀 | 그 견본을 골라 픽셀 수를 망토만의 면적과 비교하면 다른 부분도 쓰고 있음 | 먼저 그 부분에 따로 색을 주고(예: Studio 픽셀 작업 공간) 교체 |
| 팀 색이 고른 기준 색보다 훨씬 어둡거나 밝음 | 만들어진 램프는 원본 명도 간격을 유지하고 기준 색에서는 색상과 채도만 씀 | 기준 견본과 만들어진 램프의 가운데를 비교 | 목표 램프를 직접 고르거나, 원하는 색상의 기준을 골라 단계를 조정 |
| 색상 범위가 너무 많이 잡거나 아무것도 못 잡음 | 범위(± 각도)가 너무 넓거나 좁고, 회색에 가까운 색은 무시됨 | 미리보기에서 해당 색에 체크 표시가 붙음 | 범위를 좁히거나 넓히기. 회색은 램프 교체로 |
다른 방법
출력 파일과 검증 방법
"측정 확인"은 내려받은 파일을 페이지 밖에서(Pillow·numpy·별도 파서) 다시 열어 그 속성을 측정했다는 뜻입니다. 게임 엔진에서 불러오는 것은 시험하지 않았습니다.
| 대상 | 파일 | 검증 |
|---|---|---|
| PNG frames | anim_N.png · 1×–8× nearest | 측정 확인 Pillow내보낸 PNG를 다시 읽어 모든 색이 고정 팔레트 안에 있는지 확인했습니다. |
| Palette | .gpl · .hex (Lospec) · .json | 측정 확인 re-import각 형식을 내보내고 UI로 다시 가져와 16 → 16색을 확인했습니다. |
| pixel-lab.json | generic frames + palette | 미검증일반 JSON이며 어떤 엔진에서도 불러오지 않았습니다. |
검증 근거
안티앨리어싱된 프레임 8개 → 16색 팔레트 하나, 팔레트 밖 색 0개. 디더링 없음과 Bayer 4×4 모두에서 변하지 않은 영역이 8프레임 모두 동일. 안티앨리어싱 제거로 271색 → 16색, 실루엣 픽셀 이동 0. 정수 배율·오프셋·2.5배 비정수 배율을 정확히 감지.
한계
- 변형은 PNG 프레임과 .gpl로 내보내며 .aseprite는 아닙니다.
- 불러온 모든 프레임에 팔레트 하나를 씁니다. 관련 없는 캐릭터 둘이 든 시트는 먼저 나눠야 합니다.
- 상태 프리셋은 레시피이지 직접 그린 아트가 아닙니다.
- 4096 × 4096보다 큰 프레임은 거부합니다. 모든 처리가 메인 스레드에서 돌고 아직 취소 버튼이 없습니다.
- 스프라이트 시트는 이미지 하나로 다룹니다. 먼저 프레임으로 자르세요(스프라이트 시트 자르기).
- 디더링을 켜면 정리 개수에 디더 픽셀이 포함됩니다. 먼저 디더링을 없음으로 두세요.
- 내보내는 JSON은 일반 형식이며 Godot·Unity 가져오기는 시험하지 않았습니다.
버전과 출처
Nerulio: docs/PIXEL-LAB.md(Chromium. 팀 변형 4개 × 프레임 8장을 폴더 4개의 PNG 32장으로 내보냈고, 각각 고른 팔레트 3칸만 바뀌고 나머지 13칸은 바이트 그대로였음). 위 램프는 src/game/palette.js로 계산했습니다. 에이스프라이트의 Replace Color 설명은 공식 문서를 따릅니다.
참고한 공식 문서
자주 묻는 질문
프레임 사이의 명암이 일관되게 유지되나요?
네. 픽셀이 아니라 팔레트를 바꾸므로 모든 프레임이 같은 명암에 같은 번호를 씁니다. 시험에서 변형 4개가 고른 3칸만 바꾸고 나머지 13칸은 바이트 그대로였습니다.
허용 오차가 있는 한 색 교체도 되나요?
네. 별도의 팔레트 교체 도구가 허용 오차와 명암 오프셋으로 한 색을 바꿉니다.
무료인가요? 계정이 필요한가요?
이 페이지의 기능은 모두 무료이며 계정 없이 쓸 수 있습니다. 워터마크나 막혀 있는 내보내기가 없습니다.
스프라이트가 업로드되나요?
아니요. Studio는 이 브라우저 탭 안에서 디코딩·패킹·내보내기를 합니다. 프로젝트는 브라우저(IndexedDB)에 자동 저장되며 .nerulio 파일로 저장할 수 있습니다.
Aseprite나 엔진 플러그인을 설치해야 하나요?
아니요. .aseprite 파일은 브라우저에서 읽고 씁니다. 엔진별 번들에는 그 엔진에 필요한 것이 들어 있습니다(Godot는 가져오기 설정과 씬, Unity와 Godot 타일셋은 작은 편집기 스크립트).