Palette Map
Push a whole frame toward a look in one setting
- image
- mask
- image
- mask
- palette_map_info
Every colorist has a "what if I just... teal-and-orange this thing" moment, and x1PaletteMap is the node that makes that a one-setting change instead of a ten-node chain. It remaps your image's colors toward a target palette - pick a preset like teal_orange or earth_film, or define your own four-color ramp - and it's done. It's the pack's Color/Tools branch answer to the kind of look-building that post-processing.md covers: deterministic color work that should never cost you a diffusion pass.
How it works
The node builds a color mapping from a small palette and applies it to the image. The presets, straight from the source:
teal_orange- the blockbuster contrast look (shadows toward teal, highlights toward orange)pastel_pop- soft, high-key, playfulneon_night- saturated, dark, cyberpunk-ishearth_film- muted natural tonesmono_tint- a single-color gradecustom- your own ramp via four color slots (c1_r/g/bthroughc4_r/g/b)
The interesting controls are mapping_mode (soft, the default) and softness - they control how hard the remap snaps to the palette versus keeping the original colors as a base. Then there's preserve_luma (default on), which is the difference between a tasteful look and a posterized mess: with luma preserved, the color shifts but the tonal structure of the image survives. Leave it on.
amount is the wet-dry knob - 1.0 applies the full remap, 0.5 blends half the effect in. This is the control that makes palette grading safe to iterate with.
Inputs and outputs
Required: image and settings_json. Optional: mask for restricting the remap to part of the frame (grade only the background, keep the subject's skin untouched).
image- the palette-graded resultmask- the effective influence maskpalette_map_info- a summary string of the resolved settings and which preset ran
Where this fits
It's the fast path in the pack's color stack. Where x1ColorWheels and x1Curves give you surgical control, x1PaletteMap gives you direction: you're not hand-balancing, you're trying looks. The practical workflow is to stack it - palette map for the big color decision, then a curves or split-tone node for the fine polish. Because amount and preserve_luma exist, you can land the "teal shadows, warm skin" look without ever fighting a channel mixer.
The custom ramp is worth a look if you've got a reference still or a brand color. Four colors is a small ladder, but with soft mapping and luma preservation it covers a surprising amount of ground - you're defining where the image wants to be, not dictating every pixel.
Installing it
MKRShift Nodes via ComfyUI Manager (search "MKRShift Nodes"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart and it's live. No requirements, no models, no ffmpeg - it's numpy color math on the tensor. The standard caveat applies: the pack is a huge grab-bag, so you're installing a lot of surface area for one color node. The Color branch as a whole (wheels, curves, the scopes, LUT nodes) is the best reason to keep it around.
Where people get burned
The two knobs that will bite you are preserve_luma and mapping_mode. Turn preserve_luma off and every skin tone becomes a plastic mask. Push mapping_mode to something harder than soft with low softness and the image snaps into flat poster-like bands instead of a grade. If the result looks like a gradient map filter, that's those two settings - not the palette.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"palette_preset":"teal_orange","mapping_mode":"soft","softness":0.5,"preserve_luma":true,"amount":1.0,"c1_r":0.08,"c1_g":0.22,"c1_b":0.28,"c2_r":0.18,"c2_g":0.52,"c2_b":0.62,"c3_r":0.84,"c3_g":0.52,"c3_b":0.22,"c4_r":1.0,"c4_g":0.8,"c4_b":0.55,"mask_feather":12.0,"invert_mask":false} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| palette_map_info | STRING | — |