3v324v23's picture
lfs
1e3b872
import torch
from .Utils import create_rgba_image
class ImageContainer:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"width": ("INT", {
"default": 512,
"min": 1,
"step": 1
}),
"height": ("INT", {
"default": 512,
"min": 1,
"step": 1
}),
"red": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"green": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"blue": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"alpha": ("FLOAT", {
"default": 0.0,
"max": 1.0,
"step": 0.01
}),
},
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "node"
CATEGORY = "image/container"
def node(self, width, height, red, green, blue, alpha):
return (create_rgba_image(width, height, (red, green, blue, int(alpha * 255))).image_to_tensor().unsqueeze(0),)
class ImageContainerInheritanceAdd:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"images": ("IMAGE",),
"add_width": ("INT", {
"default": 0,
"step": 1
}),
"add_height": ("INT", {
"default": 0,
"step": 1
}),
"red": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"green": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"blue": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"alpha": ("FLOAT", {
"default": 0.0,
"max": 1.0,
"step": 0.01
}),
"method": (["single", "for_each"],),
},
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "node"
CATEGORY = "image/container"
def node(self, images, add_width, add_height, red, green, blue, alpha, method):
width, height = images[0, :, :, 0].shape
width = width + add_width
height = height + add_height
image = create_rgba_image(width, height, (red, green, blue, int(alpha * 255))).image_to_tensor()
if method == "single":
return (image.unsqueeze(0),)
else:
length = len(images)
images = torch.zeros(length, height, width, 4)
images[:, :, :] = image
return (images,)
class ImageContainerInheritanceScale:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"images": ("IMAGE",),
"scale_width": ("FLOAT", {
"default": 1.0,
"step": 0.1
}),
"scale_height": ("FLOAT", {
"default": 1.0,
"step": 0.1
}),
"red": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"green": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"blue": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"alpha": ("FLOAT", {
"default": 0.0,
"max": 1.0,
"step": 0.01
}),
"method": (["single", "for_each"],),
},
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "node"
CATEGORY = "image/container"
def node(self, images, scale_width, scale_height, red, green, blue, alpha, method):
height, width = images[0, :, :, 0].shape
width = int((width * scale_width) - width)
height = int((height * scale_height) - height)
return ImageContainerInheritanceAdd() \
.node(images, width, height, red, green, blue, alpha, method)
class ImageContainerInheritanceMax:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"images_a": ("IMAGE",),
"images_b": ("IMAGE",),
"red": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"green": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"blue": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"alpha": ("FLOAT", {
"default": 0.0,
"max": 1.0,
"step": 0.01
}),
"method": (["single", "for_each_pair", "for_each_matrix"],),
},
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "node"
CATEGORY = "image/container"
def node(self, images_a, images_b, red, green, blue, alpha, method):
img_a_height, img_a_width = images_a[0, :, :, 0].shape
img_b_height, img_b_width = images_b[0, :, :, 0].shape
width = max(img_a_width, img_b_width)
height = max(img_a_height, img_b_height)
image = create_rgba_image(width, height, (red, green, blue, int(alpha * 255))).image_to_tensor()
if method == "single":
return (image.unsqueeze(0),)
elif method == "for_each_pair":
length = len(images_a)
images = torch.zeros(length, height, width, 4)
else:
length = len(images_a) * len(images_b)
images = torch.zeros(length, height, width, 4)
images[:, :, :] = image
return (images,)
class ImageContainerInheritanceSum:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"images_a": ("IMAGE",),
"images_b": ("IMAGE",),
"red": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"green": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"blue": ("INT", {
"default": 255,
"max": 255,
"step": 1
}),
"alpha": ("FLOAT", {
"default": 0.0,
"max": 1.0,
"step": 0.01
}),
"container_size_type": (["sum", "sum_width", "sum_height"],),
"method": (["single", "for_each_pair", "for_each_matrix"],),
},
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "node"
CATEGORY = "image/container"
def node(self, images_a, images_b, red, green, blue, alpha, container_size_type, method):
img_a_height, img_a_width = images_a[0, :, :, 0].shape
img_b_height, img_b_width = images_b[0, :, :, 0].shape
if container_size_type == "sum":
width = img_a_width + img_b_width
height = img_a_height + img_b_height
elif container_size_type == "sum_width":
if img_a_height != img_b_height:
raise ValueError()
width = img_a_width + img_b_width
height = img_a_height
elif container_size_type == "sum_height":
if img_a_width != img_b_width:
raise ValueError()
width = img_a_width
height = img_a_height + img_b_height
else:
raise ValueError()
image = create_rgba_image(width, height, (red, green, blue, int(alpha * 255))).image_to_tensor()
if method == "single":
return (image.unsqueeze(0),)
elif method == "for_each_pair":
length = len(images_a)
images = torch.zeros(length, height, width, 4)
else:
length = len(images_a) * len(images_b)
images = torch.zeros(length, height, width, 4)
images[:, :, :] = image
return (images,)
NODE_CLASS_MAPPINGS = {
"ImageContainer": ImageContainer,
"ImageContainerInheritanceAdd": ImageContainerInheritanceAdd,
"ImageContainerInheritanceScale": ImageContainerInheritanceScale,
"ImageContainerInheritanceMax": ImageContainerInheritanceMax,
"ImageContainerInheritanceSum": ImageContainerInheritanceSum
}