commit RoundedRectangle node

This commit is contained in:
chflame163
2024-12-16 16:40:17 +08:00
parent fc764f2834
commit ac9e179489
9 changed files with 759 additions and 6 deletions
+23 -1
View File
@@ -147,6 +147,7 @@ When this error has occurred, please check the network environment.
<font size="4">**If the dependency package error after updating, please double clicking ```repair_dependency.bat``` (for Official ComfyUI Protable) or ```repair_dependency_aki.bat``` (for ComfyUI-aki-v1.x) in the plugin folder to reinstall the dependency packages. </font><br />
* Commit [RoundedRectangle](#RoundedRectangle) node, Used to create rounded rectangle and mask.
* Commit [AnyRerouter](#AnyRerouter) node, Used for reroute any type of data.
* Commit [ICMask](#ICMask) and [ICMaskCropBack](#ICMaskCropBack) nodes, Used for generating In-Context image and mask, and automatic crop back. The code is from [lrzjason/Comfyui-In-Context-Lora-Utils](https://github.com/lrzjason/Comfyui-In-Context-Lora-Utils) , Thanks to the original author @小志Jason.
* Commit [GetMainColorsV2](#GetMainColorsV2) node, add sorting by color area and output color values and proportions in the preview image. This part of the code was improved by @ HL, thanks.
@@ -167,7 +168,7 @@ LayerMask: SegmentAnythingUltra, LayerMask: SegmentAnythingUltra V2, LayerMask:
LayerUtility: UserPromptGeneratorTxt2ImgPrompt, LayerUtility: UserPromptGeneratorTxt2ImgPromptWithReference, LayerUtility: UserPromptGeneratorReplaceWord,
LayerUtility: AddBlindWaterMark, LayerUtility: ShowBlindWaterMark, LayerMask: YoloV8Detect
* Merge the PR submitted by [alexisrolland](https://github.com/alexisrolland) , commit the ```Image Blend Advanced v3``` and ```Drop Shadow v3``` nodes, support transparent background.
* Commit [BenUltra](#BenUltra) and [LoadBenModel](#LoadBenModel) nodes. These two nodes are the implementation of [PramaLLC/BEN](https://huggingface.co/PramaLLC/BEN) project in ComfyUI.
Download the ```BEN_Base.pth``` and ```config.json``` from [huggingface](https://huggingface.co/PramaLLC/BEN/tree/main) or [BaiduNetdisk](https://pan.baidu.com/s/17mdBxfBl_R97mtNHuiHsxQ?pwd=2jn3) and copy to ```ComfyUI/models/BEN``` folder.
* Merge the PR submitted by [jimlee2048](https://github.com/jimlee2048), add the LoadBiRefNetModelV2 node, and support loading RMBG 2.0 models.
@@ -1274,6 +1275,27 @@ The following changes have been made based on GradientImage:
<sup>*</sup>Only limited to input images and masks. forcing the integration of other types of inputs will result in node errors.
<sup>**</sup>The preset size is defined in ```custom_size.ini```, this file is located in the root directory of the plug-in, and the default name is ```custom_size.ini.example```. to use this file for the first time, you need to change the file suffix to ```.ini```. Open with text editing software. Each row represents a size, with the first value being width and the second being height, separated by a lowercase "x" in the middle. To avoid errors, please do not enter extra characters.
### <a id="table1">RoundedRectangle</a>
![image](image/rounded_rectangle_example.jpg)
Generate rounded rectangles and masks.
![image](image/rounded_rectangle_node.jpg)
Node Options:
* image: The image to be processed.
* object_mask: Optional input. This mask can generate rounded rectangular regions. If have input for ```crop-box```, this option will be ignored.
* crop_box: Optional input. This can generate a rounded rectangular area by cropping the region.
* rounded_rect_radius: Rounded rectangle radius. The range is 0-100, and the larger the value, the more pronounced the rounded corners.
* anti_aliasing: Anti aliasing, ranging from 0-16, with larger values indicating less pronounced aliasing. Excessive values will significantly reduce the processing speed of nodes.
* top: Top margin of the rounded rectangle is a percentage of the image height, and negative values are allowed. If there is crox_box or object_mask input, this option will be ignored.
* bottom: Bottom margin of the rounded rectangle is a percentage of the image height, and negative values are allowed. If there is crox_box or object_mask input, this option will be ignored.
* left: Left margin of the rounded rectangle is a percentage of the image width, and negative values are allowed. If there is crox_box or object_mask input, this option will be ignored.
* right: Right margin of the rounded rectangle is a percentage of the image width, and negative values are allowed. If there is crox_box or object_mask input, this option will be ignored.
* detect: The method of detecting mask regions when object_mask is input. ```min_bounding_rect``` is the minimum bounding rectangle of block shape, ```max_inscribed_rect``` is the maximum inscribed rectangle of block shape, and ```mask-area``` is the effective area for masking pixels.
* obj_ext_top: When object_mask or crop-box is input, the top of the rounded rectangle area expands outward as a percentage of the area height, and negative values are allowed.
* obj_ext_bottom: When object_mask or crop-box is input, the bottom of the rounded rectangle area expands outward as a percentage of the area height, and negative values are allowed.
* obj_ext_left: When object_mask or crop-box is input, the left of the rounded rectangle area expands outward as a percentage of the area width, and negative values are allowed.
* obj_ext_right: When object_mask or crop-box is input, the right of the rounded rectangle area expands outward as a percentage of the area width, and negative values are allowed.
### <a id="table1">SimpleTextImage</a>
+23 -1
View File
@@ -128,6 +128,7 @@ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
## 更新说明
<font size="4">**如果本插件更新后出现依赖包错误,请双击运行插件目录下的```install_requirements.bat```(官方便携包),或 ```install_requirements_aki.bat```(秋叶整合包) 重新安装依赖包。
* 添加 [RoundedRectangle](#RoundedRectangle) 节点,用于创建圆角矩形及遮罩。
* 添加 [AnyRerouter](#AnyRerouter) 节点,用于将任意类型数据中转转发。
* 添加 [ICMask](#ICMask) 和 [ICMaskCropBack](#ICMaskCropBack) 节点,用于生成一致性上下文图片和遮罩,以及自动回裁。代码来自[lrzjason/Comfyui-In-Context-Lora-Utils](https://github.com/lrzjason/Comfyui-In-Context-Lora-Utils) 感谢原作者@小志Jason
* 添加 [GetMainColorsV2](#GetMainColorsV2) 节点,增加按颜色面积排序,并在预览图中输出色值和比例。这部分代码由@HL完善,感谢。
@@ -148,6 +149,7 @@ LayerMask: SegmentAnythingUltra, LayerMask: SegmentAnythingUltra V2, LayerMask:
LayerUtility: UserPromptGeneratorTxt2ImgPrompt, LayerUtility: UserPromptGeneratorTxt2ImgPromptWithReference, LayerUtility: UserPromptGeneratorReplaceWord,
LayerUtility: AddBlindWaterMark, LayerUtility: ShowBlindWaterMark, LayerMask: YoloV8Detect
* 合并[alexisrolland](https://github.com/alexisrolland) 提交的分支,添加Image Blend Advanced v3 和 Drop Shadow v3 节点,支持透明背景。
* 添加[BenUltra](#BenUltra) 和 [LoadBenModel](#LoadBenModel)节点。这两个节点是[PramaLLC/BEN](https://huggingface.co/PramaLLC/BEN) 项目在ComfyUI中的实现。
从 [huggingface](https://huggingface.co/PramaLLC/BEN/tree/main) 或 [百度网盘](https://pan.baidu.com/s/17mdBxfBl_R97mtNHuiHsxQ?pwd=2jn3)下载```BEN_Base.pth``` 和 ```config.json``` 两个文件并复制到 ```ComfyUI/models/BEN```文件夹。
* 合并[jimlee2048](https://github.com/jimlee2048)提交的PR, 添加[LoadBiRefNetModelV2](#LoadBiRefNetModelV2) 节点,支持加载RMBG 2.0模型。
@@ -1132,6 +1134,27 @@ GradientImage的V2升级版。
<sup>**</sup>预设尺寸在```custom_size.ini```中定义,这个文件位于插件根目录下, 默认名字是```custom_size.ini.example```, 初次使用这个文件需将文件后缀改为.ini。用文本编辑软件打开,编辑自定义尺寸。每行表示一个尺寸,第一个数值是宽度,第二个是高度,中间用小写的"x"分隔。为避免错误请不要输入多余的字符。
### <a id="table1">RoundedRectangle</a>
![image](image/rounded_rectangle_example.jpg)
生成圆角矩形及遮罩。
![image](image/rounded_rectangle_node.jpg)
节点选项说明:
* image: 图片输入。
* object_mask: 可选输入。可由此遮罩生成圆角矩形区域。如果```crop_box```有输入,则此选项将被忽略。
* crop_box: 可选输入。可由此裁剪区域生成圆角矩形区域。
* rounded_rect_radius: 圆角矩形半径。范围0-100, 数值越大圆角越明显。
* anti_aliasing: 抗锯齿,范围从0-16,数值越大,锯齿越不明显。过高的数值将显著降低节点的处理速度。
* top: 圆角矩形顶部边距,为图片高度的百分比,允许设置负值。如果有crop_box或者object_mask输入,此选项将被忽略。
* bottom: 圆角矩形底部边距,为图片高度的百分比,允许设置负值。如果有crop_box或者object_mask输入,此选项将被忽略。
* left: 圆角矩形左侧边距,为图片宽度的百分比,允许设置负值。如果有crop_box或者object_mask输入,此选项将被忽略。
* right: 圆角矩形右侧边距,为图片宽度的百分比,允许设置负值。如果有crop_box或者object_mask输入,此选项将被忽略。
* detect: 当object_mask输入时,检测遮罩区域的方法。```min_bounding_rect```是大块形状最小外接矩形, ```max_inscribed_rect```是大块形状最大内接矩形, ```mask_area```是遮罩像素有效区域。
* obj_ext_top: 当object_mask或crop_box输入时,圆角矩形区域顶部外扩范围,为区域高度的百分比,允许设置负值。
* obj_ext_bottom: 当object_mask或crop_box输入时,圆角矩形区域底部外扩范围,为区域高度的百分比,允许设置负值。
* obj_ext_left: 当object_mask或crop_box输入时,圆角矩形区域左侧外扩范围,为区域宽度的百分比,允许设置负值。
* obj_ext_right: 当object_mask或crop_box输入时,圆角矩形区域右侧外扩范围,为区域宽度的百分比,允许设置负值。
### <a id="table1">SimpleTextImage</a>
![image](image/simple_text_image_example.jpg)
@@ -1161,7 +1184,6 @@ GradientImage的V2升级版。
文件夹里面所有的.ttf和.otf文件将在ComfyUI初始化时被收集并显示在节点的列表中。
如果ini中设定的文件夹无效,将启用插件自带的font文件夹。
### <a id="table1">TextImage</a>
![image](image/text_image_example.jpg)
从文字生成图片以及遮罩。支持字间距行间距调整,横排竖排调整,可设置文字的随机变化,包括大小和位置的随机变化。
Binary file not shown.

After

Width:  |  Height:  |  Size: 546 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

+1 -1
View File
@@ -8,7 +8,7 @@ from .imagefunc import chop_image_v2, chop_mode_v2, shift_image, expand_mask
class DropShadowV3:
def __init__(self):
NODE_NAME = 'DropShadowV3'
self.NODE_NAME = 'DropShadowV3'
@classmethod
def INPUT_TYPES(self):
+26 -2
View File
@@ -748,6 +748,31 @@ def gradient(start_color_inhex:str, end_color_inhex:str, width:int, height:int,
ret_image = ret_image.resize((width, height))
return ret_image
def draw_rounded_rectangle(image:Image, radius:int, bboxes:list, scale_factor:int=2, color:str="white") -> Image:
"""
绘制圆角矩形图像。
image:输入图片
radius: 半径,100为纯椭圆
bboxes: (x1,y1,x2,y2)列表
scale_factor: 放大倍数
:return: 绘制好的pillow图像
"""
if scale_factor < 1 : scale_factor = 1
img = image.resize((image.width * scale_factor, image.height * scale_factor), Image.LANCZOS)
draw = ImageDraw.Draw(img)
for (x1, y1, x2, y2) in bboxes:
r = radius * min(x2-x1, y2-y1) * 0.005
x1, y1, x2, y2 = x1 * scale_factor, y1 * scale_factor, x2 * scale_factor, y2 * scale_factor
# 计算圆角矩形的四个角的圆弧
draw.rounded_rectangle([x1, y1, x2, y2], radius=r * scale_factor, fill=color)
img = img.filter(ImageFilter.SMOOTH_MORE)
img = img.resize((image.width, image.height), Image.LANCZOS)
return img
def draw_rect(image:Image, x:int, y:int, width:int, height:int, line_color:str, line_width:int,
box_color:str=None) -> Image:
draw = ImageDraw.Draw(image)
@@ -1529,8 +1554,7 @@ class VITMatteModel:
def load_VITMatte_model(model_name:str, local_files_only:bool=False) -> object:
model_name = "vitmatte"
model_repo = "hustvl/vitmatte-small-composition-1k"
model_path = check_and_download_model(model_name, model_repo)
model_path = check_and_download_model(model_name, model_repo)
from transformers import VitMatteImageProcessor, VitMatteForImageMatting
model = VitMatteForImageMatting.from_pretrained(model_path, local_files_only=local_files_only)
processor = VitMatteImageProcessor.from_pretrained(model_path, local_files_only=local_files_only)
+100
View File
@@ -0,0 +1,100 @@
import torch
from PIL import Image
from .imagefunc import log, pil2tensor, tensor2pil, image2mask, RGB2RGBA
from .imagefunc import draw_rounded_rectangle, gaussian_blur, mask_area, max_inscribed_rect, min_bounding_rect
class LS_RoundedRectangle:
def __init__(self):
self.NODE_NAME = 'RoundedRectangle'
@classmethod
def INPUT_TYPES(self):
detect_mode = ['mask_area', 'min_bounding_rect', 'max_inscribed_rect']
return {
"required": {
"image": ("IMAGE",),
"rounded_rect_radius": ("INT", {"default": 50, "min": 0, "max": 100, "step": 1}),
"anti_aliasing": ("INT", {"default": 2, "min": 0, "max": 16, "step": 1}),
"top": ("FLOAT", {"default": 8, "min": -100, "max": 100, "step": 0.1}),
"bottom": ("FLOAT", {"default": 8, "min": -100, "max": 100, "step": 0.1}),
"left": ("FLOAT", {"default": 8, "min": -100, "max": 100, "step": 0.1}),
"right": ("FLOAT", {"default": 8, "min": -100, "max": 100, "step": 0.1}),
"detect": (detect_mode,),
"obj_ext_top": ("FLOAT", {"default": 8, "min": -100, "max": 100, "step": 0.1}),
"obj_ext_bottom": ("FLOAT", {"default": 8, "min": -100, "max": 100, "step": 0.1}),
"obj_ext_left": ("FLOAT", {"default": 8, "min": -100, "max": 100, "step": 0.1}),
"obj_ext_right": ("FLOAT", {"default": 8, "min": -100, "max": 100, "step": 0.1}),
},
"optional": {
"object_mask": ("MASK",),
"crop_box": ("BOX",),
}
}
RETURN_TYPES = ("IMAGE", "MASK",)
RETURN_NAMES = ("image", "mask",)
FUNCTION = 'rounded_rectangle'
CATEGORY = '😺dzNodes/LayerUtility'
def rounded_rectangle(self, image, rounded_rect_radius, anti_aliasing, top, bottom, left, right,
detect, obj_ext_top, obj_ext_bottom, obj_ext_left, obj_ext_right,
object_mask=None, crop_box=None):
ret_images = []
ret_masks = []
for index, img in enumerate(image):
orig_image = tensor2pil(torch.unsqueeze(img, 0)).convert('RGB')
width, height = orig_image.size
black_image = Image.new('L', (width, height), color="black")
if crop_box is not None:
w = crop_box[2] - crop_box[0]
h = crop_box[3] - crop_box[1]
x1 = crop_box[0] - int(obj_ext_left * w * 0.01)
y1 = crop_box[1] - int(obj_ext_top * h * 0.01)
x2 = crop_box[2] + int(obj_ext_right * w * 0.01)
y2 = crop_box[3] + int(obj_ext_bottom * h * 0.01)
bbox = [(x1, y1, x2, y2)]
elif object_mask is not None:
if object_mask.dim() == 2: object_mask = torch.unsqueeze(object_mask, 0)
mask = object_mask[index] if index < len(object_mask) else object_mask[-1]
mask = tensor2pil(mask)
bluredmask = gaussian_blur(mask, 20).convert('L')
x = -10
y = -10
w = 4
h = 4
if detect == "min_bounding_rect":
(x, y, w, h) = min_bounding_rect(bluredmask)
elif detect == "max_inscribed_rect":
(x, y, w, h) = max_inscribed_rect(bluredmask)
else:
(x, y, w, h) = mask_area(mask)
x1 = x - int(obj_ext_left * w * 0.01)
y1 = y - int(obj_ext_top * h * 0.01)
x2 = x + w + int(obj_ext_right * w * 0.01)
y2 = y + h + int(obj_ext_bottom * h * 0.01)
bbox = [(x1, y1, x2, y2)]
else:
bbox = [(int(left * width * 0.01),
int(top * height * 0.01),
width - int(right * width * 0.01),
height - int(bottom * height * 0.01))
]
rect_mask = draw_rounded_rectangle(black_image, rounded_rect_radius, bbox, anti_aliasing, "white")
ret_image = RGB2RGBA(orig_image, rect_mask)
ret_images.append(pil2tensor(ret_image))
ret_masks.append(image2mask(rect_mask))
return (torch.cat(ret_images, dim=0), torch.cat(ret_masks, dim=0),)
NODE_CLASS_MAPPINGS = {
"LayerUtility: RoundedRectangle": LS_RoundedRectangle
}
NODE_DISPLAY_NAME_MAPPINGS = {
"LayerUtility: RoundedRectangle": "LayerUtility: RoundedRectangle"
}
+1 -1
View File
@@ -1,7 +1,7 @@
[project]
name = "comfyui_layerstyle"
description = "A set of nodes for ComfyUI it generate image like Adobe Photoshop's Layer Style. the Drop Shadow is first completed node, and follow-up work is in progress."
version = "2.0.9"
version = "2.0.10"
license = "MIT"
dependencies = ["numpy", "pillow", "torch", "matplotlib", "Scipy", "scikit_image", "scikit_learn", "opencv-contrib-python", "pymatting", "timm", "colour-science", "transformers", "blend_modes", "huggingface_hub", "loguru"]
+585
View File
@@ -0,0 +1,585 @@
{
"last_node_id": 27,
"last_link_id": 66,
"nodes": [
{
"id": 2,
"type": "LoadImage",
"pos": [
-4248.54541015625,
2201.82763671875
],
"size": [
315,
314
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
6,
14,
25,
45,
63
],
"slot_index": 0
},
{
"name": "MASK",
"type": "MASK",
"links": [],
"slot_index": 1
}
],
"properties": {
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"girl_dino_1024.png",
"image"
]
},
{
"id": 6,
"type": "LayerUtility: RoundedRectangle",
"pos": [
-3487.47900390625,
2197.4248046875
],
"size": [
354.73419189453125,
338
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 6
},
{
"name": "object_mask",
"type": "MASK",
"link": 23,
"shape": 7
},
{
"name": "crop_box",
"type": "BOX",
"link": null,
"shape": 7
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [],
"slot_index": 0
},
{
"name": "mask",
"type": "MASK",
"links": [
22,
41
],
"slot_index": 1
}
],
"properties": {
"Node name for S&R": "LayerUtility: RoundedRectangle"
},
"widgets_values": [
50,
2,
8,
8,
8,
8,
"mask_area",
8,
-8,
8,
8
],
"color": "rgba(38, 73, 116, 0.7)"
},
{
"id": 20,
"type": "LayerUtility: ImageBlendAdvance V3",
"pos": [
-2670.533447265625,
2212.40869140625
],
"size": [
345.9118347167969,
339.0574645996094
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "layer_image",
"type": "IMAGE",
"link": 60
},
{
"name": "background_image",
"type": "IMAGE",
"link": null,
"shape": 7
},
{
"name": "layer_mask",
"type": "MASK",
"link": 41,
"shape": 7
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
62
],
"slot_index": 0
},
{
"name": "mask",
"type": "MASK",
"links": [],
"slot_index": 1
}
],
"properties": {
"Node name for S&R": "LayerUtility: ImageBlendAdvance V3"
},
"widgets_values": [
false,
"normal",
100,
50,
50,
"None",
1,
1,
0,
"lanczos",
0
],
"color": "rgba(38, 73, 116, 0.7)"
},
{
"id": 25,
"type": "LayerStyle: DropShadow V3",
"pos": [
-2236.183349609375,
2527.528564453125
],
"size": [
315,
266
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "layer_image",
"type": "IMAGE",
"link": 63
},
{
"name": "background_image",
"type": "IMAGE",
"link": 62,
"shape": 7
},
{
"name": "layer_mask",
"type": "MASK",
"link": 64,
"shape": 7
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
65
],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "LayerStyle: DropShadow V3"
},
"widgets_values": [
false,
"normal",
50,
10,
10,
6,
16,
"#000000"
],
"color": "rgba(20, 95, 121, 0.7)"
},
{
"id": 10,
"type": "LayerMask: BiRefNetUltra",
"pos": [
-3822.2421875,
2542.404052734375
],
"size": [
277.20001220703125,
255.6139373779297
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 14
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [],
"slot_index": 0
},
{
"name": "mask",
"type": "MASK",
"links": [
23,
64
],
"slot_index": 1
}
],
"properties": {
"Node name for S&R": "LayerMask: BiRefNetUltra"
},
"widgets_values": [
"VITMatte",
6,
6,
0.01,
0.99,
true,
"cuda",
2
],
"color": "rgba(27, 80, 119, 0.7)"
},
{
"id": 14,
"type": "LayerUtility: ImageBlend V2",
"pos": [
-3049.285888671875,
2058.662353515625
],
"size": [
314.8190612792969,
146
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "background_image",
"type": "IMAGE",
"link": 45
},
{
"name": "layer_image",
"type": "IMAGE",
"link": 21
},
{
"name": "layer_mask",
"type": "MASK",
"link": 22,
"shape": 7
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
60
],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "LayerUtility: ImageBlend V2"
},
"widgets_values": [
false,
"color",
100
],
"color": "rgba(38, 73, 116, 0.7)"
},
{
"id": 12,
"type": "LayerUtility: ColorImage V2",
"pos": [
-3490.97900390625,
1946.5667724609375
],
"size": [
358.17816162109375,
130
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "size_as",
"type": "*",
"link": 25,
"shape": 7
},
{
"name": "color",
"type": "STRING",
"link": 66,
"widget": {
"name": "color"
}
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
21
],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "LayerUtility: ColorImage V2"
},
"widgets_values": [
"custom",
512,
512,
"#F284F0"
],
"color": "rgba(38, 73, 116, 0.7)"
},
{
"id": 27,
"type": "LayerUtility: ColorPicker",
"pos": [
-3836.872802734375,
1967.681640625
],
"size": [
210,
94
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "value",
"type": "STRING",
"links": [
66
],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "LayerUtility: ColorPicker"
},
"widgets_values": [
"#4f6fcf",
"HEX"
],
"color": "rgba(38, 73, 116, 0.7)"
},
{
"id": 13,
"type": "PreviewImage",
"pos": [
-1868.6793212890625,
2173.0986328125
],
"size": [
551.9151611328125,
378.61322021484375
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 65
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
}
],
"links": [
[
6,
2,
0,
6,
0,
"IMAGE"
],
[
14,
2,
0,
10,
0,
"IMAGE"
],
[
21,
12,
0,
14,
1,
"IMAGE"
],
[
22,
6,
1,
14,
2,
"MASK"
],
[
23,
10,
1,
6,
1,
"MASK"
],
[
25,
2,
0,
12,
0,
"*"
],
[
41,
6,
1,
20,
2,
"MASK"
],
[
45,
2,
0,
14,
0,
"IMAGE"
],
[
60,
14,
0,
20,
0,
"IMAGE"
],
[
62,
20,
0,
25,
1,
"IMAGE"
],
[
63,
2,
0,
25,
0,
"IMAGE"
],
[
64,
10,
1,
25,
2,
"MASK"
],
[
65,
25,
0,
13,
0,
"IMAGE"
],
[
66,
27,
0,
12,
1,
"STRING"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.6934334949441395,
"offset": [
4564.611247752034,
-1416.0628969763088
]
}
},
"version": 0.4
}