Load Image (from path) /noEmbryo
The Load Image that doesn't care where your file lives
- IMAGE
- MASK
- path
ComfyUI's stock Load Image is fine, except for one infuriating rule: the file has to live in your input folder. Drop a PNG on your Desktop, pull a photo off your camera card, or grab a render another tool just wrote to a temp directory, and the built-in picker won't show it. noEmbryo's Load Image (from path) exists to tear down that fence. Give it an actual filesystem path - any path - and it loads the image, shows a preview right on the node, and hands you the tensor, a mask, and the path string.
This is one node from the small noEmbryo pack by the author who's been shipping ComfyUI utilities since late 2023 (their first release was the PromptTermList prompt-helper, announced on r/comfyui). The Load Image node itself is a beefed-up port of "Load Image From Path (Enhanced)" from Chaoses-Ib's well-known ComfyUI_Ib_CustomNodes, and it fixes the sharpest edges of that original.
How it works
Mechanically it's simple under the hood: the node takes your path string, resolves it (absolute paths work as-is; relative paths without an annotation resolve against the input folder), loads it with PIL, applies an EXIF transpose so phone photos come in right-side-up, and converts to the standard RGB float tensor ComfyUI expects.
Two details make it nicer than a blind Image.open. First, IS_CHANGED hashes the file contents, not the path. So when you overwrite the PNG on disk and queue another run, the node re-executes instead of ComfyUI serving you a cached copy - the fix for the classic "I edited my image and nothing happened" complaint. Second, it still accepts the old annotated forms like myfile.png [output], so legacy workflows keep running untouched.
Inputs and outputs
One input, one job: image (STRING) is the path. Type it, or hit the Browse... button on the node to open an actual file browser - it can walk your whole drive, sort by name or date, show a thumbnail preview with arrows to flip through the folder, and paste the chosen path back for you. The image renders in the node, which is more than the stock loader does.
Three outputs:
- IMAGE - the loaded image as a 0–1 float tensor, ready to feed a sampler, a VAE encode, a ControlNet, whatever.
- MASK - generated from the image's alpha channel (transparent pixels become white/masked, the standard ComfyUI convention), so a cutout or logo PNG arrives with its mask already attached. No alpha channel? You get an empty mask. That's the path into mask-based inpainting workflows, which still own the jobs that need bit-identical unmasked pixels or exact placement.
- path - the original string you passed in. Sounds trivial, but wiring it forward means another node can save to the same place the image came from, and you stop hardcoding directories.
Installation
Install it the normal way: ComfyUI Manager, search noEmbryo, install, restart. Or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/noembryo/ComfyUI-noEmbryo.git
# restart ComfyUI
No requirements.txt, no model downloads, no heavy deps - it only uses PIL/numpy/torch, all of which ComfyUI already ships. This is one of the lightest installs you'll do.
Gotchas
A relative path with no annotation goes to the input folder, so a bare filename behaves like the stock node - type the full path (or use Browse) and it loads from anywhere. On Windows the node handles backslash paths fine.
Worth knowing before you wire it into something sensitive: the file picker runs through a small local HTTP API the pack registers, and it can browse and serve any file the ComfyUI process can read. That's the same trust model as every custom node - arbitrary Python with full OS access - so it's perfectly fine on a local single-user box, just not a reason to install sketchy packs. It also patches a clipspace filename mismatch so ComfyUI's built-in mask editor (double-click the image) works with files loaded this way, which the original Ib node fumbled. That alone is worth the install.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | STRING | Paste an absolute path, (or a relative one with a prefix input/) to an image file, or a URL of an image. Or use "Browse" to pick a file. | |
| crop | STRING | Managed by the crop editor on the node — no need to edit by hand. | |
| max_megapixels | FLOAT | 0.000–100 | Cap the output (crop, or full image if uncropped) to this many megapixels, downscaling only if it's bigger. Smaller images are left untouched. 1.0 = 1024x1024 px. 0 disables the cap. |
| widthopt | INT | 0–100000 | Force the output width in px (upscale or downscale), center-cropping first if the aspect ratio differs. Leave disconnected (None) to keep natural width. Only applies if BOTH width and height are connected, and when set (not 0), and it overrides max_megapixels. |
| heightopt | INT | 0–100000 | Force the output height in px (upscale or downscale), center-cropping first if the aspect ratio differs. Leave disconnected (None) to keep natural height. Only takes effect if BOTH width and height are connected, when set (not 0), and it overrides max_megapixels. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| MASK | MASK | — |
| path | STRING | — |