ComfyUI/comfy_extras
Christian Byrne d062fcc5c0
[feat] Add ImageStitch node for concatenating images (#8369)
* [feat] Add ImageStitch node for concatenating images with borders

Add ImageStitch node that concatenates images in four directions with optional borders and intelligent size handling. Features include optional second image input, configurable borders with color selection, automatic batch size matching, and dimension alignment via padding or resizing.

Upstreamed from https://github.com/kijai/ComfyUI-KJNodes with enhancements for better error handling and comprehensive test coverage.

* [fix] Fix CI issues with CUDA dependencies and linting

- Mock CUDA-dependent modules in tests to avoid CI failures on CPU-only runners
- Fix ruff linting issues for code style compliance

* [fix] Improve CI compatibility by mocking nodes module import

Prevent CUDA initialization chain by mocking the nodes module at import time,
which is cleaner than deep mocking of CUDA-specific functions.

* [refactor] Clean up ImageStitch tests

- Remove unnecessary sys.path manipulation (pythonpath set in pytest.ini)
- Remove metadata tests that test framework internals rather than functionality
- Rename complex scenario test to be more descriptive of what it tests

* [refactor] Rename 'border' to 'spacing' for semantic accuracy

- Change border_width/border_color to spacing_width/spacing_color in API
- Update all tests to use spacing terminology
- Update comments and variable names throughout
- More accurately describes the gap/separator between images
2025-06-01 04:28:52 -04:00
..
chainner_models Replace print with logging (#6138) 2024-12-20 16:24:55 -05:00
nodes_ace.py Experimental lyrics strength for ACE. (#7984) 2025-05-07 19:22:07 -04:00
nodes_advanced_samplers.py Lint unused import (#5973) 2024-12-09 15:24:39 -05:00
nodes_align_your_steps.py remove minimum step count for AYS (#6137) 2024-12-21 10:05:09 -05:00
nodes_apg.py fix negative momentum (#8100) 2025-05-13 10:50:32 -07:00
nodes_attention_multiply.py Add some nodes to multiply the attention in UNet and Clip models. 2024-04-28 13:03:43 -04:00
nodes_audio.py add opus and mp3 to audio output node (#8019) 2025-05-12 16:00:01 -04:00
nodes_camera_trajectory.py Fix typo in last PR. (#8144) 2025-05-15 19:02:19 -04:00
nodes_canny.py Remove some unused imports. 2024-05-27 19:08:27 -04:00
nodes_cfg.py Add CFGZeroStar node. 2025-03-26 05:09:52 -04:00
nodes_clip_sdxl.py Enforce all pyflake lint rules (#6033) 2024-12-12 19:29:37 -05:00
nodes_compositing.py Lint unused import (#5973) 2024-12-09 15:24:39 -05:00
nodes_cond.py Add missing category for T5TokenizerOption (#8177) 2025-05-18 02:59:06 -04:00
nodes_controlnet.py Make the inpaint controlnet node work with non inpaint ones. 2024-09-14 09:17:13 -04:00
nodes_cosmos.py CosmosImageToVideoLatent batch_size now does something. 2025-01-15 17:19:59 -05:00
nodes_custom_sampler.py Add node to extend sigmas (#7901) 2025-05-02 05:28:05 -04:00
nodes_differential_diffusion.py Fix differential diffusion node for batches. 2024-03-04 00:43:09 -05:00
nodes_flux.py Add FluxDisableGuidance node to disable using the guidance embed. 2025-01-20 14:50:24 -05:00
nodes_freelunch.py Move PAG to model_patches/unet section. 2024-07-18 17:22:51 -04:00
nodes_fresca.py Increase freq_cutoff in FreSca node. 2025-04-18 03:16:16 -04:00
nodes_gits.py Fix and enforce no trailing whitespace. 2024-12-31 03:16:37 -05:00
nodes_hidream.py CLIPTextEncodeHiDream. (#7703) 2025-04-21 02:41:51 -04:00
nodes_hooks.py Hooks Part 2 - TransformerOptionsHook and AdditionalModelsHook (#6377) 2025-01-11 12:20:23 -05:00
nodes_hunyuan3d.py Make "surface net" the default in the VoxelToMesh node. 2025-04-09 09:42:08 -04:00
nodes_hunyuan.py Hunyuan Custom initial untested implementation. (#8101) 2025-05-13 15:53:47 -04:00
nodes_hypernetwork.py add simple error check to model loading (#4950) 2024-09-17 03:57:17 -04:00
nodes_hypertile.py Lint all unused variables (#5989) 2024-12-12 17:59:16 -05:00
nodes_images.py [feat] Add ImageStitch node for concatenating images (#8369) 2025-06-01 04:28:52 -04:00
nodes_ip2p.py Add InstructPixToPixConditioning node. 2024-04-04 15:06:17 -04:00
nodes_latent.py Refactor and fixes for video latents. 2025-01-22 06:37:46 -05:00
nodes_load_3d.py remove mtl from 3d model file list (#8192) 2025-05-22 08:08:36 -04:00
nodes_lora_extract.py Add tooltips to LoraSave node. 2024-10-18 06:01:09 -04:00
nodes_lotus.py Native LotusD Implementation (#7125) 2025-03-21 14:04:15 -04:00
nodes_lt.py ltxv: overwrite existing mask on conditioned frame. (#7845) 2025-04-28 13:42:04 -04:00
nodes_lumina2.py support system prompt and cfg renorm in Lumina2 (#6795) 2025-02-16 18:15:43 -05:00
nodes_mahiro.py Add MaHiRo (improved/alternate CFG) (#5975) 2024-12-11 16:51:51 -05:00
nodes_mask.py upstream MaskPreview from ComfyUI_essentials (#7719) 2025-04-22 05:00:28 -04:00
nodes_mochi.py Move mochi latent node to: latent/video. 2024-11-08 08:33:44 -05:00
nodes_model_advanced.py Automatically set the right sampling type for lotus. 2025-03-21 14:19:37 -04:00
nodes_model_downscale.py Lint unused import (#5973) 2024-12-09 15:24:39 -05:00
nodes_model_merging_model_specific.py Add model merging node for WAN 2.1 2025-03-23 08:06:36 -04:00
nodes_model_merging.py Make clipsave work with more TE models. (#7908) 2025-05-02 05:15:32 -04:00
nodes_morphology.py Nodes to convert images to YUV and back. 2025-03-21 06:32:44 -04:00
nodes_optimalsteps.py Cleanup chroma PR. 2025-04-30 20:57:30 -04:00
nodes_pag.py Lower SAG scale step for finer control (#4158) 2024-08-02 10:29:03 -04:00
nodes_perpneg.py Fix and enforce no trailing whitespace. 2024-12-31 03:16:37 -05:00
nodes_photomaker.py (fix): added "model_type" to photomaker node (#6047) 2024-12-15 00:18:02 -05:00
nodes_pixart.py Add PixArt model support (#6055) 2024-12-20 15:25:00 -05:00
nodes_post_processing.py Lint instance methods (#7903) 2025-05-01 19:32:04 -04:00
nodes_preview_any.py upstream Preview Any from rgthree-comfy (#7815) 2025-05-02 13:15:54 -04:00
nodes_primitive.py More API Nodes (#7956) 2025-05-06 04:23:00 -04:00
nodes_rebatch.py Remove some trailing white space. 2024-12-27 18:02:30 -05:00
nodes_sag.py proper fix for sag. 2024-11-10 00:10:45 -05:00
nodes_sd3.py ModelPatcher Overhaul and Hook Support (#5583) 2024-12-02 14:51:02 -05:00
nodes_sdupscale.py Remove some unused imports. 2024-05-27 19:08:27 -04:00
nodes_slg.py Add rescaling_scale from STG to SkipLayerGuidanceDiT. 2024-12-04 19:25:50 -05:00
nodes_stable3d.py SV3D support. 2024-03-18 16:54:13 -04:00
nodes_stable_cascade.py Move some nodes out of _for_testing. 2024-09-25 08:41:22 -04:00
nodes_string.py Add node for regex replace(sub) operation (#8340) 2025-05-30 15:08:59 -04:00
nodes_tomesd.py Remove some trailing white space. 2024-12-27 18:02:30 -05:00
nodes_torch_compile.py Make torch.compile LoRA/key-compatible (#8213) 2025-05-21 04:56:56 -04:00
nodes_upscale_model.py Lint unused import (#5973) 2024-12-09 15:24:39 -05:00
nodes_video_model.py Temporal area composition. 2025-03-03 06:50:31 -05:00
nodes_video.py Add support for VIDEO as a built-in type (#7844) 2025-04-29 05:58:00 -04:00
nodes_wan.py Not really tested WAN Phantom Support. (#8321) 2025-05-28 23:46:15 -04:00
nodes_webcam.py Lint instance methods (#7903) 2025-05-01 19:32:04 -04:00