|
|
|
|
|
|
|
|
|
|
|
import torch |
|
import numpy as np |
|
import folder_paths |
|
from PIL import Image |
|
from ..categories import icons |
|
from .functions_upscale import * |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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): |
|
|
|
|
|
up_model = load_model(upscale_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: |
|
|
|
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" |
|
|
|
|
|
if upscaled_width == original_width and rescale_factor == 1: |
|
return (up_image, show_help) |
|
|
|
|
|
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): |
|
|
|
|
|
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): |
|
|
|
|
|
pil_img = tensor2pil(image) |
|
original_width, original_height = pil_img.size |
|
|
|
|
|
params = list() |
|
params.extend(upscale_stack) |
|
|
|
|
|
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}") |
|
|
|
up_model = load_model(upscale_model) |
|
|
|
|
|
up_image = upscale_with_model(up_model, image) |
|
|
|
|
|
pil_img = tensor2pil(up_image) |
|
upscaled_width, upscaled_height = pil_img.size |
|
|
|
|
|
if upscaled_width == original_width and rescale_factor == 1: |
|
image = up_image |
|
else: |
|
|
|
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, ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
''' |
|
NODE_CLASS_MAPPINGS = { |
|
# Conditioning |
|
"CR Multi Upscale Stack":CR_MultiUpscaleStack, |
|
"CR Upscale Image":CR_UpscaleImage, |
|
"CR Apply Multi Upscale":CR_ApplyMultiUpscale, |
|
} |
|
''' |
|
|
|
|
|
|
|
|