85 lines
3.0 KiB
Python
85 lines
3.0 KiB
Python
import os.path
|
|
import random
|
|
import time
|
|
|
|
from .imagefunc import *
|
|
|
|
|
|
NODE_NAME = 'LightLeak'
|
|
|
|
blend_mode = 'screen'
|
|
|
|
class LightLeak:
|
|
|
|
def __init__(self):
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(self):
|
|
light_list = ['random', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10',
|
|
'11', '12', '13', '14', '15', '16', '17', '18', '19', '20',
|
|
'21', '22', '23', '24', '25', '26', '27', '28', '29', '30',
|
|
'31', '32']
|
|
corner_list = ['left_top', 'right_top', 'left_bottom', 'right_bottom']
|
|
return {
|
|
"required": {
|
|
"image": ("IMAGE", ),
|
|
"light": (light_list,),
|
|
"corner": (corner_list,),
|
|
"hue": ("INT", {"default": 0, "min": -255, "max": 255, "step": 1}),
|
|
"saturation": ("INT", {"default": 0, "min": -255, "max": 255, "step": 1}),
|
|
"opacity": ("INT", {"default": 100, "min": 0, "max": 100, "step": 1})
|
|
},
|
|
"optional": {
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("IMAGE",)
|
|
RETURN_NAMES = ("image",)
|
|
FUNCTION = 'light_leak'
|
|
CATEGORY = '😺dzNodes/LayerFilter'
|
|
|
|
def light_leak(self, image, light, corner, hue, saturation, opacity):
|
|
|
|
ret_images = []
|
|
light_leak_images = load_light_leak_images()
|
|
if light == 'random':
|
|
random.seed(time.time())
|
|
light_index = random.randint(0,31)
|
|
else:
|
|
light_index = int(light) - 1
|
|
|
|
for i in image:
|
|
i = torch.unsqueeze(i, 0)
|
|
_canvas = tensor2pil(i).convert('RGB')
|
|
_light = light_leak_images[light_index]
|
|
if _canvas.width < _canvas.height:
|
|
_light = _light.transpose(Image.ROTATE_90).transpose(Image.FLIP_TOP_BOTTOM)
|
|
if corner == 'right_top':
|
|
_light = _light.transpose(Image.FLIP_LEFT_RIGHT)
|
|
elif corner == 'left_bottom':
|
|
_light = _light.transpose(Image.FLIP_TOP_BOTTOM)
|
|
elif corner == 'right_bottom':
|
|
_light = _light.transpose(Image.ROTATE_180)
|
|
if hue != 0 or saturation != 0:
|
|
_h, _s, _v = _light.convert('HSV').split()
|
|
if hue != 0:
|
|
_h = image_hue_offset(_h, hue)
|
|
if saturation != 0:
|
|
_s = image_gray_offset(_s, saturation)
|
|
_light = image_channel_merge((_h, _s, _v), 'HSV')
|
|
resize_sampler = Image.BILINEAR
|
|
_light = fit_resize_image(_light, _canvas.width, _canvas.height, fit='crop', resize_sampler=resize_sampler)
|
|
ret_image = chop_image(_canvas, _light, blend_mode=blend_mode, opacity = opacity)
|
|
ret_images.append(pil2tensor(ret_image))
|
|
|
|
log(f"{NODE_NAME} Processed {len(ret_images)} image(s).", message_type='finish')
|
|
return (torch.cat(ret_images, dim=0),)
|
|
|
|
NODE_CLASS_MAPPINGS = {
|
|
"LayerFilter: LightLeak": LightLeak
|
|
}
|
|
|
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
|
"LayerFilter: LightLeak": "LayerFilter: LightLeak"
|
|
} |