Advanced OCIO Color Transform
Every knob of an OCIO conversion, exposed on the graph
- image
- image
- transform_info
If the plain OCIOColorSpaceConverter is the point-and-shoot OCIO node, this is the manual mode. AdvancedOcioColorTransform gives you control over the full pipeline - source space, destination space, transfer function handling, gamut mapping, and a parametric gamut-compression step for pushing out-of-gamut colors back under 1.0. It's the node you reach for when the simple converter gives you a result that's technically correct but clipped or shifted in a way you want to fix by hand.
How it works
It runs a staged pipeline. First the OCIO transform between source_space and dest_space using PyOpenColorIO. Then optional post-steps: fix_transfer normalizes the transfer function, fix_gamut remaps the primaries, and gamut_compress applies a soft-knee compression to channels that exceed a threshold - implemented as a pure-numpy curve because, as the source notes, GamutCompressTransform doesn't exist in released PyOpenColorIO builds. That's a nice piece of honesty in the code: it does the thing people expect, just not via the API you'd assume. alpha_mode controls whether the alpha channel is passed through or premultiplied, and clip_after decides whether the result gets clamped to [0,1] at the end.
The color space list - sRGB, Rec.709, Rec.2020, Display P3, Adobe RGB, XYZ, Log2, raw, plus their linear variants - isn't hardcoded. It's generated at startup from the pack's bundled ocio/config.ocio file, so the dropdowns track the config you're actually using.
The inputs that matter
- source_space / dest_space - pick from the 12 generated spaces. The defaults are sRGB on both ends, so nothing happens until you change one. That's a feature: it makes a great identity-check node.
- fix_transfer / fix_gamut - leave these on (both default true) unless you're deliberately testing what a bare matrix conversion looks like.
- gamut_compress + gc_threshold / gc_power / gc_scale - the soft-knee compression. Defaults (threshold 0.85, power 1.15, scale 0.9) are a decent starting point; the curve compresses values above the threshold asymptotically toward 1.0. Turn it on when you're going wide-gamut → narrow and don't want brutal clipping.
- ocio_config_path (optional) - leave as
defaultto use the bundled config, or point it at your own.ocio(e.g. an ACES config).
Outputs: image and transform_info, a JSON string describing what the pipeline actually did - very useful for comparing two settings side by side.
Install
Same pack, same install - ComfyUI Manager search "ComfyUI Color Profile Reader," or:
cd ComfyUI/custom_nodes
git clone https://github.com/APZmedia/ComfyUI-color-tools
The critical extra for OCIO nodes: PyOpenColorIO must be installed (pip install opencolorio). The pack's install.py tries to install it automatically at startup, but OCIO is the one dependency that can fail quietly - if it's missing, the OCIO nodes just don't register (console warning, nothing in the UI). So if you can't find these nodes after install, check the startup log for "OCIO nodes unavailable."
Honest context: OCIO in the ComfyUI world is a niche. The community barely discusses it - a couple of mentions a year on the subreddits - because most people never do color-managed pipelines. If you're here, you likely came from VFX or video where ACES/OCIO is table stakes, and this node gives you that control without leaving the graph. Worth noting the pack ships a small bundled config that covers the common spaces; for real ACES work you'll want an Academy config, which the pack's README points you to.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| source_space | COMBO | sRGB | 12 options: Adobe RGB, Display P3, Linear, Linear P3-D65, Linear Rec.2020, Linear Rec.709, +6 |
| dest_space | COMBO | sRGB | 12 options: Adobe RGB, Display P3, Linear, Linear P3-D65, Linear Rec.2020, Linear Rec.709, +6 |
| fix_transfer | BOOLEAN | true | — |
| fix_gamut | BOOLEAN | true | — |
| gamut_compress | BOOLEAN | false | — |
| gc_threshold | FLOAT | 0.850–1 | — |
| gc_power | FLOAT | 1.150.01–5 | — |
| gc_scale | FLOAT | 0.900.01–2 | — |
| alpha_mode | COMBO | passthrough | 2 options: passthrough, premultiply |
| clip_after | BOOLEAN | true | — |
| ocio_config_pathopt | STRING | default | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| transform_info | STRING | — |