Changes: Update ArgosTranslate node, change avaiables languages from selected language and clear code. Update HexToHue node, set piping next sibling input color elements color. Fix readme extrasnodes. Add to the file utils.js functions isValidStyle and rgbToHex Update pyproject.toml to new version.
224 lines
6.2 KiB
Python
224 lines
6.2 KiB
Python
from PIL import Image, ImageEnhance, ImageColor, ImageOps
|
|
import numpy as np
|
|
import torch
|
|
from server import PromptServer
|
|
|
|
|
|
class PreviewTextNode:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
|
|
return {
|
|
"required": {
|
|
"text": ("STRING", {"forceInput": True}),
|
|
},
|
|
"hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"},
|
|
}
|
|
|
|
RETURN_TYPES = ("STRING",)
|
|
OUTPUT_NODE = True
|
|
FUNCTION = "preview_text"
|
|
|
|
CATEGORY = "AlekPet Nodes/extras"
|
|
|
|
def preview_text(self, text, prompt=None, extra_pnginfo=None):
|
|
return {
|
|
"ui": {
|
|
"string": [
|
|
text,
|
|
]
|
|
},
|
|
"result": (text,),
|
|
}
|
|
|
|
|
|
# Correction colors nodes
|
|
class HexToHueNode:
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"color_hex": (
|
|
"STRING",
|
|
{"default": "#00ff33"},
|
|
),
|
|
},
|
|
"hidden": {"unique_id": "UNIQUE_ID"},
|
|
}
|
|
|
|
RETURN_TYPES = ("STRING", "FLOAT", "FLOAT", "STRING", "STRING")
|
|
RETURN_NAMES = (
|
|
"string_hex",
|
|
"float_hue_degrees",
|
|
"float_hue_norm",
|
|
"string_hue_degrees",
|
|
"string_hue_norm",
|
|
)
|
|
FUNCTION = "to_hue"
|
|
CATEGORY = "AlekPet Nodes/extras"
|
|
|
|
def to_hue(self, color_hex, unique_id):
|
|
hue_degrees = ColorsCorrectNode.hex_to_hue(color_hex)
|
|
hue_norm = ColorsCorrectNode.degrees_to_hue(hue_degrees)
|
|
PromptServer.instance.send_sync(
|
|
"alekpet_get_color_hex", {"color_hex": color_hex, "unique_id": unique_id}
|
|
)
|
|
return (color_hex, hue_degrees, hue_norm, str(hue_degrees), str(hue_norm))
|
|
|
|
|
|
class ColorsCorrectNode:
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"image": ("IMAGE",),
|
|
"brightness": (
|
|
"FLOAT",
|
|
{"default": 1.0, "min": 0.0, "max": 100.0, "step": 0.05},
|
|
),
|
|
"contrast": (
|
|
"FLOAT",
|
|
{"default": 1.0, "min": 0.0, "max": 100.0, "step": 0.05},
|
|
),
|
|
"saturation": (
|
|
"FLOAT",
|
|
{"default": 1.0, "min": 0.0, "max": 100.0, "step": 0.05},
|
|
),
|
|
"gamma": (
|
|
"FLOAT",
|
|
{"default": 1.0, "min": 0.0, "max": 100.0, "step": 0.05},
|
|
),
|
|
"hue_degrees": (
|
|
"FLOAT",
|
|
{"default": 0.0, "min": 0.0, "max": 360.0, "step": 0.01},
|
|
),
|
|
"use_color": (
|
|
"BOOLEAN",
|
|
{"default": True},
|
|
),
|
|
},
|
|
"optional": {
|
|
"hex_color": (
|
|
"STRING",
|
|
{"default": "#00FF33"},
|
|
),
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = ("IMAGE",)
|
|
FUNCTION = "correct"
|
|
CATEGORY = "AlekPet Nodes/extras"
|
|
|
|
@staticmethod
|
|
def hex_to_rgb(hex_color):
|
|
return ImageColor.getcolor(hex_color, "RGB")
|
|
|
|
@staticmethod
|
|
def hex_to_hue(hex_color):
|
|
rgb = ImageColor.getcolor(hex_color, "RGB")
|
|
r, g, b = [x / 255.0 for x in rgb]
|
|
mx = max(r, g, b)
|
|
mn = min(r, g, b)
|
|
df = mx - mn
|
|
|
|
if mx == mn:
|
|
h = 0
|
|
elif mx == r:
|
|
h = (60 * ((g - b) / df) + 360) % 360
|
|
elif mx == g:
|
|
h = (60 * ((b - r) / df) + 120) % 360
|
|
elif mx == b:
|
|
h = (60 * ((r - g) / df) + 240) % 360
|
|
|
|
return h
|
|
|
|
@staticmethod
|
|
def adjust_brightness(image, factor):
|
|
enhancer = ImageEnhance.Brightness(image)
|
|
return enhancer.enhance(factor)
|
|
|
|
@staticmethod
|
|
def adjust_contrast(image, factor):
|
|
enhancer = ImageEnhance.Contrast(image)
|
|
return enhancer.enhance(factor)
|
|
|
|
@staticmethod
|
|
def adjust_saturation(image, factor):
|
|
enhancer = ImageEnhance.Color(image)
|
|
return enhancer.enhance(factor)
|
|
|
|
@staticmethod
|
|
def adjust_gamma(image, gamma):
|
|
inv_gamma = 1.0 / gamma
|
|
lut = [pow(x / 255.0, inv_gamma) * 255 for x in range(256)]
|
|
lut = np.array(lut * 3, dtype=np.uint8)
|
|
return image.point(lut)
|
|
|
|
@staticmethod
|
|
def degrees_to_hue(degrees):
|
|
degrees = degrees % 360
|
|
hue = degrees / 360.0
|
|
|
|
if hue > 0.5:
|
|
hue -= 1.0
|
|
if hue < -0.5:
|
|
hue += 1.0
|
|
|
|
return hue
|
|
|
|
@staticmethod
|
|
def adjust_hue(image, hue):
|
|
if not (-0.5 <= hue <= 0.5):
|
|
raise ValueError("hue value is not in [-0.5, 0.5].")
|
|
|
|
image_array = np.array(image.convert("RGB"), dtype=np.uint8)
|
|
|
|
hsv_image = Image.fromarray(image_array).convert("HSV")
|
|
hsv_array = np.array(hsv_image)
|
|
|
|
hsv_array[..., 0] = (hsv_array[..., 0].astype(int) + int(hue * 255)) % 256
|
|
|
|
rgb_image = Image.fromarray(hsv_array, mode="HSV").convert("RGB")
|
|
return rgb_image
|
|
|
|
@staticmethod
|
|
def tint_image(image, hex_color):
|
|
return ImageOps.colorize(image.convert("L"), black="black", white=hex_color)
|
|
|
|
def correct(
|
|
self,
|
|
image,
|
|
use_color=True,
|
|
hex_color="#00FF33",
|
|
brightness=1.0,
|
|
contrast=1.0,
|
|
saturation=1.0,
|
|
gamma=1.0,
|
|
hue_degrees=0.0,
|
|
):
|
|
i = 255.0 * image[0].cpu().numpy()
|
|
image = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
|
|
|
|
if use_color:
|
|
image = ColorsCorrectNode.tint_image(image, hex_color)
|
|
|
|
image = ColorsCorrectNode.adjust_brightness(image, brightness)
|
|
image = ColorsCorrectNode.adjust_contrast(image, contrast)
|
|
image = ColorsCorrectNode.adjust_saturation(image, saturation)
|
|
image = ColorsCorrectNode.adjust_gamma(image, gamma)
|
|
|
|
hue_norm = ColorsCorrectNode.degrees_to_hue(hue_degrees)
|
|
image = ColorsCorrectNode.adjust_hue(image, hue_norm)
|
|
|
|
image = ImageOps.exif_transpose(image)
|
|
image = image.convert("RGB")
|
|
image = np.array(image).astype(np.float32) / 255.0
|
|
image = torch.from_numpy(image)[None,]
|
|
|
|
return (image,)
|