Comic Master — Outillage
Compagnon de comic-master. Cette dernière décrit à quoi ressemblent de bonnes pages ; celle-ci couvre les outils pour les réaliser. La plupart des mauvais lettrages viennent d'un mauvais outillage : ellipses raster dessinées à la main, polices système et texte collé à plat sur l'illustration.
1. Dessin de cases avec ComfyUI
Comment exécuter ComfyUI lui-même (installation de modèles, lancement, exécution de templates et workflows) relève des compétences génériques ComfyUI dans vendor/comfy-cli-skills/ à la racine de ce dépôt. Cette section couvre comment les utiliser pour la BD.
1.1 Configuration de génération d'un projet BD
- Deux workflows par projet : text-to-image pour les nouvelles cases, image-edit pour les corrections de continuité, l'ajustement des plans et le texte sur les accessoires. Choisissez-les une fois, avec un modèle et des réglages fixes, et enregistrez-les dans la bible du projet.
- Une case = une tâche = une image sauvegardée. Chaque case est ainsi traçable jusqu'à son prompt, sa seed et ses réglages.
- Dimensionnez chaque rendu à partir de la mise en page, pas l'inverse. Prenez le cadre de la case depuis la miniature et effectuez un rendu à environ 1 mégapixel dans ce rapport d'aspect (ex. 1408×704 large, 768×1024 haut, 1536×640 bande). Redimensionnez ou recadrez ensuite dans le cadre, en éloignant les détails importants pour l'histoire des bords de recadrage.
- Groupez par scène, pas par page, afin que la lumière, la palette et les arrière-plans restent cohérents au sein d'une scène.
1.2 Cohérence
- D'abord une feuille de modèle. Générez une planche de vues et d'expressions pour chaque personnage, choisissez la meilleure, et réutilisez-la comme image de référence (IP-adapter, image-edit input, ou un LoRA de personnage si vous pouvez en entraîner un).
- Ancres fixes (comic-master
comic-characters.md§4.5) mot pour mot dans chaque prompt, énumérées de gauche à droite ; une ancre de style pour tout le projet. - Seeds : enregistrez la seed de chaque case acceptée pour pouvoir la régénérer ou la varier.
- Contrôle de pose : utilisez un OpenPose ou un depth ControlNet lorsque le cadrage est important (ordre des personnages, lignes de regard, règle des 180°).
1.3 Règles de prompt qui tiennent
- Sachez si les négatifs fonctionnent. Les modèles distillés avec un CFG de 1 (FLUX.2 klein, Z-Image-Turbo) ignorent généralement le prompt négatif. Avec eux, formulez ce que vous voulez de manière positive ("exactement quatre personnes", "front détendu et lisse"). N'utilisez les négatifs qu'avec des modèles fonctionnant à un CFG réel, ou ajoutez un nœud de guidance négative (ex. NAG).
- Faites le prompt dans la langue du modèle. FLUX et Qwen/Z-Image lisent des phrases naturelles ; SDXL lit des tags séparés par des virgules. Pour les modèles à phrases, utilisez un ordre fixe : plan et angle → chaque personnage avec sa position, de gauche à droite → une seule action → expression comme anatomie → décor → lumière → style.
- Les expressions comme anatomie, jamais de noms. "Ennuyé" a tendance à produire un froncement de sourcils. Décrivez-le plutôt : "paupières supérieures à moitié baissées, sourcils hauts et plats, bouche formant une ligne plate fermée". Là où les négatifs fonctionnent, ajoutez aussi le négatif de l'échec ("sourcils froncés, renfrogné").
- Couleurs des costumes à l'intérieur de la proposition qui nomme la partie du corps ("combinaison marine sur les épaules"). Les gros plans dérivent vers des couleurs génériques ; mettez la couleur de dérive en négatif.
- Pas de doublons : une ancre par personnage, nombre et ordre explicites ("exactement trois personnes : de gauche à droite, …"), et, là où les négatifs fonctionnent, "personnages en double, clone, personnes supplémentaires" dans le négatif.
- Réservez l'espace texte dans le prompt ("le tiers supérieur est un mur plat vide"). Demandez une image propre et sans texte ("pas de texte, pas de lettres, pas de bulles", dans le négatif quand ça marche, sinon formulé positivement comme "image propre sans aucun lettrage"), sauf lors d'une passe dédiée au texte sur les accessoires.
- Partez de la miniature. Transformez la miniature en un blocage grossier (figures bâtons, boîtes pour les meubles) et alimentez-la comme image de contrôle de pose, lineart ou depth, afin que le placement des personnages, l'échelle et qui-est-dans-la-pièce suivent le plan.
- Générez plusieurs, choisissez-en un. Effectuez le rendu de 3 à 4 seeds par case et sélectionnez en fonction de l'OBJECTIF de la case et des ancres avant tout lettrage.
1.4 Édition au lieu de tout recommencer
Utilisez le workflow image-edit avec la case existante comme entrée :
- Correspondance des cases (même pièce, gags de répétition, plans de réaction) : ajustez la case précédente dans la nouvelle au lieu de générer à partir de zéro.
- Suppression plutôt que repositionnement. "Enlevez la deuxième personne à la table" fonctionne ; "déplacez-le derrière la chaise" échoue généralement.
- Corrections de continuité : figurants indésirables, mauvaises couleurs de costume, un accessoire dans la mauvaise main. Inpaintez ou éditez uniquement cette zone.
- Texte sur accessoires (§4) : un mot court écrit sur un badge ou une pancarte, vérifié à 1:1.
1.5 Révision avant lettrage
- Comparez chaque rendu avec ses ancres et l'OBJECTIF de la case : visage, couleurs du costume, accessoires et mains, direction de la lumière, personnes supplémentaires, glyphes indésirables, zone de texte vide.
- Tenez un journal par case (prompt, seed, réglages, accepté ou rejeté et pourquoi) afin que les corrections soient reproductibles.
1.6 Configurations de modèles recommandées
8 Go de VRAM (par défaut fonctionnel) :
| Tâche | Modèle et fichiers | Remarques |
|---|---|---|
| Cases et éditions | FLUX.2 [klein] 4B fp8 (flux-2-klein-4b-fp8) + encodeur de texte qwen_3_4b + flux2-vae | ~4 étapes, CFG 1. Le mode édition accepte des images de référence (feuilles de modèle) pour des personnages conformes. Apache-2.0. |
| Cases uniques de qualité supérieure, texte sur accessoires | Z-Image-Turbo int8 (z_image_turbo_int8_convrot) + qwen_3_4b_fp8_mixed + ae.safetensors | Template image_z_image_turbo_int8 ; ~8 étapes. Meilleur texte et suivi des instructions ; pas d'édition par image de référence. Contrôle de pose/profondeur via le template Z-Image-Turbo Fun Union ControlNet. Apache-2.0. |
| Contrôle de mise en scène | SDXL + OpenPose ControlNet + IP-adapter | Contrôle de pose et de mise en page le plus mature à 8 Go ; affinez le résultat avec Klein. |
| Détourage de personnages | comfyui-rmbg avec BiRefNet toonout (conçu pour les dessins animés et l'illustration) ou RMBG-2.0 | Pour le workflow en couches ci-dessous. |
| Upscaling | 4x-UltraSharp, tuilé | Faites le rendu à ~1 MP, puis upscalez à la taille d'impression. |
À 8 Go : utilisez des poids fp8/int8/GGUF ; déplacez l'encodeur de texte sur le CPU ou un second GPU si nécessaire ; décodage VAE tuilé pour les grandes images ; un seul modèle chargé à la fois ; gardez tout LLM local sur un GPU différent.
Personnages en couches : générez chaque personnage sur un fond uni plat, détourez-le (BiRefNet toonout), et composez-le sur un arrière-plan commun par scène. Cela corrige les problèmes de mise en scène, d'échelle et de présence des personnages que le prompting seul ne résout pas, et permet aux accessoires de rester de la même taille d'une case à l'autre.
Avec plus de VRAM : FLUX.2 [klein] 9B (~20 Go ; non commercial), Qwen-Image-2.1 (~24 Go ; 10 images de référence, sortie RGBA transparente, éditions masquées ; licence de recherche), FLUX.2 [dev] (24 Go+ en fp8 ; qualité maximale et multi-référence ; non commercial). Vérifiez la licence de chaque carte modèle avant utilisation commerciale ; la pile 8 Go ci-dessus est entièrement Apache-2.0.
2. Moteur de lettrage : dessinez des vecteurs, pas des pixels
2.0 Utilisez l'outil de lettrage (par défaut)
N'écrivez pas de code de lettrage. Utilisez scripts/letterer.py, qui est livré dans le dossier de cette compétence (à côté de ce SKILL.md), avec scripts/README.md, scripts/styles.json et les polices approuvées dans scripts/fonts/. Résolvez le chemin par rapport à ce SKILL.md, où que le dépôt ait été cloné ; ne copiez jamais le script dans un projet. Il suit déjà toutes les règles de cette section et exécute lui-même les contrôles qualité du §5. Prérequis : Python 3.9+ avec Pillow et numpy (pip install -r scripts/requirements.txt) ; mediapipe recommandé, qui active la vérification automatique des visages (les bulles ne doivent pas chevaucher les visages) et "tail_to": "auto".
Workflow :
python scripts/letterer.py grid --image panel_or_page.png --out grid.pnget observez la superposition. Lisez les rectangles des cases, la boîte de tête et la bouche de chaque personnage, et les zones libres. Choisissez ensuite la position de chaque bulle et le point de visée de sa queue selon les règles de placement dans comic-mastercomic-lettering.md§12.2 et la procédure pas à pas du §12.7 : bulle dans un espace libre près de la tête, queue visant la bouche mais se terminant à l'extérieur de la tête. Toutes les coordonnées sont relatives : 0.0–1.0 à partir du coin supérieur gauche.- Écrivez une spécification de page (JSON) avec les éléments dans l'ordre de lecture :
{
"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": "La ville appelle. Je réponds.", "zone": [0.03,0.06,0.31,0.24]},
{"style": "speech", "text": "Quelqu'un d'autre a|entendu ce bruit ?", "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": "KA-CHUNK", "at": [0.80,0.88], "size": 2.4, "rotate": -8}
]
}
python scripts/letterer.py page spec.json. Un code de sortie0signifie que tous les contrôles qualité ont réussi ;1signifie que le rendu a été effectué mais que la QA a échoué, donc lisez les échecs imprimés, corrigez la spécification (rapprochez la bulle du personnage, agrandissez la zone, coupez des mots, ré-agencez avec|) et relancez-la ;2signifie une erreur (style inconnu, police manquante, spécification incorrecte).- Regardez le PNG en taille réelle et en miniature. Conservez le SVG (modifiable) et le
_qa.json(valeurs mesurées) avec la page.
Champs d'élément : style ; text (| force un saut de ligne, sinon il s'adapte automatiquement en forme de losange ; _mot_ souligne pour insister) ; at [x,y] centre ou zone [x0,y0,x1,y1] pour l'adapter à l'intérieur ; tail_to [x,y] point de visée : pas la bouche elle-même mais un point dans l'espace libre juste à l'extérieur de la tête, sur la ligne de la bulle vers la bouche, à environ 1 ch du visage (l'outil arrête la pointe un peu avant, de sorte que la queue vise le personnage sans le toucher) ; omettez-le avec "no_tail": true. N'utilisez pas "auto" : il renvoie les lèvres elles-mêmes ; optionnel panel index, size multiplicateur, rotate (degrés, horaire), fill (fond), ink (contour), text_color, font, tail_bend, link (index d'une bulle précédente du même personnage : relie les deux), bleed (true pour briser intentionnellement la bordure de la case), seed.
Champs de page au-delà des bases : defaults définit les couleurs et la police pour chaque élément ({"fill": "#FDF6E3", "ink": "#2B2B2B", "text_color": "#1F3A7A"}) ; styles surcharge un style pour cette page ({"speech": {"fill": "#FFF7D6"}}) ; avoid par défaut à "auto" (les visages détectés sont protégés), ou une image de masque, ou false.
Effectuez le lettrage de la page ou de la bande assemblée en une seule exécution page, jamais case par case. Une seule exécution maintient la taille du lettrage identique entre les cases et permet à la QA de vérifier l'ordre de lecture et les chevauchements sur toute la page.
Champs de page : chemins image, out/svg/qa, panels (fortement recommandé : utilisé pour les marges, l'ordre de lecture et la taille du lettrage), ch (hauteur de capitale en pixels ; par défaut, petit côté médian de la case ÷ 30, le même partout), avoid (blanc = visages, mains ou action clé à ne pas obstruer ; construisez-le à partir d'une passe de segmentation), direction (ltr ou rtl pour le manga).
Styles (exécutez python scripts/letterer.py styles pour la liste en direct avec des utilisations en une ligne) :
- Dialogue :
speech,speech-hand(encré à la main, italique, queue courbe),emphasis(la grosse ligne ; soulignez avec_mot_),whisper(tirets),strain(contour tremblant, jaune pâle : mots prononcés entre les dents serrées),electronic(queue en zigzag). - Pensées :
thought-1(=thought, nuage gonflé),thought-2(fins festons),thought-3(ovale lisse avec bulles). En cas de doute, utilisezthought-1: c'est le style par défaut lorsqu'une bulle de pensée est demandée sans plus de détails. Un chemin de pensée nécessite au moins 2,5 ch d'espace libre entre la bulle et son point de visée, sinon la QA le signale comme échec. Voir comic-mastercomic-lettering.md§12.8. - Fort :
shout,shout-2(éclat dessiné à la main),burst(pas de queue). - Boîtes :
caption,caption-hand,declarationetdeclaration-hand(voix off citée ; empilez plusieurs en bas d'une page pour un monologue),locator,narrator. - SFX :
sfx(à la source, avec un fin contour blanc extérieur),sfx-micro(petits bruits),sfx-stack(un son répété empilé à côté de sa source :"wub|wub|wub").
Gardez un seul look de dialogue par ouvrage : soit les styles simples, soit les styles -hand, pas un mélange au sein d'une scène. Voir examples/styles/sheet_lettered.png à la racine du dépôt pour chaque style côte à côte. Ajoutez un style en ajoutant une entrée à styles.json, jamais en écrivant un nouveau code de dessin.
Élément unique rapide : python scripts/letterer.py bubble --image in.png --out out.png --text "BAISSE-TOI !" --style shout --at 0.17,0.25 --tail-to 0.155,0.47 --panel 0.0125,0.03,0.329,0.97
Si l'outil est manquant, suivez les règles ci-dessous pour construire l'équivalent, et produisez les mêmes valeurs QA.
- Construisez le lettrage en SVG et faites-en le rendu avec resvg, cairosvg ou Chromium sans tête (Playwright). Les vecteurs donnent des courbes lisses, un crénage réel, des traits nets et une couche modifiable. Ne dessinez pas les bulles avec des appels d'ellipse raster.
- Utilisez une vraie police de BD.
- Dialogue : Comic Neue, Patrick Hand, Anime Ace ou une autre police manuscrite, en capitales, une seule police pour l'ensemble de l'œuvre.
- SFX et titres : une police d'affichage grasse comme Bangers.
- Jamais de sans-serif système (Arial, Helvetica, DejaVu). Signalez une erreur fracassante si le fichier de police est manquant plutôt que de faire une substitution silencieuse.
- Le dialogue et les légendes utilisent uniquement une police manuscrite simple et droite. Pas de polices d'affichage, techno, futuristes, pochoir, horreur ou fantaisistes pour les mots que les gens doivent lire : les lettres avec des barres transversales manquantes ou des formes stylisées de E/A/M ralentissent la lecture et changent le ton. Les polices décoratives sont réservées aux SFX, titres et logos uniquement.
- Gardez une liste approuvée dans la bible du projet (ex. dialogue : Comic Neue Bold ou Anime Ace ; SFX : Bangers) et refusez toute police qui n'y figure pas.
- Les bulles sont ajustées au texte :
- Disposez le texte en forme de losange : ligne courte en haut, milieu le plus large, ligne courte en bas, pas de ligne d'un seul mot en dernière position.
- Mesurez le bloc de texte et dessinez un ovale arrondi ou une superellipse autour.
- Agrandissez la paroi jusqu'à ce que chaque coin du texte soit à au moins une hauteur de capitale du bord.
- Ne comprimez jamais le texte dans une ellipse fixe.
- Les queues sont des chemins courbes et effilés, pas des triangles :
- Base environ ⅛ de la largeur de la bulle (jamais moins de ~0,8 hauteur de capitale), du côté le plus proche du personnage.
- Longueur jusqu'à environ la moitié de la hauteur de la bulle (ou 2,5 ch pour les petites bulles), incurvée vers la bouche et se terminant à une distance d'environ 1 ch du visage.
- Courbez-la pour passer autour du visage, jamais à travers.
- Les lettres des bulles sont centrées automatiquement ; ajoutez une exception de centrage pour les virgules ou points de fin de phrase s'ils sont seuls sur la ligne inférieure (le centrage les place alors au centre, ce qui est faux) ; sinon, conservez le centrage.
- Le texte est toujours en capitales à l'exception des pronoms personnels, des noms propres et des mots qu'une règle de la langue source met en minuscules (ex. l'anglais pour "a" et "the" parfois ; pour le français, les déterminants, prépositions et pronoms sont généralement en minuscules, sauf en début de réplique). Si le texte source a une casse mixte, conservez-la. En cas de doute, commencez chaque mot par une majuscule.
2.1, 2.2, 2.3, 2.4
(Les sous-sections 2.1 à 2.4 sont omises dans la source originale. Cette compétence se concentre sur le script letterer.py comme implémentation par défaut.)
3. Détection : savoir ce qu'il y a dans l'image
3.1 Segments d'image
python scripts/segment.py in.png --zones (expérimental). Place une grille de segments de zone sur l'image : arrière-plan, personnage, action, bulle, texte. Utilisé pour construire le masque avoid (blanc = visages, mains ou action clé).
3.2 Zones de texte existant
python scripts/read-text.py in.png utilise Tesseract ou une API de vision pour trouver les glyphes existants (texte brut stocké dans des bulles) et renvoie les boîtes englobantes. Ne pouvant pas vous faire confiance pixel par pixel pour le lettrage, mais utile pour savoir ce qui est déjà présent.
3.3 Analyse des visages
python scripts/face-regions.py in.png (nécessite mediapipe) renvoie les boîtes de tête et de bouche pour chaque visage détecté. Utilisé par l'outil letterer grid pour montrer où placer les bulles, et par le contrôle qualité avoid.
4. Texte sur accessoires
Pendant la génération (workflow text-to-image du §1.1), le prompt a réservé un espace vide pour le texte. Maintenant, placez ce texte de manière fiable :
- Détouragez le personnage ou l'objet (BiRefNet toonout).
- Générez une petite texture de texte avec la bonne police sur fond transparent (
python scripts/text-tile.py "BADGE" --font Bangers --size 48 --out badge_text.png). - Transformez en perspective (
python scripts/perspective.py badge_text.png --warp 0.3,0.1,0.6,0.2,0.4,0.8,0.7,0.9 --out warped.png). - Composez sur l'accessoire avec un mode de fusion qui convient (par défaut : lighter / écran).
Pour un texte codé en dur dans le prompt (comme un panneau "BOUCHERIE" sur une vitrine, §1.3 règle 11), vous avez besoin d'un modèle entraîné pour le faire, ou vous devez utiliser le workflow d'édition d'image avec une instruction de modification ("écrire ‘BOUCHERIE’ sur l'enseigne"). Les résultats sont imprévisibles ; les étapes ci-dessus sont plus fiables.
5. QA de la page assemblée
Exécutez python scripts/letterer.py qa spec.json --report qa_report.html. Le script vérifie :
- Ordre de lecture : les éléments sont-ils dans l'ordre de lecture ?
- Chevauchement visage/bulle : une bulle chevauche-t-elle un visage détecté ?
- Espacement des bulles de pensée : la bulle est-elle à au moins 2,5 ch de son point de visée ?
- Police : toutes les polices sont-elles dans la liste approuvée ?
- Couleurs : les couleurs sont-elles dans la palette définie ?
- Rognage des marges : le texte est-il à au moins 0,5 ch du bord de la case ?
Le rapport HTML montre chaque case avec les zones de texte superposées, les codes couleurs pour les réussites/échecs, et un résumé des contrôles.
Exécutez la QA avant de finaliser la page. Ne passez pas à la page suivante tant que la page en cours n'a pas une QA parfaite.