HALD Identity
Bake your ComfyUI color grade into a LUT the whole industry can read
- image
- level
Here's a workflow most people don't realize ComfyUI can do: develop a color grade once, then export it as a 3D LUT file that DaVinci Resolve, Premiere, OBS, and OCIO can all load. JHPixelProHALDIdentity is the first half of that trick. It generates an identity HALD image - a test chart that encodes every possible color as a grid of samples - and you run it through your color-only chain. Whatever color changes your nodes apply to the HALD image get baked, and the pack's JHPixelProLUTExport writes them out as an Adobe Cube 1.0 .cube file.
The mechanism is worth a sentence because it's clever. A HALD (from ImageMagick's convention) is a single image containing N = L² color samples arranged as an L³ × L³ grid. At the standard level = 8, that's N = 64 samples per channel - a 64³ cube - packed into a 512×512 image. Feed the identity through your Tone Curve, Color Matcher, luminosity blends, anything color-only, and the graded HALD now encodes "what this grade does to every input color." Export that and you've got a portable look.
The inputs
level(4 / 6 / 8 / 10 / 12, default"8"): the HALD level L. 8 is the industry-standard sweet spot. Higher = finer LUT resolution but a bigger intermediate image - level 12 is a 1728×1728 image, ~35 MB in float32, and downstream chains can balloon that 2–3×. Keep it at 8 unless you have a specific reason.
Outputs: the image (identity HALD, ready to feed your color chain) and a level INT pass-through - wire that into LUTExport's level input so the cube size always matches. Forgetting to match levels is the classic way to get a ValueError a few nodes later.
The rule that saves you a headache
Color-only chain between the identity and the export. The README says it straight: anything spatial - sharpening, denoise, detail masks, face pipelines, skin smoothing, lens distortion - will not linearize into a 3D LUT. A LUT is a point operation per color; it cannot represent "sharpen this region." Wire only color operators between HALD Identity and LUT Export and you'll get a clean, valid cube. Wire in a spatial node and you'll get a LUT that quietly does the wrong thing on other footage.
That's also the honest boundary of this node's appeal. If you only ever finish inside ComfyUI, you don't need it - just keep the graph. The payoff is when the grade has to travel: iterate a look once, export the cube, apply it per-frame on a monitor box or in Resolve without re-running the graph. That's a genuinely professional move, and this node makes it a two-node chain.
Install
ComfyUI Manager → search ComfyUI-JH-PixelPro, or:
cd ComfyUI/custom_nodes
git clone https://github.com/jetthuangai/ComfyUI-JH-PixelPro.git
cd ComfyUI-JH-PixelPro
pip install -r requirements.txt
Restart ComfyUI; it's under ComfyUI-JH-PixelPro/color. The pack needs ComfyUI ≥ 0.43.x, Python ≥ 3.10, plus kornia, mediapipe, opencv-python-headless, and scipy.
One last detail that will save you a confusing five minutes: the HALD image is not a normal picture - if you preview it you'll see a psychedelic gradient chart, and that's correct. It's a color-science artifact, not a bug. Feed it into your chain, export, and let the .cube file do the talking.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| level | COMBO | 8 | HALD level L. Cube N=L² (L=8→N=64 industry standard). Image side = L³ pixels: L=4→64×64, L=8→512×512, L=12→1728×1728. Higher L = finer LUT but larger intermediate image. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| level | INT | — |