RookieUI ControlNet Preprocess
The A1111 preprocessor menu, one node, 50-odd annotators
- image
- mask
- IMAGE
Before a ControlNet can guide anything, you have to turn your source image into a control map - a canny edge map, a depth map, a pose skeleton, a lineart trace. That conversion is the preprocessor (or "annotator"), and in Automatic1111 it's a single dropdown with the whole menu behind it. This node is that dropdown, rebuilt for native ComfyUI, with around 50 annotator modules in one place. RookieUI is an A1111-style sidebar for ComfyUI, and this is the node it emits when you pick a Control Type and hit "Run Preprocessor."
Its output feeds straight into RookieUIControlNetApplyNativeAdvanced. Think of the pair as a two-step: preprocess turns your photo into a map, apply welds the map onto your conditioning.
How it works
You give it an image and pick a module, and it runs the matching annotator to produce a control map - an IMAGE output. The module enum is the big one: it carries about 51 options covering the standard families - canny and blur for edges, the whole depth line (depth_anything_v2, depth_midas, depth_zoe, depth_leres), normal maps (normalmap, normal_bae, normal_midas), and further down the list the lineart, softedge, scribble, openpose, MLSD and tile variants you'd expect. Each control type is really a family of preprocessors, which is why the list is long.
The rest of the inputs control resolution and framing so the map lines up with your generation.
The inputs that matter
module- the annotator. This is the decision.cannyfor hard architectural/mechanical edges, adepth_anything_v2for spatial arrangement,openpose-family for people, alineartvariant for character/anime structure. Pick the control type that matches what you're trying to lock.pixel_perfect(default off) - A1111's Pixel Perfect. Turn it on and the preprocessor picks its working resolution from your source and target dimensions instead of a fixed number, which usually gives cleaner maps for crop/resize workflows. Genuinely worth leaving on.threshold_a/threshold_b(default 64) - the low/high thresholds. These only mean something for a few modules - canny's edge thresholds, MLSD's line thresholds - and are inert for depth, pose, and most others. Don't fiddle with them unless your module actually uses them.
The framing inputs are processor_res (the annotator's internal resolution, default 512), target_width / target_height, and resize_mode (crop_and_resize / just_resize / resize_and_fill) - the same three fit modes A1111 offers. There's also a use_mask toggle with an optional mask input, for restricting preprocessing to part of the frame.
How to install it
ControlNet, preprocessors included, is built into RookieUI. Via ComfyUI Manager, search ComfyUI-RookieUI, install, restart. Manually, from your ComfyUI root:
cd ComfyUI/custom_nodes
git clone https://github.com/rookiestar28/ComfyUI-RookieUI
cd ComfyUI-RookieUI
python -m pip install -r requirements.txt
Then restart ComfyUI.
Common issues
Some annotators need their own model to run. Depth (depth_anything), openpose, and the heavier estimators pull an annotator model on the host; if a module returns a blank or degraded map, that's usually a missing annotator model rather than a bad input, and RookieUI will report the fallback status. Canny and blur are pure image ops and always work.
The subtler trap is choosing a control type your base model can't use. On a 2026 union model the condition menu is smaller than it was on SDXL - segmentation, normal maps and QR/brightness conditioning largely never got rebuilt for post-Flux bases. You can preprocess a normal map here just fine, but if your ControlNet has no normal-map mode, the apply step won't have anything to load it into. And a reminder that pairs with the apply node: even a perfect control map wants a sane strength and step range downstream - a clean canny at strength 1.0 through the whole sample will still overcook a modern base.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| module | COMBO | 51 options: none, blur, canny, depth, depth_anything_v2, depth_anything, +45 | |
| processor_res | INT | 51264–2048 | — |
| threshold_a | FLOAT | 64.000–255 | — |
| threshold_b | FLOAT | 64.000–255 | — |
| pixel_perfect | BOOLEAN | false | — |
| target_width | INT | 51264–8192 | — |
| target_height | INT | 51264–8192 | — |
| resize_mode | COMBO | 3 options: crop_and_resize, just_resize, resize_and_fill | |
| use_mask | BOOLEAN | false | — |
| maskopt | MASK | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |