Manga Finish
Manga Finish doesn't halftone your image — it reprints it as a manga page
- image
- pen_lines
- IMAGE
Every halftone filter you've tried fails the same way: it reads the whole picture as one grey ramp and rains dots over all of it. Lineart goes soft, skin gets a rash, nothing looks drawn. Manga Finish avoids that because it isn't a filter - it's the separate-layers routine a manga artist actually runs, written as one readable OpenCV file.
It's the last node in a manga chain, and the one that decides whether you get a printed page or stippled AI art. Everything upstream - a Qwen-Image edit, a lineart preprocessor, or just Manga Levels - decides what is dark; this node decides how dark becomes dots.
How it works
It's deterministic, runs on the CPU, takes no seed, and downloads nothing. Five stages, each one fixing a specific complaint about halftone filters:
Lines get their own layer. Solid blacks come from a blur and threshold. Strokes come from comparing every pixel to a box blur of its own neighbourhood - a line is darker than its surroundings - then filtering the blobs by shape: long and thin survives as a stroke, compact and round gets rejected as a dot. That last step is why pre-existing AI halftone pattern and compression speckle vanish instead of being amplified.
Values are read with the lines masked out. The value map divides the blurred image by the blurred mask, so black lines never bleed a dark halo into the tones beside them. Two edge-preserving bilateral passes then flatten the greys and average away any dots already in the source.
Values get pushed into four flat areas - paper, light tone, dark tone, beta - and regions under a size threshold melt into their neighbours, so you get deliberate shapes instead of tone confetti.
One screen is printed over all of it. A single 45° dot screen, 3× supersampled so the dots are round, with pitch derived from width divided by screen_lines. One screen for the whole page means no moiré between areas, which is the giveaway on filtered-looking output. Everything ends up binary black and white.
The inputs worth setting
screen_lines is the big one: rows of dots across the width, 120 coarse / 200 normal / 300 fine, pitch = image width / screen_lines, so the same number looks the same at any resolution. The trap is the inverse - at 512 px wide, 200 lines gives 2.5 px dots that blur into grey mush. Keep ~5 px per dot, so screen_lines ≈ width ÷ 5. At the README's 2 MP working size, 200 is right.
white_point (0.80) and black_point (0.30) are your contrast. Lower white_point and more tone clears to paper - that's how you rescue skin and light hair. Raise black_point for more solid black. One thing the panel doesn't tell you: the light/dark tone boundary is the midpoint of those two, not its own control, so bumping black_point to 0.55 to send a coat to beta drags that split up with it. Keep black_point below white_point, or the level mapping stops making sense.
gradation (1.0) handles what flat areas can't: where the source fades smoothly, coverage blends into a ramp instead of stepping. Set it to 0 for hard flat areas only. light_tone / dark_tone (0.18 / 0.42) are just dot coverage of the two flat tones - fine-tune, don't fight them.
pen_lines is the optional one that earns its keep. Feed it a white-on-black line map from Manga2Anime_LineArt_Preprocessor in comfyui_controlnet_aux and those lines get drawn onto the finished page; pen_threshold decides how many make it (0.25 keeps folds and interior outlines, 0.5 only the clearest). Thin model lines get a lot more confident here. white_lines (0.4) then cuts the strongest strokes out white inside solid black - the way a dark coat is inked - so beta keeps its seams instead of becoming a hole.
The output is a single IMAGE, three channels, batches handled frame by frame (alpha dropped). Wire it into Manga Panel or straight to a Save Image.
Install
ComfyUI Manager → search Manga Screen (the pack registers that display name), or:
cd ComfyUI/custom_nodes
git clone https://github.com/ashukae/ComfyUI-MangaScreen
Dependencies are opencv-python and numpy, nothing else - no model downloads for the node itself. If cv2 is missing from your ComfyUI Python, install the requirements into it and restart:
cd ComfyUI/custom_nodes/ComfyUI-MangaScreen
python -m pip install -r requirements.txt
That's the number one failure with this pack: a red IMPORT FAILED on all three nodes, because a missing cv2 takes the whole module down with it.
Where it goes wrong
Don't downscale after it. The screen is anchored to the pixels you feed in, so finishing at 2048 and shrinking to 1024 resamples the dots into grey. Finish at delivery size.
Dark clothes stay dark grey. The README's own fix: push black_point to 0.5–0.6, or use the bolder edit instruction in the included workflow's note with black_point at 0.40. The second is usually prettier - the edit model draws folds, this node only cuts them white.
It can only work with what it's given. A red dress and a red ribbon are the same brightness, and no tonal trick invents a difference. That's a job for an edit model upstream. Which is the honest shape of this whole layer: the model draws, the deterministic pass prints.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| screen_lines | INT | 20040–600 | Rows of dots across the image width. 120 coarse, 200 normal, 300 fine. The same value looks the same at any resolution. |
| white_point | FLOAT | 0.800.3–1 | Brighter than this becomes paper white. Lower it to clear more tone (skin, light hair). |
| black_point | FLOAT | 0.300–0.7 | Darker than this becomes solid black. Raise it for more beta. |
| light_tone | FLOAT | 0.180.02–0.9 | — |
| dark_tone | FLOAT | 0.420.02–0.95 | — |
| gradation | FLOAT | 1.000–1 | Gradation tone: where the original fades smoothly (a shadow deepening into black), dots grow with the darkness instead of being cut into flat steps. 0 keeps only flat areas. |
| pen_threshold | FLOAT | 0.300.05–0.95 | Only with pen_lines connected. Lower draws more of its lines on top (0.25 folds, outlines inside tone and hatched blush; 0.5 only the clearest). |
| white_lines | FLOAT | 0.400–1 | Inside solid black areas, the main lines are cut out thin and white so a dark coat keeps its folds, seams and zips. Higher keeps more of them (with pen_lines: 0.2 only the strongest, 0.4 main folds, 1.0 all). 0 turns it off. Raise black_point to send dark clothes to beta. |
| pen_linesopt | IMAGE | Line map drawn on top of the finished page, e.g. Manga Lineart (Manga Line Extraction) run on the same image. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |