From fd1ecf39dc983ca3662f69eca007a66958b3d6b6 Mon Sep 17 00:00:00 2001 From: Level Pixel Dev Date: Sat, 7 Jun 2025 19:09:38 +0600 Subject: [PATCH] Fixed Resize Image And Masks --- nodes/image/image_utils_LP.py | 26 ++++++++++++------------ web/js/showcontrol.js | 37 +++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/nodes/image/image_utils_LP.py b/nodes/image/image_utils_LP.py index 4752545..329c6b9 100644 --- a/nodes/image/image_utils_LP.py +++ b/nodes/image/image_utils_LP.py @@ -76,7 +76,7 @@ def rescale_m(samples, width, height, algorithm: str): return samples -def preresize_imm(image, mask, optional_context_mask, downscale_algorithm, upscale_algorithm, preresize_mode, preresize_min_width, preresize_min_height, preresize_max_width, preresize_max_height): +def preresize_imm(downscale_algorithm, upscale_algorithm, preresize_mode, preresize_min_width, preresize_min_height, preresize_max_width, preresize_max_height, image=None, mask=None, optional_context_mask=None): current_width, current_height = image.shape[2], image.shape[1] # Image size [batch, height, width, channels] if preresize_mode == "ensure minimum resolution": @@ -91,9 +91,9 @@ def preresize_imm(image, mask, optional_context_mask, downscale_algorithm, upsca target_width = int(current_width * scale_factor) target_height = int(current_height * scale_factor) - image = rescale_i(image, target_width, target_height, upscale_algorithm) - mask = rescale_m(mask, target_width, target_height, 'bilinear') - optional_context_mask = rescale_m(optional_context_mask, target_width, target_height, 'bilinear') + if image is not None: image = rescale_i(image, target_width, target_height, upscale_algorithm) + if mask is not None: mask = rescale_m(mask, target_width, target_height, 'bilinear') + if optional_context_mask is not None: optional_context_mask = rescale_m(optional_context_mask, target_width, target_height, 'bilinear') assert target_width >= preresize_min_width and target_height >= preresize_min_height, \ f"Internal error: After resizing, target size {target_width}x{target_height} is smaller than min size {preresize_min_width}x{preresize_min_height}" @@ -123,9 +123,9 @@ def preresize_imm(image, mask, optional_context_mask, downscale_algorithm, upsca target_width = int(current_width * scale_factor) target_height = int(current_height * scale_factor) - image = rescale_i(image, target_width, target_height, rescale_algorithm) - mask = rescale_m(mask, target_width, target_height, 'nearest') # Always nearest for efficiency - optional_context_mask = rescale_m(optional_context_mask, target_width, target_height, 'nearest') # Always nearest for efficiency + if image is not None: image = rescale_i(image, target_width, target_height, rescale_algorithm) + if mask is not None: mask = rescale_m(mask, target_width, target_height, 'nearest') # Always nearest for efficiency + if optional_context_mask is not None: optional_context_mask = rescale_m(optional_context_mask, target_width, target_height, 'nearest') # Always nearest for efficiency assert preresize_min_width <= target_width <= preresize_max_width, \ f"Internal error: Target width {target_width} is outside the range {preresize_min_width} - {preresize_max_width}" @@ -143,9 +143,9 @@ def preresize_imm(image, mask, optional_context_mask, downscale_algorithm, upsca target_width = int(current_width * scale_factor_max) target_height = int(current_height * scale_factor_max) - image = rescale_i(image, target_width, target_height, downscale_algorithm) - mask = rescale_m(mask, target_width, target_height, 'nearest') # Always nearest for efficiency - optional_context_mask = rescale_m(optional_context_mask, target_width, target_height, 'nearest') # Always nearest for efficiency + if image is not None: image = rescale_i(image, target_width, target_height, downscale_algorithm) + if mask is not None: mask = rescale_m(mask, target_width, target_height, 'nearest') # Always nearest for efficiency + if optional_context_mask is not None: optional_context_mask = rescale_m(optional_context_mask, target_width, target_height, 'nearest') # Always nearest for efficiency assert target_width <= preresize_max_width and target_height <= preresize_max_height, \ f"Internal error: Target size {target_width}x{target_height} is greater than max size {preresize_max_width}x{preresize_max_height}" @@ -485,7 +485,6 @@ class ResizeImageAndMasks: def INPUT_TYPES(cls): return { "required": { - "image": ("IMAGE",), "downscale_algorithm": (["nearest", "bilinear", "bicubic", "lanczos", "box", "hamming"], {"default": "lanczos"}), "upscale_algorithm": (["nearest", "bilinear", "bicubic", "lanczos", "box", "hamming"], {"default": "lanczos"}), "preresize_mode": (["ensure minimum resolution", "ensure maximum resolution", "ensure minimum and maximum resolution"], {"default": "ensure minimum resolution"}), @@ -495,6 +494,7 @@ class ResizeImageAndMasks: "preresize_max_height": ("INT", {"default": nodes.MAX_RESOLUTION, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 1}), }, "optional": { + "image": ("IMAGE",), "mask": ("MASK",), "optional_context_mask": ("MASK",), } @@ -507,8 +507,8 @@ class ResizeImageAndMasks: RETURN_TYPES = ("IMAGE", "MASK", "MASK") RETURN_NAMES = ("image", "mask", "optional_context_mask") - def resize_image_and_masks(self, image, downscale_algorithm, upscale_algorithm, preresize_mode, preresize_min_width, preresize_min_height, preresize_max_width, preresize_max_height, mask=None, optional_context_mask=None): - image, mask, optional_context_mask = preresize_imm(image, mask, optional_context_mask, downscale_algorithm, upscale_algorithm, preresize_mode, preresize_min_width, preresize_min_height, preresize_max_width, preresize_max_height) + def resize_image_and_masks(self, downscale_algorithm, upscale_algorithm, preresize_mode, preresize_min_width, preresize_min_height, preresize_max_width, preresize_max_height, image=None, mask=None, optional_context_mask=None): + image, mask, optional_context_mask = preresize_imm(downscale_algorithm, upscale_algorithm, preresize_mode, preresize_min_width, preresize_min_height, preresize_max_width, preresize_max_height, image, mask, optional_context_mask,) return (image, mask, optional_context_mask) diff --git a/web/js/showcontrol.js b/web/js/showcontrol.js index 5aea54c..9c79ba5 100644 --- a/web/js/showcontrol.js +++ b/web/js/showcontrol.js @@ -36,11 +36,38 @@ function inpaintCropStitchHandler(node) { return; } +function resizeImageAndMasksHandler(node) { + if (node.comfyClass == "ResizeImageAndMasks|LP") { + toggleWidget(node, findWidgetByName(node, "preresize_min_width")); + toggleWidget(node, findWidgetByName(node, "preresize_min_height")); + toggleWidget(node, findWidgetByName(node, "preresize_max_width")); + toggleWidget(node, findWidgetByName(node, "preresize_max_height")); + if (findWidgetByName(node, "preresize_mode").value == "ensure minimum resolution") { + toggleWidget(node, findWidgetByName(node, "preresize_min_width"), true); + toggleWidget(node, findWidgetByName(node, "preresize_min_height"), true); + toggleWidget(node, findWidgetByName(node, "preresize_max_width"), false); + toggleWidget(node, findWidgetByName(node, "preresize_max_height"), false); + } + else if (findWidgetByName(node, "preresize_mode").value == "ensure minimum and maximum resolution") { + toggleWidget(node, findWidgetByName(node, "preresize_min_width"), true); + toggleWidget(node, findWidgetByName(node, "preresize_min_height"), true); + toggleWidget(node, findWidgetByName(node, "preresize_max_width"), true); + toggleWidget(node, findWidgetByName(node, "preresize_max_height"), true); + } + else if (findWidgetByName(node, "preresize_mode").value == "ensure maximum resolution") { + toggleWidget(node, findWidgetByName(node, "preresize_min_width"), false); + toggleWidget(node, findWidgetByName(node, "preresize_min_height"), false); + toggleWidget(node, findWidgetByName(node, "preresize_max_width"), true); + toggleWidget(node, findWidgetByName(node, "preresize_max_height"), true); + } + } + return; +} + const findWidgetByName = (node, name) => { return node.widgets ? node.widgets.find((w) => w.name === name) : null; }; -// Toggle Widget + change size function toggleWidget(node, widget, show = false, suffix = "") { if (!widget) return; widget.disabled = !show @@ -50,15 +77,14 @@ function toggleWidget(node, widget, show = false, suffix = "") { app.registerExtension({ name: "levelpixel.showcontrol", nodeCreated(node) { - if (!node.comfyClass.startsWith("Inpaint")) { + if (!node.comfyClass.startsWith("Inpaint") && !node.comfyClass.startsWith("ResizeImageAndMasks")) { return; } inpaintCropStitchHandler(node); + resizeImageAndMasksHandler(node); for (const w of node.widgets || []) { let widgetValue = w.value; - - // Store the original descriptor if it exists let originalDescriptor = Object.getOwnPropertyDescriptor(w, 'value') || Object.getOwnPropertyDescriptor(Object.getPrototypeOf(w), 'value'); if (!originalDescriptor) { @@ -67,7 +93,6 @@ app.registerExtension({ Object.defineProperty(w, 'value', { get() { - // If there's an original getter, use it. Otherwise, return widgetValue. let valueToReturn = originalDescriptor && originalDescriptor.get ? originalDescriptor.get.call(w) : widgetValue; @@ -75,7 +100,6 @@ app.registerExtension({ return valueToReturn; }, set(newVal) { - // If there's an original setter, use it. Otherwise, set widgetValue. if (originalDescriptor && originalDescriptor.set) { originalDescriptor.set.call(w, newVal); } else { @@ -83,6 +107,7 @@ app.registerExtension({ } inpaintCropStitchHandler(node); + resizeImageAndMasksHandler(node); } }); }