코믹 마스터 — 툴링은(는) 무엇을 하나요?
comic-master의 동반 스킬입니다. comic-master 스킬이 좋은 페이지의 모습을 정의한다면, 이 스킬은 그 페이지를 만드는 도구들을 다룹니다. 대부분의 잘못된 레터링은 잘못된 툴링에서 비롯됩니다: 손으로 그린 래스터 타원, 시스템 폰트, 아트 위에 평평하게 붙여넣은 텍스트 등이 그 예입니다.
1. ComfyUI로 패널 아트 제작하기
ComfyUI 자체 실행 방법 (모델 설치, 실행, 템플릿 및 워크플로우 실행)은 이 리포지토리 루트에 있는 vendor/comfy-cli-skills/ 디렉토리의 일반적인 ComfyUI 스킬에 속합니다. 이 섹션에서는 이를 만화에 사용하는 방법을 다룹니다.
1.1 만화 프로젝트의 생성 설정
- 프로젝트당 두 개의 워크플로우: 새 패널용 텍스트-이미지 워크플로우와 연속성 수정, 샷 일치, 소품 텍스트용 이미지-편집 워크플로우입니다. 한 번 선택한 모델과 고정 설정을 사용하고 프로젝트 바이블에 기록하세요.
- 하나의 패널 = 하나의 작업 = 하나의 저장된 이미지. 이렇게 하면 모든 패널을 해당 프롬프트, 시드 및 설정으로 추적할 수 있습니다.
- 레이아웃에서 렌더링 크기를 결정하고, 그 반대로 하지 마십시오. 썸네일에서 패널의 박스를 가져와 해당 종횡비로 약 1 메가픽셀 해상도로 렌더링합니다 (예: 가로 1408×704, 세로 768×1024, 스트립 1536×640). 그런 다음 박스에 맞게 크기를 조정하거나 잘라내되, 스토리에 중요한 디테일이 잘리는 가장자리에 닿지 않도록 합니다.
- 페이지별이 아닌 장면별로 배치 생성하여 한 장면의 패널들 사이에서 조명, 팔레트, 배경이 일관되게 유지되도록 합니다.
1.2 일관성
- 먼저 모델 시트를 제작합니다. 각 캐릭터의 턴어라운드와 표정 시트를 생성하고 가장 좋은 것을 선택하여 참조 이미지(IP-어댑터, 이미지-편집 입력, 또는 훈련 가능한 경우 캐릭터 LoRA)로 재사용합니다.
- 고정 앵커(comic-master
comic-characters.md§4.5) 는 모든 프롬프트에 왼쪽부터 오른쪽 순서로 단어 그대로 열거하고, 프로젝트 전체에 하나의 스타일 앵커를 사용합니다. - 시드(Seed): 승인된 모든 패널의 시드를 기록하여 재생성 또는 변형이 가능하도록 합니다.
- 포즈 제어: 동작 구도(대화 순서, 시선, 180° 법칙)가 중요할 때 OpenPose 또는 뎁스 ControlNet을 사용합니다.
1.3 유효한 프롬프팅 규칙
- 네거티브 프롬프트가 작동하는지 아십시오. 증류 모델(FLUX.2 klein, Z-Image-Turbo)은 일반적으로 CFG 1에서 실행되므로 네거티브 프롬프트를 무시합니다. 이러한 모델에서는 원하는 것을 긍정적으로 표현하십시오 ("정확히 네 명", "편안하고 매끄러운 이마"). 실제 CFG로 실행되는 모델에서만 네거티브 프롬프트를 사용하거나, 네거티브 가이던스 노드(예: NAG)를 추가하십시오.
- 모델의 언어로 프롬프트를 작성하십시오. FLUX 및 Qwen/Z-Image는 자연어 문장을 읽고, SDXL은 쉼표로 구분된 태그를 읽습니다. 문장 모델의 경우 고정된 순서를 사용하십시오: 샷과 앵글 → 각 인물의 위치(왼쪽부터 오른쪽) → 하나의 동작 → 해부학적 표현 → 배경 → 조명 → 스타일.
- 표현은 해부학적으로, 절대 이름으로 쓰지 마십시오. "지루한"은 종종 찡그린 얼굴을 생성합니다. 대신 이렇게 설명하십시오: "윗눈꺼풀이 반쯤 내려가고, 눈썹은 높고 평평하며, 입은 다문 일자". 네거티브 프롬프트가 작동하는 곳에서는 실패 표현도 네거티브 프롬프트에 추가하십시오 ("찌푸린 눈썹, 노려보는").
- 의상 색상은 해당 신체 부위를 명명하는 절 안에 포함시키십시오 ("어깨를 가로지르는 네이비 보디슈트"). 근접 촬영은 일반적인 색상으로 흘러가는 경향이 있으므로, 네거티브 프롬프트로 흐려지는 색상을 방지하십시오.
- 중복 금지: 인물당 하나의 앵커, 명시적인 수와 순서 ("정확히 세 명: 왼쪽부터, …"), 그리고 네거티브 프롬프트가 작동하는 곳에서는 "중복 캐릭터, 클론, 추가 인물"을 네거티브에 추가하십시오.
- 프롬프트에 텍스트 공간을 확보하십시오 ("상단 1/3은 빈 평평한 벽"). 깨끗하고 문자가 없는 이미지를 요청하십시오 (네거티브가 작동하는 곳에서는 "텍스트 없음, 글자 없음, 말풍선 없음", 그렇지 않으면 긍정적으로 "문자가 전혀 없는 깨끗한 이미지"). 단, 의도적인 소품 텍스트 편집 패스는 예외입니다.
- 썸네일로 무대를 구성하십시오. 썸네일을 대략적인 블록아웃(막대 인형, 가구 상자)으로 바꾸고 포즈, 라인아트 또는 뎁스 제어 이미지로 제공하여 캐스트 배치, 규모 및 등장인물이 계획을 따르도록 하십시오.
- 여러 개 생성하여 하나를 선택하십시오. 패널당 3-4개의 시드를 렌더링하고, 레터링 전에 패널의 GOAL 및 앵커와 비교하여 선택하십시오.
1.4 다시 실행 대신 편집하기
기존 패널을 입력으로 사용하는 이미지-편집 워크플로우를 사용하십시오:
- 패널 일치시키기 (같은 방, 반복 개그, 리액션 샷): 새 패널을 처음부터 생성하는 대신 이전 패널을 새 패널과 같은 톤으로 보정하십시오.
- 제거가 재배치보다 쉽습니다. "테이블에 있는 두 번째 사람 제거"는 작동하지만, "그를 의자 뒤로 이동"은 일반적으로 실패합니다.
- 연속성 수정: 불필요한 엑스트라, 잘못된 의상 색상, 잘못된 손에 든 소품. 해당 영역만 인페인트하거나 편집하십시오.
- 소품 텍스트(§4): 배지나 표지판에 쓰인 짧은 단어를 1:1로 확인하십시오.
1.5 레터링 전 검토
- 모든 렌더링을 앵커 및 패널의 GOAL과 비교하십시오: 얼굴, 의상 색상, 소품 및 손, 조명 방향, 추가 인물, 잘못된 글리프, 빈 텍스트 영역.
- 패널별 로그(프롬프트, 시드, 설정, 승인 또는 거부 및 이유)를 유지하여 수정 사항을 재현 가능하게 만드십시오.
1.6 권장 모델 설정
8 GB VRAM (작업 기본값):
| 작업 | 모델 및 파일 | 참고 |
|---|---|---|
| 패널 및 편집 | FLUX.2 [klein] 4B fp8 (flux-2-klein-4b-fp8) + qwen_3_4b 텍스트 인코더 + flux2-vae | ~4 스텝, CFG 1. 편집 모드는 참조 이미지(모델 시트)를 사용하여 캐릭터에 충실하게 생성합니다. Apache-2.0 라이선스. |
| 더 높은 품질의 단일 패널, 소품 텍스트 | Z-Image-Turbo int8 (z_image_turbo_int8_convrot) + qwen_3_4b_fp8_mixed + ae.safetensors | 템플릿 image_z_image_turbo_int8; ~8 스텝. 더 나은 텍스트 및 명령 준수; 참조 이미지 편집 불가. Z-Image-Turbo Fun Union ControlNet 템플릿을 통한 포즈/뎁스 제어. Apache-2.0 라이선스. |
| 무대 제어 | SDXL + OpenPose ControlNet + IP-어댑터 | 8 GB에서 가장 성숙한 포즈 및 레이아웃 제어; 결과를 Klein으로 정제. |
| 캐릭터 분할 | BiRefNet toonout(만화 및 일러스트용 제작) 또는 RMBG-2.0을 사용한 comfyui-rmbg | 아래 계층형 워크플로우용. |
| 업스케일링 | 4x-UltraSharp, 타일 | ~1 MP로 렌더링한 후 인쇄 크기로 업스케일. |
8 GB에서: fp8/int8/GGUF 가중치 사용; 메모리가 부족할 때 텍스트 인코더를 CPU 또는 두 번째 GPU로 이동; 큰 이미지의 경우 타일형 VAE 디코드; 한 번에 하나의 모델만 로드; 로컬 LLM은 다른 GPU에 유지.
계층형 캐릭터: 각 캐릭터를 평평한 단색 배경에서 생성하고, 분할(BiRefNet toonout)한 후 장면당 하나의 공유 배경 위에 합성합니다. 이는 프롬프트만으로 해결하기 어려운 무대 배치, 규모, 등장인물 문제를 해결하고, 여러 패널에 걸쳐 소품 크기를 일정하게 유지할 수 있게 합니다.
더 많은 VRAM 사용 시: FLUX.2 [klein] 9B (~20 GB; 비상업용), Qwen-Image-2.1 (~24 GB; 참조 이미지 10개, 투명 RGBA 출력, 마스크 편집; 연구 라이선스), FLUX.2 [dev] (fp8에서 24 GB+; 최고 품질 및 다중 참조; 비상업용). 상업적 사용 전에 각 모델 카드의 라이선스를 확인하십시오. 위 8 GB 스택은 모두 Apache-2.0입니다.
2. 레터링 엔진: 픽셀이 아닌 벡터 그리기
2.0 레터러 도구 사용 (기본값)
레터링 코드를 직접 작성하지 마십시오. 이 스킬 폴더(이 SKILL.md 옆) 안에 있는 scripts/letterer.py를 사용하십시오. 함께 제공되는 파일은 scripts/README.md, scripts/styles.json, 그리고 scripts/fonts/ 디렉토리의 승인된 글꼴들입니다. 경로는 리포지토리가 클론된 위치에 관계없이 이 SKILL.md를 기준으로 확인하십시오. 절대 스크립트를 프로젝트에 복사하지 마십시오. 이 스크립트는 이 섹션의 모든 규칙을 이미 따르고 있으며, §5의 QA 검사를 자체적으로 실행합니다. 요구 사항: Python 3.9+ 및 Pillow, numpy (pip install -r scripts/requirements.txt); mediapipe를 권장하며, 이는 자동 얼굴 확인(말풍선이 얼굴을 가리지 않아야 함) 및 "tail_to": "auto" 기능을 활성화합니다.
워크플로우:
python scripts/letterer.py grid --image panel_or_page.png --out grid.png를 실행하고 오버레이를 확인합니다. 패널 사각형, 각 발화자의 머리 상자와 입, 그리고 빈 공간을 읽습니다. 그런 다음 comic-mastercomic-lettering.md§12.2의 배치 규칙과 §12.7의 단계별 절차에 따라 각 말풍선의 위치와 꼬리 조준점을 선택합니다: 머리 근처 빈 공간에 말풍선을 배치하고, 꼬리는 입을 향하되 머리 바깥쪽에서 끝나도록 합니다. 모든 좌표는 상대적입니다: 0.0–1.0 (좌측 상단 기준).- 읽기 순서대로 항목이 포함된 페이지 사양(JSON)을 작성합니다:
{
"image": "strip.png", "out": "strip_lettered.png",
"panels": [[0.0125,0.03,0.329,0.97], [0.342,0.03,0.658,0.97], [0.671,0.03,0.988,0.97]],
"avoid": "faces_mask.png",
"items": [
{"style": "declaration", "text": "도시가 나를 부른다. 나는 응답한다.", "zone": [0.03,0.06,0.31,0.24]},
{"style": "speech", "text": "저 소리 들은 사람|또 있어?", "at": [0.46,0.30], "tail_to": [0.52,0.52]},
{"style": "sfx-micro", "text": "bzzt bzzt", "at": [0.39,0.62]},
{"style": "sfx", "text": "철커덩", "at": [0.80,0.88], "size": 2.4, "rotate": -8}
]
}
python scripts/letterer.py page spec.json을 실행합니다. 종료 코드0은 모든 QA 검사 통과를 의미하고,1은 렌더링되었지만 QA 실패를 의미하므로 출력된 실패 내용을 읽고 사양을 수정한 후(말풍선을 발화자에게 더 가깝게 이동, 영역 확대, 단어 수 줄이기,|로 줄 바꿈 재설정) 다시 실행하십시오.2는 오류(알 수 없는 스타일, 누락된 글꼴, 잘못된 사양)를 의미합니다.- PNG를 실제 크기와 썸네일로 확인합니다. SVG(편집 가능) 및
_qa.json(측정된 숫자)을 페이지와 함께 보관합니다.
항목 필드: style; text (|는 강제 줄 바꿈, 그렇지 않으면 다이아몬드 모양으로 자동 줄 바꿈; _word_는 강조를 위한 밑줄); at [x,y] 중심점 또는 zone [x0,y0,x1,y1] 내부에 맞추기; tail_to [x,y] 조준점: 입 자체가 아니라, 말풍선에서 입 쪽으로 이어지는 선 위에 있는, 머리 바로 바깥의 빈 공간 지점입니다(도구가 그 지점보다 약간 짧게 끝을 멈추므로 꼬리가 발화자를 향하지만 닿지는 않습니다). "no_tail": true를 사용하여 생략할 수 있습니다. "auto"를 사용하지 마십시오. 입술 자체를 반환합니다. 선택적 panel 인덱스, size 배율, rotate (도, 시계 방향), fill (배경색), ink (윤곽선), text_color, font, tail_bend, link (같은 발화자의 이전 말풍선 인덱스: 두 개를 연결), bleed (의도적으로 패널 경계를 넘도록 true), seed.
기본 사항을 넘어서는 페이지 필드: defaults는 모든 항목에 대한 색상과 글꼴을 설정합니다 ({"fill": "#FDF6E3", "ink": "#2B2B2B", "text_color": "#1F3A7A"}); styles는 이 페이지에 대해 하나의 스타일을 재정의합니다 ({"speech": {"fill": "#FFF7D6"}}); avoid는 기본값 "auto" (감지된 얼굴이 보호됨), 또는 마스크 이미지, 또는 false입니다.
조립된 페이지 또는 스트립에 레터링을 패널별로 하지 말고 한 번의 page 실행으로 처리하십시오. 한 번의 실행으로 레터링 크기가 모든 패널에서 동일하게 유지되고 QA가 전체 페이지의 읽기 순서와 겹침을 확인할 수 있습니다.
페이지 필드: image, out/svg/qa 경로, panels (강력 권장: 가장자리 간격, 읽기 순서 및 레터링 크기에 사용됨), ch (캡 높이(px); 기본값은 중간 패널의 짧은 변 ÷ 30으로 모든 곳에서 동일), avoid (흰색 = 얼굴, 손 또는 레터링이 닿지 않아야 하는 주요 동작; 세그멘테이션 패스에서 구축), direction (ltr 또는 만화의 경우 rtl).
스타일(실시간 목록과 한 줄 사용법을 보려면 python scripts/letterer.py styles 실행):
- 대화:
speech,speech-hand(손으로 잉크칠한 듯한, 이탤릭체, 굽은 꼬리),emphasis(큰 줄;_word_로 밑줄),whisper(점선),strain(떨리는 윤곽선, 옅은 노란색: 악물고 하는 말),electronic(지그재그 꼬리). - 생각:
thought-1(=thought, 솜털 구름),thought-2(가는 가리비 모양),thought-3(거품이 있는 매끄러운 타원). 확실하지 않으면thought-1을 사용하십시오: 더 자세한 설명 없이 생각 풍선이 요청될 때 기본값입니다. 생각 줄기는 말풍선과 조준점 사이에 최소 2.5 ch의 빈 공간이 필요하며, 그렇지 않으면 QA가 실패합니다. comic-mastercomic-lettering.md§12.8을 참조하십시오. - 큰 소리:
shout,shout-2(손으로 그린 버스트),burst(꼬리 없음). - 상자:
caption,caption-hand,declaration및declaration-hand(인용된 나레이션; 독백을 위해 페이지 아래로 여러 개 쌓기),locator,narrator. - 효과음:
sfx(소스 위치에 얇은 흰색 외부 윤곽선 포함),sfx-micro(작은 소리),sfx-stack(소스 옆에 쌓인 반복 소리:"wub|wub|wub").
책 전체에 걸쳐 하나의 대화 모양을 유지하십시오: 일반 스타일 또는 -hand 스타일 중 하나를 선택하고, 한 장면 내에서 혼합하지 마십시오. 모든 스타일을 나란히 보려면 리포지토리 루트의 examples/styles/sheet_lettered.png를 참조하십시오. 새 스타일을 추가하려면 새 드로잉 코드를 작성하지 말고 styles.json에 항목을 추가하십시오.
빠른 단일 항목: python scripts/letterer.py bubble --image in.png --out out.png --text "엎드려!" --style shout --at 0.17,0.25 --tail-to 0.155,0.47 --panel 0.0125,0.03,0.329,0.97
도구가 없는 경우 아래 규칙에 따라 동등한 기능을 구축하고 동일한 QA 수치를 생성하십시오.
- 레터링을 SVG로 구축하고 resvg, cairosvg 또는 헤드리스 Chromium(Playwright)으로 렌더링하십시오. 벡터는 부드러운 곡선, 실제 커닝, 깔끔한 선 및 편집 가능한 레이어를 제공합니다. 래스터 타원 호출로 말풍선을 그리지 마십시오.
- 실제 만화용 글꼴을 사용하십시오.
- 대화: Comic Neue, Patrick Hand, Anime Ace 또는 기타 손글씨 스타일의 글꼴, 모두 대문자로, 작품 전체에 하나의 글꼴을 사용하십시오.
- 효과음 및 제목: Bangers와 같은 두꺼운 디스플레이 서체.
- 시스템 산세리프(Arial, Helvetica, DejaVu)는 절대 사용하지 마십시오. 글꼴 파일이 없으면 자동으로 대체하지 않고 명시적으로 오류를 발생시키십시오.
- 대화 및 캡션에는 일반적이고 직립한 손글씨 스타일의 글꼴만 사용하십시오. 사람들이 읽어야 하는 단어에는 디스플레이, 테크노, 미래지향적, 스텐실, 호러 또는 참신한 글꼴을 사용하지 마십시오: 가로대가 없거나 양식화된 E/A/M 형태가 있는 글자는 읽기 속도를 늦추고 분위기를 바꿉니다. 장식용 글꼴은 효과음, 제목 및 로고에만 사용하십시오.
- 프로젝트 바이블에 승인된 목록(예: 대화: Comic Neue Bold 또는 Anime Ace; 효과음: Bangers)을 유지하고 목록에 없는 글꼴은 거부하십시오.
- 말풍선은 텍스트에 맞춰집니다:
- 텍스트를 다이아몬드 모양으로 줄 바꿈합니다: 짧은 윗줄, 가장 넓은 중간줄, 짧은 아랫줄, 한 단어로 된 마지막 줄은 피합니다.
- 텍스트 블록을 측정하고 그 주위에 둥근 타원 또는 슈퍼타원을 그립니다.
- 텍스트의 모든 모서리가 벽에서 최소 한 캡 높이 이상 떨어질 때까지 벽을 늘립니다.
- 고정된 타원에 텍스트를 절대 강제로 넣지 마십시오.
- 꼬리는 곡선이고 가늘어지는 경로이며 삼각형이 아닙니다:
- 밑동은 말풍선 너비의 약 1/8 (절대 ~0.8 캡 높이 미만), 발화자에 가장 가까운 쪽에 위치합니다.
- 길이는 말풍선 높이의 약 절반(또는 작은 말풍선의 경우 2.5 캡 높이)까지, 발화자의 입 쪽으로 휘어집니다.