Spaces:
Runtime error
Runtime error
File size: 5,827 Bytes
f2dbf59 |
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
from .imagefunc import *
NODE_NAME = 'CreateGradientMask'
any = AnyType("*")
class CreateGradientMask:
def __init__(self):
pass
@classmethod
def INPUT_TYPES(self):
side = ['bottom', 'top', 'left', 'right', 'center']
return {
"required": {
"width": ("INT", {"default": 512, "min": 4, "max": 99999, "step": 1}),
"height": ("INT", {"default": 512, "min": 4, "max": 99999, "step": 1}),
"gradient_side": (side,),
"gradient_scale": ("INT", {"default": 100, "min": 1, "max": 9999, "step": 1}),
"gradient_offset": ("INT", {"default": 0, "min": -9999, "max": 9999, "step": 1}),
"opacity": ("INT", {"default": 100, "min": 0, "max": 100, "step": 1}),
},
"optional": {
"size_as": (any, {}),
}
}
RETURN_TYPES = ("MASK",)
RETURN_NAMES = ("mask",)
FUNCTION = 'create_gradient_mask'
CATEGORY = '😺dzNodes/LayerMask'
def create_gradient_mask(self, width, height, gradient_side, gradient_scale, gradient_offset, opacity, size_as=None):
if size_as is not None:
if size_as.shape[0] > 0:
_asimage = tensor2pil(size_as[0])
else:
_asimage = tensor2pil(size_as)
width, height = _asimage.size
_black = Image.new('L', size=(width, height), color='black')
_white = Image.new('L', size=(width, height), color='white')
_canvas = copy.deepcopy(_black)
debug_image1 = copy.deepcopy(_black).convert('RGB')
debug_image2 = copy.deepcopy(_black).convert('RGB')
start_color = '#FFFFFF'
end_color = '#000000'
if gradient_side == 'bottom':
_gradient = create_gradient(start_color, end_color, width, height, direction='bottom')
if gradient_scale != 100:
_gradient = _gradient.resize((width, int(height * gradient_scale / 100)))
_canvas.paste(_gradient.convert('L'), box=(0, gradient_offset))
if gradient_offset > height:
_canvas = _white
elif gradient_offset > 0:
_canvas.paste(_white, box=(0, gradient_offset - height))
elif gradient_side == 'top':
_gradient = create_gradient(start_color, end_color, width, height, direction='top')
if gradient_scale != 100:
_gradient = _gradient.resize((width, int(height * gradient_scale / 100)))
_canvas.paste(_gradient.convert('L'), box=(0, height - int(height * gradient_scale / 100) + gradient_offset))
if gradient_offset < -height:
_canvas = _white
elif gradient_offset < 0:
_canvas.paste(_white, box=(0, height + gradient_offset))
elif gradient_side == 'left':
_gradient = create_gradient(start_color, end_color, width, height, direction='left')
if gradient_scale != 100:
_gradient = _gradient.resize((int(width * gradient_scale / 100), height))
_canvas.paste(_gradient.convert('L'), box=(width - int(width * gradient_scale / 100) + gradient_offset, 0))
if gradient_offset < -width:
_canvas = _white
elif gradient_offset < 0:
_canvas.paste(_white, box=(width + gradient_offset, 0))
elif gradient_side == 'right':
_gradient = create_gradient(start_color, end_color, width, height, direction='right')
if gradient_scale != 100:
_gradient = _gradient.resize((int(width * gradient_scale / 100), height))
_canvas.paste(_gradient.convert('L'), box=(gradient_offset, 0))
if gradient_offset > width:
_canvas = _white
elif gradient_offset > 0:
_canvas.paste(_white, box=(gradient_offset - width, 0))
else:
_gradient = create_box_gradient(start_color_inhex='#000000', end_color_inhex='#FFFFFF',
width=width, height=height, scale=int(gradient_scale))
_gradient = _gradient.convert('L')
debug_image1 = _gradient
_blur_mask = Image.new('L', size=(width*2, height*2), color='black')
_blur_mask.paste(_gradient, box=(int(width/2), int(height/2)))
_blur_mask = gaussian_blur(_blur_mask, int((width + height) * gradient_scale / 100 / 16))
_gamma_mask = gamma_trans(_blur_mask, 0.15)
(crop_x, crop_y, crop_width, crop_height) = mask_area(_gamma_mask)
crop_box = (crop_x, crop_y, crop_x + crop_width, crop_y + crop_height)
_blur_mask = _blur_mask.crop(crop_box)
_blur_mask = _blur_mask.resize((width, height), Image.BILINEAR)
if gradient_offset != 0:
resize_width = int(width - gradient_offset)
resize_height = int(height - gradient_offset)
if resize_width < 1:
resize_width = 1
if resize_height < 1:
resize_height = 1
_blur_mask = _blur_mask.resize((resize_width, resize_height), Image.BILINEAR)
paste_box = (int((width - resize_width) / 2), int((height - resize_height) / 2))
else:
paste_box = (0,0)
_canvas.paste(_blur_mask, box=paste_box)
# opacity
if opacity < 100:
_canvas = chop_image(_black, _canvas, 'normal', opacity)
log(f"{NODE_NAME} Processed.", message_type='finish')
return (image2mask(_canvas),)
NODE_CLASS_MAPPINGS = {
"LayerMask: CreateGradientMask": CreateGradientMask
}
NODE_DISPLAY_NAME_MAPPINGS = {
"LayerMask: CreateGradientMask": "LayerMask: CreateGradientMask"
} |