도트 팔레트 추출 · .gpl·HEX·JSON 내보내기
이미지 한 장이나 애니메이션 전체에서 스프라이트의 실제 팔레트(색마다 픽셀 수와 비율)를 뽑고, 색 예산 안으로 맞추세요.
팔레트 추출은 스프라이트가 쓰는 색과 색마다 몇 픽셀을 차지하는지 보여 주므로, 실수로 생긴 거의 같은 색을 찾고 색 예산을 지킬 수 있습니다. 이미지 한 장이나 애니메이션의 모든 프레임을 끌어다 놓으면 팔레트 단계가 전체에 쓸 팔레트 하나(기본 16색, 2~256)를 만들고, 색마다 정확한 픽셀 수와 비율을 보여 주고, 정렬하며, 목표에 맞게 가장 드문 색을 가장 가까운 남는 색으로 합칠 수 있습니다. GIMP .gpl, HEX 목록, JSON으로 저장하며 아무것도 업로드하지 않습니다.

- PNG frames측정 확인· Pillow
- Palette측정 확인· re-import
- pixel-lab.json미검증
정확한 색 목록과 추출한 팔레트는 다릅니다
랩의 추출은 색을 줄이는 과정입니다. 먼저 픽셀을 채널당 5비트(256단계 대신 32단계) 칸에 알파로 가중해 모으고, 그 칸들을 Oklab에서 중앙값 분할로 나눕니다. 모든 채널에서 8단계 미만으로 차이 나는 두 색은 같은 칸에 들어가 평균한 색 하나로 나옵니다. 잡음이 있거나 크기가 바뀐 이미지에는 바람직하지만, 손으로 찍은 도트의 색을 그대로 알아야 할 때는 맞지 않습니다.
그대로의 목록이 필요하면 Studio 픽셀 작업 공간의 그림에서 팔레트 만들기를 쓰세요. 정확한 색을 모두(투명 칸 외에 최대 255개) 모아 많이 쓰인 순으로 늘어놓습니다. 반면 랩의 개수는 랩 팔레트 기준으로 정확합니다. 모든 픽셀을 Oklab 기준 가장 가까운 팔레트 색에 배정하며(정확히 같은 색은 바로 배정), 프레임 합계가 4메가픽셀 미만이면 모든 프레임을 셉니다.
색 예산은 개수를 결정으로 바꿔 줍니다. 목표를 정하면 목표를 넘는 가장 드문 색이 나열되고, 합치기는 각 색을 Oklab에서 가장 가까운 남는 색으로 옮깁니다. 함께 지워질 색끼리는 합치지 않으므로 결과는 정말로 목표 개수의 색만 씁니다.
- 색 예산
- 스프라이트나 프레임 하나가 쓸 수 있는 최대 색 수.
- 5비트 칸
- 빨강·초록·파랑의 상위 5비트(각 32단계)가 같은 색들의 묶음.
- 비율
- 한 색의 픽셀 수를 불투명 픽셀 전체로 나눈 값.
- .gpl
- 김프의 텍스트 팔레트. "GIMP Palette" 머리말, 선택적인 Name과 Columns, 그 뒤 색마다 "R G B 이름" 한 줄.
예시: 초록 둘이 하나가 되는 이유, 그리고 16색에서 8색으로
칸 계산과, 랩 검증에 쓴 예산 시험입니다.
#3e8948 = (62,137,72) → 칸 62>>3=7, 137>>3=17, 72>>3=9
#3f8a4a = (63,138,74) → 칸 63>>3=7, 138>>3=17, 74>>3=9 같은 칸
추출 결과: 두 색을 픽셀 수로 가중 평균한 색 하나
정확한 목록(Studio, 그림에서 팔레트 만들기): 두 색 모두, 사용량 순
예산: 16색, 목표 8 → 가장 드문 8색이 나열됨
합치기: 각각 Oklab에서 가장 가까운 남는 색으로
내보내기: 프레임이 실제로 8색만 씀, 팔레트 밖 0두 초록을 일부러 칠했다면 Studio에서 세고, 크기 변경이나 압축 때문에 생긴 색이라면 합쳐진 색을 남기세요.
이렇게 작동합니다
- 모든 프레임에서 한 번에 팔레트를 만들고 색마다 정확한 픽셀 수와 비율을 보여 줍니다.
- 명도·색상·채도·빈도로 정렬합니다(색상 정렬 시 회색은 끝으로).
- 색 예산 점검: 목표 대 실제, 가장 드문 색 목록, 가장 가까운 남는 색으로 한 번에 합치기.
- GIMP .gpl, Lospec 방식 HEX 목록, JSON 가져오기·내보내기. 형식은 확장자가 아니라 내용으로 판별합니다.
사용 방법
- 이미지나 프레임을 끌어다 놓습니다.
- 색 개수와 정렬 순서를 정합니다.
- 필요하면 색 예산을 정하고 드문 색을 합칩니다.
- 팔레트(.gpl·.hex·.json)나 다시 칠한 프레임을 내보냅니다.
랩이 쓰는 팔레트 파일
| 파일 | 용도 |
|---|---|
palette.gpl | 김프 팔레트 텍스트: Name:, Columns:, 그 뒤 R G B와 색 이름으로 쓴 hex 코드. 김프와 에이스프라이트에서 열립니다. |
palette.hex | 한 줄에 #rrggbb 하나. Lospec도 제공하는 단순 목록. |
palette.json | name, #rrggbb 형식의 colors, [r,g,b] 형식의 rgb, count, source. |
추출한 팔레트 확인하기
- 색 개수를 Studio의 정확한 목록과 비교합니다. 차이가 크면 이미지에 잡음이 있거나 크기가 바뀐 것입니다.
- 빈도순으로 정렬합니다. 비율이 0 %에 가까운 색은 예산 합치기나 외톨이 픽셀 정리 대상입니다.
- 내보낸 파일을 다시 가져옵니다(붙여 넣기나 파일). 같은 수의 색이 돌아와야 합니다.
- 합친 뒤 프레임을 내보내 다른 도구로 색을 셉니다. 목표와 같아야 합니다.
문제 해결
| 증상 | 유력한 원인 | 확인 방법 | 해결 |
|---|---|---|---|
| 따로 남아야 할 두 색이 합쳐짐 | 같은 5비트 칸에 들어감(채널마다 8단계 미만 차이) | Studio 픽셀 작업 공간의 그림에서 팔레트 만들기와 비교 | Studio의 정확한 목록을 쓰거나 두 색의 차이를 키우기 |
| 32색을 요청했는데 더 적게 나옴 | 이미지의 서로 다른 칸이 요청보다 적음. 한 색 아래로는 나눌 수 없음 | 팔레트 견본이 요청 수보다 적음 | 문제 아님. 이미지가 그만큼의 색만 씀 |
| 팔레트 파일을 가져올 수 없음 | 랩은 김프 .gpl, HEX 목록, JSON만 읽음. JASC .pal, AARRGGBB 값의 Paint.net .txt, 에이스프라이트의 "Channels: RGBA" 줄이 있는 .gpl은 거부됨 | 오류 메시지가 읽지 못한 줄을 알려 줌 | .gpl이나 .hex 판을 받거나, 더 많은 형식을 읽는 Studio 픽셀 작업 공간에서 불러오기 |
| 개수가 보이는 프레임만 셈 | 전체 프레임 합계가 4메가픽셀을 넘음 | 개수 옆 패널에 그렇게 표시됨 | 정확한 합계가 필요하면 프레임을 적게 넣기 |
다른 방법
| 방법 | 이럴 때 더 낫습니다 |
|---|---|
| Studio 픽셀 작업 공간: 그림에서 팔레트 만들기 | 손으로 찍은 그림의 색을 그대로 알아야 하거나 .gpl·.hex·.json 밖의 형식(.pal, .ase, .act)이 필요할 때. 팔레트 편집기 참고. |
| 공개된 팔레트에서 시작 | 스프라이트 자체 색 대신 알려진 팔레트를 따르게 하려면 Lospec 팔레트. |
| 추출 전에 배율과 흐림 확인 | 확대된 이미지일 수 있다면, 흐리게 확대된 그림의 개수는 1배로 맞추기 전까지 의미가 없습니다. 픽셀 퍼펙트 검사 참고. |
출력 파일과 검증 방법
"측정 확인"은 내려받은 파일을 페이지 밖에서(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배 비정수 배율을 정확히 감지.
한계
- 추출은 채널마다 8단계보다 가까운 색을 합치므로 정확한 목록이 아닙니다.
- .gpl, HEX, JSON만 읽고 씁니다.
- 정확한 개수는 전체 프레임 면적 4메가픽셀까지입니다.
- 4096 × 4096보다 큰 프레임은 거부합니다. 모든 처리가 메인 스레드에서 돌고 아직 취소 버튼이 없습니다.
- 스프라이트 시트는 이미지 하나로 다룹니다. 먼저 프레임으로 자르세요(스프라이트 시트 자르기).
- 디더링을 켜면 정리 개수에 디더 픽셀이 포함됩니다. 먼저 디더링을 없음으로 두세요.
- 내보내는 JSON은 일반 형식이며 Godot·Unity 가져오기는 시험하지 않았습니다.
버전과 출처
Nerulio: docs/PIXEL-LAB.md(Chromium. 16색에서 8색으로 합친 결과를 내보낸 PNG에서 다시 셌고, .gpl·.hex·JSON 왕복은 16색 → 16색). 칸 계산은 src/pixel-engine.js를 따릅니다. 파일 구조는 김프 사양과 Lospec이 실제로 내려주는 파일을 따릅니다.
참고한 공식 문서
자주 묻는 질문
픽셀 수는 정확한가요?
네. 애니메이션 전체 프레임 면적 4메가픽셀까지는 정확하고, 그 이상이면 현재 프레임만 세며 패널에 그렇게 표시합니다.
GIMP 팔레트가 든 .txt도 읽나요?
네. 형식을 내용으로 판별하므로 GIMP 헤더가 있는 .txt는 .gpl로 읽습니다.
무료인가요? 계정이 필요한가요?
이 페이지의 기능은 모두 무료이며 계정 없이 쓸 수 있습니다. 워터마크나 막혀 있는 내보내기가 없습니다.
스프라이트가 업로드되나요?
아니요. Studio는 이 브라우저 탭 안에서 디코딩·패킹·내보내기를 합니다. 프로젝트는 브라우저(IndexedDB)에 자동 저장되며 .nerulio 파일로 저장할 수 있습니다.
Aseprite나 엔진 플러그인을 설치해야 하나요?
아니요. .aseprite 파일은 브라우저에서 읽고 씁니다. 엔진별 번들에는 그 엔진에 필요한 것이 들어 있습니다(Godot는 가져오기 설정과 씬, Unity와 Godot 타일셋은 작은 편집기 스크립트).