Load Image ICC
The LoadImage that doesn't throw away your color profile
- IMAGE
- MASK
- ICC_PROFILE
ComfyUI's stock LoadImage is quietly throwing away a piece of your image every time you use it: the embedded ICC color profile. Most of the time nobody notices, because sRGB is the default everywhere and a missing tag doesn't change how your screen renders things. But load a PNG tagged Adobe RGB or Display P3, run it through img2img, and hand the result to a print shop - the tag is gone, and the colors in your saved file are now a guess. Load Image ICC is the fix, and it's basically the LoadImage you already know with one extra wire.
What it actually is
This node is a near-verbatim fork of ComfyUI's built-in LoadImage. Same behavior: pick a file from your input folder (or upload one), get a batched IMAGE tensor and a MASK if there's an alpha channel. EXIF orientation gets corrected, multi-frame images get stacked. The one difference is the third output, ICC_PROFILE. When Pillow opens a PNG with an iCCP chunk or a JPEG with an ICC APP2 marker, the raw profile bytes sit in the file's metadata; the core node reads them and then forgets them. This node hands them to you instead.
That's the whole trick. It's not doing color science - no conversion, no gamut mapping, no remapping of pixels. It's a pass-through that catches the metadata before it falls in the gap.
The parts that matter
One input, image - a dropdown of everything in your input folder with an upload button, same as core. Three outputs:
IMAGE- the usual batched tensor, pixels loaded as straight RGB.MASK- alpha as a mask (inverted, same convention as core LoadImage).ICC_PROFILE- the raw profile bytes, orNoneif the file has no profile.
There's no color-management applied when loading; the numbers in IMAGE are the raw channel values. That's worth internalizing before you build on this.
Wire it up
ICC_PROFILE is a custom type that only this pack emits and only its Save nodes accept, so the flow is short and fixed: Load Image ICC → (whatever you're doing) → Save Image ICC, with the profile output threaded into the save node's icc_profile input. The pack's example workflow does exactly that, and it also runs the same image through the stock PreviewImage/SaveImage side by side so you can see the difference the tag makes. If the file has no profile, ICC_PROFILE comes back None and Save Image ICC just writes a normal PNG - the pack degrades gracefully instead of erroring, which is the right call.
Install
No dependencies, no model downloads, nothing to configure - the whole pack is one nodes.py and it only uses Pillow, numpy and torch, which ComfyUI already ships.
cd ComfyUI/custom_nodes
git clone https://github.com/rubi-du/ComfyUI-ICC-nodes
Then restart ComfyUI. Or use ComfyUI Manager: search "ComfyUI-ICC-nodes" and hit install.
Where people get burned
The temptation is to load a wide-gamut photo, do a heavy edit, and save it with the old profile reattached. Don't - you're tagging pixels that no longer represent that color space. The honest use is round-tripping: low-denoise img2img, upscaling, or touching up a reference where the pixels stay close to the source. For real cross-space conversion you'd need an actual color-management pipeline, which this pack deliberately isn't. Keep the tag with the pixels it belongs to.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| image | COMBO | 1 options: example.png |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| MASK | MASK | — |
| ICC_PROFILE | ICC_PROFILE | — |