⚗ Alchemica · Skin colorimeter (ITA°) [1.0, use Alchemica Skin Colorimeter (ITA°)]
What skin tone did your model actually paint?
- immagine
- ita
- report
Most "my LoRA made her paler" arguments end with two people squinting at two PNGs. This node ends it with a number.
What it is
AlchemicaPelleITA is the skin-tone colorimeter shipped in ComfyUI-AlchemicaSampler, the Krea 2 toolkit whose headline act is a calibrated sampler. This is the quiet little node at the end of the list, and it does exactly one thing: it measures the skin of the largest face in an image and reports it as ITA°, the dermatology standard from Chardon (1991) - ITA = atan((L* − 50) / b*) in CIELAB. The scale it uses: above 55 very light, 41–55 light, 28–41 intermediate, 10–28 tan, −30–10 brown, below −30 dark.
Reach for it when you're comparing rather than admiring: two checkpoints, a LoRA at 0.6 versus 0.8, a "tanned Mediterranean" prompt that maybe did nothing. Krea 2's text encoder is good at natural language and genuinely inconsistent about skin tone, and this is the cheapest way to catch drift across a seed sweep.
One naming thing first. This is a 1.0 node, so live it appears as "⚗ Alchemica · Skin colorimeter (ITA°) [1.0, use Alchemica Skin Colorimeter (ITA°)]", filed under the pack's legacy category with Italian sockets. The English twin, AlchemicaSkinColorimeter, runs the same code with standard names. The pack hides the 1.0 nodes from search but keeps them registered so old workflows still open - if you're building fresh, use the twin.
How it measures
You feed it immagine. It finds faces with insightface's buffalo_l pack on the CPU, keeps the largest, and samples the band between the eyes and the mouth - nose and inner cheeks. That choice is the good one: it makes the result independent of framing, so a close-up portrait and a full-body shot of the same person measure the same.
From there it's straight colour maths: sRGB → linear → XYZ → L*a*b*, then it keeps only skin-like pixels (L* between 20 and 92, a* above 2, b* above 4 - which throws away eyebrows, eyes, lips and background) and takes the median L* and b*, not the mean, so one blown highlight can't drag the number. The report prints the per-image line with ITA, L*, b* and the band name.
Inputs and outputs
immagine (IMAGE) is the only input, and it takes a batch - each image is measured separately, and the ita (FLOAT) you get back is the mean of the images where a face was found. Nothing found anywhere means you get −999 and no ambiguity about it. report (STRING) is the per-image breakdown, and since this is an output node the report shows in the node itself and lands in the console.
There's nothing to wire it into. It's a read-out, not a stage: run it, look, adjust, run again.
Installing it
ComfyUI Manager, search "AlchemicaSampler", or:
cd ComfyUI/custom_nodes
git clone https://github.com/Nessuno76/ComfyUI-AlchemicaSampler
# restart the ComfyUI server - a browser reload is not enough
The pack itself has no Python dependencies beyond ComfyUI, but this node needs insightface (plus onnxruntime) to find faces. That library's install reputation was earned - for three years the only path on newer Pythons was compiling from source, which on Windows meant Visual Studio build tools. Version 1.0 (May 2026) removed the C++ build requirement, so a current pip install insightface is much less painful than the forum posts suggest. Model weights are a separate worry: buffalo_l (~326MB) downloads itself into ~/.insightface or a models/insightface folder, and its weights are non-commercial - fine for measuring your own renders, a problem if you're shipping a product around it.
It runs on CPU through onnxruntime, so it never competes with the image model for VRAM.
Where it goes wrong
- Score of −999 and "no face" lines everywhere. Nine times out of ten it's insightface missing or its model folder gone. The node fails gracefully rather than throwing, which is friendly until you assume the measurement happened.
- No face in frame. Profile shots, backs of heads, hands holding a cup - the detector needs a face. Frame a portrait, measure that.
- Measurement is not identity. Two renders of the same character under different light grade differently; golden hour measures warmer than a studio softbox. Measure like for like.
- AI renders don't respect biology. The pack clamps its own use of ITA at ±60° internally for exactly this reason - real skin rarely exceeds it, renders sail past it, and a very pale render can read +70.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| immagine | IMAGE | One or more images; the largest face of each is measured |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| ita | FLOAT | — |
| report | STRING | — |