Nodes/ComfyUI-Easy-Media/Multi Images Loader
ComfyUI Node

Multi Images Loader

25 reference images, one ordered list, no spaghetti

By yolain·Created 5 months ago·Updated 5 days ago· 224
Multi Images Loader
  • image_data
  • IMAGES
◄resolution▾►
◄max_limit-1►

What it's for

Stock ComfyUI gives you one file per Load Image node. The moment a workflow wants a set - a character sheet, a few reference stills for a reference-to-video model, a batch of frames for a timeline - you either duplicate Load Image a dozen times or write a small node. This is that node, already written.

It's the image picker from the pack's MultiTrack Editor, broken out standalone: assemble a grid of up to 25 images, get them back as an ordered IMAGE list, each resized to a resolution you pick. That matters more than it used to, because character consistency got rerouted rather than solved - from "train an adapter on the character" to "hand the model reference images and edit from there" (character-consistency.md) - and the video side now works the same way.

How it actually works

image_data looks like a wire, but it's a widget - a JSON blob shaped { "images": [ … ] }. Each item carries a source type: input (a file in ComfyUI's input folder), output (subfolder/filename in the output folder), local (an absolute path on the machine running ComfyUI), or url (fetched over HTTP when the node runs).

On execution the backend parses that JSON, walks the list, and loads each image through PIL, converting to an RGB float32 [1,H,W,C] tensor. Then it resizes each one and returns the list. URL entries go through a 15-second fetch, so a slow host is a failure, not a wait.

The inputs you'll touch

resolution is a dynamic combo, and the widgets under it change with your choice. Fixed entries like 1344 x 768 (16:9) are exactly that size. width x height (auto) keeps each source image's own dimensions - effectively a do-nothing resize. (shortest) and (longest) push the short or long edge to resize_to_pixel (default 960) and derive the other edge from the source aspect. (custom) reveals width/height; (megapixels) reveals an aspect ratio plus a megapixel target.

resize_method is the one that bites. It defaults to stretch, which squashes every image into the target box and quietly wrecks the aspect ratio of your references. The options are stretch, resize, pad, pad (white), pad_edge, pad_edge_pixel, crop, pillarbox_blur - for faces and characters, reach for pad, pillarbox_blur or crop.

max_limit defaults to -1, meaning "output all loaded images." Set it positive and it truncates from the front - it doesn't sample or shuffle. Grid order is content order. Add images with the media selector popover or by dragging files onto the grid, which uploads them into ComfyUI's input folder first.

The output

One output: IMAGES. It's an IMAGE list, not a single stacked batch, and that distinction matters. A list output fans out - a normal downstream node that doesn't declare list inputs gets run once per image and its results are concatenated, while nodes that do declare list inputs receive the whole list in one call. In this pack that's the MultiTrack Editor's image slots and the LTX encode nodes; easy splitImages breaks a list back into individual outputs, and easy makeImageList builds one from up to ten images. See comfyui-node-plumbing.md for the rest of that layer.

Installing it

ComfyUI Manager, search ComfyUI-Easy-Media, install, restart. Or by hand:

cd ComfyUI/custom_nodes
git clone https://github.com/yolain/ComfyUI-Easy-Media

No pip step: the pack's pyproject.toml declares zero dependencies, and this node needs no model files and no FFmpeg - it's a file reader plus a resize. It does want a reasonably current ComfyUI, since the whole pack is written against the newer comfy_api.latest authoring API. Elsewhere in the pack, FFmpeg is mandatory (the README's IMPORTANT box) and the H3/Whisper/VoxCPM nodes want their own model files.

Also: the node is new. It landed in 1.3.3, still marked PreRelease when this was written.

Where people get burned

One bad entry kills the whole run. A missing file, a typo'd path or a URL that 404s makes the loader return nothing for that item, and the node raises Unable to load IMAGE_DATA image 3 rather than skipping it. There's no partial output, so test before you queue a two-hour video job.

local means local to the ComfyUI process. Absolute paths on your laptop mean nothing to a Docker container or a rented GPU box - use the inputs/outputs tabs, or drag the files in, which uploads them to the input folder and rewrites the entry as an input reference.

Sharing the workflow doesn't share the images. An input reference is just a filename and a local one is a path the recipient never had; both blow up on their machine. Drop the files in (upload path) and tell people to put them in input if you plan to publish the graph.

The hard limits: 25 images, enforced both in the widget and in the backend, and max_limit, which cuts from the front of the list rather than choosing intelligently.

CategoryEasyUse/Media

Inputs (3)

NameTypeDefaultDescription
resolutionCOMBO25 options: [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], +19
max_limitINT-1-1–25Maximum number of images to output. -1 means no limit (output all loaded images).
image_dataIMAGE_DATA—

Outputs (1)

NameTypeDescription
IMAGESIMAGE—