#---------------------------------------------------------------------------------------------------------------------# # Comfyroll Studio custom nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes # for ComfyUI https://github.com/comfyanonymous/ComfyUI #---------------------------------------------------------------------------------------------------------------------# import torch import numpy as np import folder_paths from PIL import Image from ..categories import icons from .functions_upscale import * #MAX_RESOLUTION=8192 #---------------------------------------------------------------------------------------------------------------------# # NODES #---------------------------------------------------------------------------------------------------------------------# # These nodes are based on WAS nodes Image Resize and the Comfy Extras upscale with model nodes class CR_UpscaleImage: @classmethod def INPUT_TYPES(s): resampling_methods = ["lanczos", "nearest", "bilinear", "bicubic"] return {"required": {"image": ("IMAGE",), "upscale_model": (folder_paths.get_filename_list("upscale_models"), ), "mode": (["rescale", "resize"],), "rescale_factor": ("FLOAT", {"default": 2, "min": 0.01, "max": 16.0, "step": 0.01}), "resize_width": ("INT", {"default": 1024, "min": 1, "max": 48000, "step": 1}), "resampling_method": (resampling_methods,), "supersample": (["true", "false"],), "rounding_modulus": ("INT", {"default": 8, "min": 8, "max": 1024, "step": 8}), } } RETURN_TYPES = ("IMAGE", "STRING", ) RETURN_NAMES = ("IMAGE", "show_help", ) FUNCTION = "upscale" CATEGORY = icons.get("Comfyroll/Upscale") def upscale(self, image, upscale_model, rounding_modulus=8, loops=1, mode="rescale", supersample='true', resampling_method="lanczos", rescale_factor=2, resize_width=1024): # Load upscale model up_model = load_model(upscale_model) # Upscale with model up_image = upscale_with_model(up_model, image) for img in image: pil_img = tensor2pil(img) original_width, original_height = pil_img.size for img in up_image: # Get new size pil_img = tensor2pil(img) upscaled_width, upscaled_height = pil_img.size show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Upscale-Nodes#cr-upscale-image" # Return if no rescale needed if upscaled_width == original_width and rescale_factor == 1: return (up_image, show_help) # Image resize scaled_images = [] for img in up_image: scaled_images.append(pil2tensor(apply_resize_image(tensor2pil(img), original_width, original_height, rounding_modulus, mode, supersample, rescale_factor, resize_width, resampling_method))) images_out = torch.cat(scaled_images, dim=0) return (images_out, show_help, ) #--------------------------------------------------------------------------------------------------------------------- class CR_MultiUpscaleStack: @classmethod def INPUT_TYPES(s): mix_methods = ["Combine", "Average", "Concatenate"] up_models = ["None"] + folder_paths.get_filename_list("upscale_models") return {"required": { "switch_1": (["On","Off"],), "upscale_model_1": (up_models, ), "rescale_factor_1": ("FLOAT", {"default": 2, "min": 0.01, "max": 16.0, "step": 0.01}), "switch_2": (["On","Off"],), "upscale_model_2": (up_models, ), "rescale_factor_2": ("FLOAT", {"default": 2, "min": 0.01, "max": 16.0, "step": 0.01}), "switch_3": (["On","Off"],), "upscale_model_3": (up_models, ), "rescale_factor_3": ("FLOAT", {"default": 2, "min": 0.01, "max": 16.0, "step": 0.01}), }, "optional": {"upscale_stack": ("UPSCALE_STACK",), } } RETURN_TYPES = ("UPSCALE_STACK", "STRING", ) RETURN_NAMES = ("UPSCALE_STACK", "show_help", ) FUNCTION = "stack" CATEGORY = icons.get("Comfyroll/Upscale") def stack(self, switch_1, upscale_model_1, rescale_factor_1, switch_2, upscale_model_2, rescale_factor_2, switch_3, upscale_model_3, rescale_factor_3, upscale_stack=None): # Initialise the list upscale_list=list() if upscale_stack is not None: upscale_list.extend([l for l in upscale_stack if l[0] != "None"]) if upscale_model_1 != "None" and switch_1 == "On": upscale_list.extend([(upscale_model_1, rescale_factor_1)]), if upscale_model_2 != "None" and switch_2 == "On": upscale_list.extend([(upscale_model_2, rescale_factor_2)]), if upscale_model_3 != "None" and switch_3 == "On": upscale_list.extend([(upscale_model_3, rescale_factor_3)]), show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Upscale-Nodes#cr-multi-upscale-stack" return (upscale_list, show_help, ) #--------------------------------------------------------------------------------------------------------------------- class CR_ApplyMultiUpscale: @classmethod def INPUT_TYPES(s): resampling_methods = ["lanczos", "nearest", "bilinear", "bicubic"] return {"required": {"image": ("IMAGE",), "resampling_method": (resampling_methods,), "supersample": (["true", "false"],), "rounding_modulus": ("INT", {"default": 8, "min": 8, "max": 1024, "step": 8}), "upscale_stack": ("UPSCALE_STACK",), } } RETURN_TYPES = ("IMAGE", "STRING", ) RETURN_NAMES = ("IMAGE", "show_help", ) FUNCTION = "apply" CATEGORY = icons.get("Comfyroll/Upscale") def apply(self, image, resampling_method, supersample, rounding_modulus, upscale_stack): # Get original size pil_img = tensor2pil(image) original_width, original_height = pil_img.size # Extend params with upscale-stack items params = list() params.extend(upscale_stack) # Loop through the list for tup in params: upscale_model, rescale_factor = tup print(f"[Info] CR Apply Multi Upscale: Applying {upscale_model} and rescaling by factor {rescale_factor}") # Load upscale model up_model = load_model(upscale_model) # Upscale with model up_image = upscale_with_model(up_model, image) # Get new size pil_img = tensor2pil(up_image) upscaled_width, upscaled_height = pil_img.size # Return if no rescale needed if upscaled_width == original_width and rescale_factor == 1: image = up_image else: # Image resize scaled_images = [] mode = "rescale" resize_width = 1024 for img in up_image: scaled_images.append(pil2tensor(apply_resize_image(tensor2pil(img), original_width, original_height, rounding_modulus, mode, supersample, rescale_factor, resize_width, resampling_method))) image = torch.cat(scaled_images, dim=0) show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Upscale-Nodes#cr-apply-multi-upscale" return (image, show_help, ) #--------------------------------------------------------------------------------------------------------------------- # MAPPINGS #---------------------------------------------------------------------------------------------------------------------# # For reference only, actual mappings are in __init__.py # 0 nodes released ''' NODE_CLASS_MAPPINGS = { # Conditioning "CR Multi Upscale Stack":CR_MultiUpscaleStack, "CR Upscale Image":CR_UpscaleImage, "CR Apply Multi Upscale":CR_ApplyMultiUpscale, } '''