ComfyUI Node

HALD Identity

Bake your ComfyUI color grade into a LUT the whole industry can read

By jetthuangai·Created 5 months ago·Updated 4 months ago· 5
HALD Identity
    • image
    • level
    level8

    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.

    CategoryComfyUI-JH-PixelPro/color

    Inputs (1)

    NameTypeDefaultDescription
    levelCOMBO8HALD 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)

    NameTypeDescription
    imageIMAGE
    levelINT