From bc234589e6f3bef637faec8d3bf09e29360ac8a2 Mon Sep 17 00:00:00 2001 From: aagami Date: Mon, 25 Aug 2025 14:30:50 +0300 Subject: [PATCH 1/2] Fix ImagePadForOutpaintTargetSize mask scaling bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When image and mask have different input dimensions and no downscaling is needed (scaling_factor >= 1), the mask was not being resized to match the image dimensions before padding, causing mismatched output sizes. Now ensures mask dimensions match image dimensions using F.interpolate with nearest-neighbor interpolation in both scaling branches. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- nodes/image_nodes.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/nodes/image_nodes.py b/nodes/image_nodes.py index 7cb9cae..3660d43 100644 --- a/nodes/image_nodes.py +++ b/nodes/image_nodes.py @@ -1137,7 +1137,13 @@ class ImagePadForOutpaintTargetSize: else: # If downscaling is not needed, use the original image dimensions image_scaled = image - mask_scaled = mask + if mask is not None: + # Ensure mask dimensions match image dimensions + mask_scaled = mask.unsqueeze(0) # Add an extra dimension for batch size + mask_scaled = F.interpolate(mask_scaled, size=(new_height, new_width), mode="nearest") + mask_scaled = mask_scaled.squeeze(0) # Remove the extra dimension after interpolation + else: + mask_scaled = mask # Calculate how much padding is needed to reach the target dimensions pad_top = max(0, (target_height - new_height) // 2) From 20efb15b44f058d98a65200b3e158d0574c9b615 Mon Sep 17 00:00:00 2001 From: aagami Date: Mon, 25 Aug 2025 15:40:12 +0300 Subject: [PATCH 2/2] cleanup --- nodes/image_nodes.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/nodes/image_nodes.py b/nodes/image_nodes.py index 3660d43..e227ac9 100644 --- a/nodes/image_nodes.py +++ b/nodes/image_nodes.py @@ -1128,22 +1128,17 @@ class ImagePadForOutpaintTargetSize: # Downscale the image image_scaled = common_upscale(image, new_width, new_height, upscale_method, "disabled").movedim(1,-1) - if mask is not None: - mask_scaled = mask.unsqueeze(0) # Add an extra dimension for batch size - mask_scaled = F.interpolate(mask_scaled, size=(new_height, new_width), mode="nearest") - mask_scaled = mask_scaled.squeeze(0) # Remove the extra dimension after interpolation - else: - mask_scaled = mask else: # If downscaling is not needed, use the original image dimensions image_scaled = image - if mask is not None: - # Ensure mask dimensions match image dimensions - mask_scaled = mask.unsqueeze(0) # Add an extra dimension for batch size - mask_scaled = F.interpolate(mask_scaled, size=(new_height, new_width), mode="nearest") - mask_scaled = mask_scaled.squeeze(0) # Remove the extra dimension after interpolation - else: - mask_scaled = mask + + # Ensure mask dimensions match image dimensions + if mask is not None: + mask_scaled = mask.unsqueeze(0) # Add an extra dimension for batch size + mask_scaled = F.interpolate(mask_scaled, size=(new_height, new_width), mode="nearest") + mask_scaled = mask_scaled.squeeze(0) # Remove the extra dimension after interpolation + else: + mask_scaled = None # Calculate how much padding is needed to reach the target dimensions pad_top = max(0, (target_height - new_height) // 2) @@ -3800,4 +3795,4 @@ class LoadVideosFromFolder: def IS_CHANGED(s, video, **kwargs): if s.vhs_nodes is not None: return s.vhs_nodes.utils.hash_path(video) - return None \ No newline at end of file + return None