From 7bbf8ce31d43feac7eb460fde0ef6055d894fdd2 Mon Sep 17 00:00:00 2001 From: TenserTensor Date: Mon, 23 Feb 2026 09:44:15 +0300 Subject: [PATCH] Added: TT_ImagePreviewUpscaleSave node --- node_mappings.py | 3 + nodes/image/image_preview_save.py | 8 +-- nodes/image/image_preview_upscale_save.py | 70 +++++++++++++++++++++++ 3 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 nodes/image/image_preview_upscale_save.py diff --git a/node_mappings.py b/node_mappings.py index 758baf2..894236f 100644 --- a/node_mappings.py +++ b/node_mappings.py @@ -26,6 +26,7 @@ except ImportError: try: from .nodes.image.image_preview_save import TT_ImagePreviewSave + from .nodes.image.image_preview_upscale_save import TT_ImagePreviewUpscaleSave except ImportError: print(f"{YELLOW}TenserTensor: {RED}ERROR: Image nodes unavailable{RESET}") @@ -105,6 +106,7 @@ NODE_CLASS_MAPPINGS = { "TT_ContextPassthrough": TT_ContextPassthrough, # Image "TT_ImagePreviewSave": TT_ImagePreviewSave, + "TT_ImagePreviewUpscaleSave": TT_ImagePreviewUpscaleSave, # Latent "TT_LatentFactory": TT_LatentFactory, # Loaders @@ -162,6 +164,7 @@ NODE_DISPLAY_NAME_MAPPINGS = { "TT_ContextPassthrough": "TT Context Passthrough", # Image "TT_ImagePreviewSave": "TT Image Preview / Save", + "TT_ImagePreviewUpscaleSave": "TT Image Preview / Upscale /Save", # Latent "TT_LatentFactory": "TT Latent Factory", # Loaders diff --git a/nodes/image/image_preview_save.py b/nodes/image/image_preview_save.py index efc2f8a..87102e8 100644 --- a/nodes/image/image_preview_save.py +++ b/nodes/image/image_preview_save.py @@ -14,11 +14,11 @@ class TT_ImagePreviewSave(): "image": ("IMAGE",), "save_image": ("BOOLEAN", {"default": True, "label_on": "Enabled", "label_off": "Disabled"}), "filename_prefix": ("STRING", {"default": "tenser-tensor"}), - "filename_format": (FILENAME_FORMATS, {"advanced": True, "default": "name-###"}), + "filename_format": (FILENAME_FORMATS, {"default": "name-###", "advanced": True}), "subfolder": ("STRING", {"default": "", "advanced": True}), - "image_format": (IMAGE_FORMATS, {"advanced": True, "default": "PNG"}), - "image_quality": ("INT", {"default": 100, "min": 0, "max": 100}), - "compression_level": ("INT", {"default": 9, "min": 0, "max": 9}), + "image_format": (IMAGE_FORMATS, {"default": "PNG", "advanced": True}), + "image_quality": ("INT", {"default": 100, "min": 0, "max": 100, "advanced": True}), + "compression_level": ("INT", {"default": 9, "min": 0, "max": 9, "advanced": True}), } } diff --git a/nodes/image/image_preview_upscale_save.py b/nodes/image/image_preview_upscale_save.py new file mode 100644 index 0000000..d743816 --- /dev/null +++ b/nodes/image/image_preview_upscale_save.py @@ -0,0 +1,70 @@ +# (c) TenserTensor || Apache-2.0 (apache.org/licenses/LICENSE-2.0) +import folder_paths as FP + +from .image_helpers import store, preview +from ..postproduction.postproduction_helpers import upscale_image as upscale + + +class TT_ImagePreviewUpscaleSave(): + @classmethod + def INPUT_TYPES(cls): + FILENAME_FORMATS = ["name-###", "date-name-###", "name-datetime"] + IMAGE_FORMATS = ["PNG", "JPEG", "WEBP"] + DEVICES = ["default", "cpu"] + UPSCALE_MODELS = FP.get_filename_list("upscale_models") + + return { + "required": { + "image": ("IMAGE",), + "save_image": ("BOOLEAN", {"default": True, "label_on": "Enabled", "label_off": "Disabled"}), + "filename_prefix": ("STRING", {"default": "tenser-tensor"}), + "filename_format": (FILENAME_FORMATS, {"advanced": True, "default": "name-###"}), + "subfolder": ("STRING", {"default": "", "advanced": True}), + "image_format": (IMAGE_FORMATS, {"advanced": True, "default": "PNG"}), + "image_quality": ("INT", {"default": 100, "min": 0, "max": 100, "advanced": True}), + "compression_level": ("INT", {"default": 9, "min": 0, "max": 9, "advanced": True}), + "upscale_image": ("BOOLEAN", {"default": True, "label_on": "Enabled", "label_off": "Disabled"}), + "upscaler_device": (DEVICES, {"advanced": True}), + "upscale_model_name": (UPSCALE_MODELS, {"advanced": True}), + "tile": ("INT", {"default": 512, "min": 256, "max": 4096, "step": 64, "advanced": True}), + "overlap": ("INT", {"default": 64, "min": 0, "max": 256, "step": 8, "advanced": True}), + } + } + + RETURN_TYPES = ("IMAGE",) + RETURN_NAMES = ("IMAGE",) + FUNCTION = "preview_upscale_save_image" + CATEGORY = "TenserTensor/Image" + + def preview_upscale_save_image(self, **kwargs): + image = kwargs.get("image") + timage = image.clone() + + upscale_image = kwargs.get("upscale_image") + if upscale_image: + timage = upscale( + timage=timage, + device=kwargs.get("upscaler_device"), + upscale_model_name=kwargs.get("upscale_model_name"), + tile=kwargs.get("tile"), + overlap=kwargs.get("overlap") + ) + + save_image = kwargs.get("save_image") + if save_image: + timage = store( + image=timage, + filename_prefix=kwargs.get("upscale_model_name"), + subfolder=kwargs.get("subfolder"), + filename_format=kwargs.get("filename_format"), + image_format=kwargs.get("image_format"), + image_quality=kwargs.get("image_quality"), + compress_level=kwargs.get("compression_level"), + ) + else: + timage = preview( + image=timage, + filename_prefix=kwargs.get("upscale_model_name"), + ) + + return {"ui": {"images": timage}}