Load Image
The 'Load Image' Node That Loads Nothing (and Inverts Everything)
- image
- IMAGE
If you search the node menu for "Load Image" and grab the one from the Utools pack, congratulations - you just installed a node that will not load a single image for you. It's called "Load Image," it sits right next to ComfyUI's real LoadImage node, and all it actually does is flip your image into a photographic negative. The name is a lie, and knowing that up front saves you ten minutes of clicking.
What it actually is
UTools ships in tianguanggliu's tiny comfyui-utools pack: one node, zero stars on GitHub, no README at all - and it shows. Open the source and you'll find ComfyUI's boilerplate custom-node template, helpfully documented as "A example node," shipped almost verbatim. The author's one real edit is in the test() method:
image = 1.0 - image
return (image,)
That's the whole node. There's no model, no file path, no API call, no key. It's a demo stub wearing a misleading title.
How it works
Images in ComfyUI are float tensors normalized to roughly 0–1 per channel. Subtracting from 1.0 flips every channel's value, which is exactly what a photographic negative is: shadows become highlights and vice versa, in every color channel at once. Same shape in, same shape out. No batch handling beyond the passthrough, nothing stateful - pure arithmetic on the tensor. Invert it twice and you get your original image back, which makes it a neat way to sanity-check that some upstream node is producing well-formed tensors.
When you'd actually reach for it
Honestly? Rarely. If your goal is loading a file, use the built-in LoadImage node - that's the entire job this one doesn't do. The genuine uses are a film-negative or X-ray aesthetic, or a quick tensor sanity check. And if what you actually wanted was an inverted mask - the thing people usually mean when they say "invert this" in a masking workflow - stop right here. A mask is a MASK, not an IMAGE, and the core InvertMask node is what you want. This node inverts colors, not selections.
Inputs and outputs
The schema is as minimal as it gets - the two things that matter:
image(required, IMAGE): any image output from LoadImage, VAE decode, or pretty much anything that produces an image tensor.- Output: IMAGE - the negative, same dimensions, ready to wire into anything that accepts IMAGE.
No widgets, no optional fields, no settings. That's the entire surface area.
Install
This is one of the rare packs that installs in seconds. In ComfyUI Manager, search comfyui-utools (it's registered on the Comfy Registry), or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/tianguanggliu/Utools
Then restart ComfyUI. There's no requirements.txt, no model downloads, no torch/opencv extras - the Python side is pure stdlib. Nothing heavy hides in here.
Gotchas and troubleshooting
The main trap is the name, already covered. Two more worth knowing:
- The display name is internally inconsistent. The package's
__init__.pymaps the node to "Load Image," but the class file's own mapping says "UTools, Efficiency, tools Node." Which one wins depends on load order, so the node can show up under either title. Don't be surprised. - The pack's best features aren't this node. The same repo ships frontend-only extensions - a little toggle button to enable/disable nodes (and whole groups) from the canvas, plus click-to-zoom on image previews - which are genuinely handy efficiency tweaks. But those are browser extensions, not nodes. If you installed for those, keep the pack; if you installed for "Load Image," remove it and use the core node.
Realistic failure mode? One: "why isn't it loading my file?" - it never will, by design. Beyond that there's almost nothing to break: no dependencies to conflict, no model to download wrong, no server routes you need. If your output looks like a color negative, that's not a bug. That's the node.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |