Nodes/Pond Nodes/🐳图文拼接V2
ComfyUI Node

🐳图文拼接V2

The contact sheet node where every image gets its own caption

By Pondowner857·Created about a year ago·Updated 2 months ago· 45
🐳图文拼接V2
  • image_1
  • image_2
  • image_3
  • image_4
  • image_5
  • image_6
  • image_7
  • image_8
  • image_9
  • image_10
  • image
◄num_pairs2►
◄layouthorizontal►
◄uniform_sizetrue►
◄uniform_modemax►
◄text_positionbottom►
◄text_margin10►
◄text_padding30►
◄font_namedefault►
◄font_size20►
◄font_color#000000►
◄bg_color#FFFFFF►
◄gap10►
◄text_area_border0►
◄border_color#000000►
◄text_1—►
◄text_2—►
◄text_3—►
◄text_4—►
◄text_5—►
◄text_6—►
◄text_7—►
◄text_8—►
◄text_9—►
◄text_10—►

The original 图文拼接 gives you one caption for the whole sheet. This one, 🐳图文拼接V2 (Image Text Pair Composite), is the version where every image carries its own label - which is the thing you actually want for half the use cases. Prompt A vs prompt B. Three models, same seed, each thumbnail named. A dataset preview where each row says what it is. That's exactly what this node was built for.

Mechanically it's the same family as its older sibling: pick a layout, unify sizes, render text. The difference is that instead of images plus a shared caption, you wire pairs - image_1 with text_1, image_2 with text_2, and so on up to ten pairs.

How it works

Set num_pairs to how many image+text pairs you're using, wire the image_N and text_N slots, and the node builds each pair's image, stamps its text on a padding band, then arranges all the pairs in your chosen layout:

  • layout - horizontal, vertical, or grid.
  • uniform_size + uniform_mode - unify image heights first (max, min, first, or average), preserving aspect ratio.
  • text_position - where each pair's caption sits: top, bottom, left, right, or center.
  • gap - the spacing between pairs, which is the new knob this node adds over the original. On a grid of labeled tiles, that's the difference between "sheet" and "mess."
  • text_margin, text_padding, font_name, font_size, font_color, bg_color, text_area_border, border_color - the same styling set as the V1 node.

Output is a single image - the fully-labeled composite, ready for Save Image or a preview.

The inputs that matter

  • num_pairs - set it before wiring; it controls which image_N/text_N slots are read.
  • gap - the spacing between pairs; tune it first when a grid looks cramped.
  • font_size - 8 to 200, default 20. Labels at 20px look fine on a two-up comparison and tiny on a 10-pair grid.
  • font_name - the dropdown reads from the pack's typy font folder (custom_nodes/comfy_Pond_Nodes/nodes/typy). Drop a .ttf there and restart to add fonts. For Chinese/Japanese captions, pick the bundled AlibabaPuHuiTi or you'll get tofu boxes.

A practical gotcha: an empty text_N isn't an error - the pair still composites, just with a blank caption band. So if you've wired nine pairs and the tenth keeps showing up uncaptioned, you forgot its text slot, not the images.

Install

Same pack, same drill:

ComfyUI Manager → search "Pond Nodes" (comfy_Pond_Nodes)

or:

cd ComfyUI/custom_nodes
git clone https://github.com/Pondowner857/comfy_Pond_Nodes
cd comfy_Pond_Nodes
pip install -r requirements.txt

Restart after installing. This node only needs Pillow and numpy, so don't feel obliged to satisfy the whole requirements.txt. And the pack's standing warning applies: a documented console-spam conflict with comfyui_HiDream-Sampler is the first thing to suspect if your terminal goes noisy.

Category🐳Pond/Image

Inputs (34)

NameTypeDefaultDescription
num_pairsINT21–10—
layoutCOMBOhorizontal3 options: horizontal, vertical, grid
uniform_sizeBOOLEANtrue—
uniform_modeCOMBOmax4 options: max, min, first, average
text_positionCOMBObottom5 options: top, bottom, left, right, center
text_marginINT100–100—
text_paddingINT3010–200—
font_nameCOMBOdefault2 options: default, AlibabaPuHuiTi-2-65-Medium.ttf
font_sizeINT208–200—
font_colorSTRING#000000—
bg_colorSTRING#FFFFFF—
gapINT100–100—
text_area_borderINT00–50—
border_colorSTRING#000000—
image_1optIMAGE—
text_1optSTRING—
image_2optIMAGE—
text_2optSTRING—
image_3optIMAGE—
text_3optSTRING—
image_4optIMAGE—
text_4optSTRING—
image_5optIMAGE—
text_5optSTRING—
image_6optIMAGE—
text_6optSTRING—
image_7optIMAGE—
text_7optSTRING—
image_8optIMAGE—
text_8optSTRING—
image_9optIMAGE—
text_9optSTRING—
image_10optIMAGE—
text_10optSTRING—

Outputs (1)

NameTypeDescription
imageIMAGE—