139 lines
4.5 KiB
Markdown
139 lines
4.5 KiB
Markdown
|
|
# Documentation
|
|
- Class name: ImageCompositeRelativeByContainer
|
|
- Category: image/composite
|
|
- Output node: False
|
|
|
|
ImageCompositeRelativeByContainer节点用于创建复合图像,通过相对于容器尺寸来定位和合并两组图像。它根据容器的大小和指定的相对位置动态计算图像的放置位置,确保在按照指定方法合并图像之前,图像被适当地缩放和定位。
|
|
|
|
# Input types
|
|
## Required
|
|
- container
|
|
- 作为参考的容器图像,用于缩放和定位其他图像。它的尺寸决定了其他图像如何调整和放置。
|
|
- Comfy dtype: IMAGE
|
|
- Python dtype: numpy.ndarray
|
|
- images_a
|
|
- 要合成的第一组图像。这些图像会根据容器的尺寸进行调整和定位。
|
|
- Comfy dtype: IMAGE
|
|
- Python dtype: numpy.ndarray
|
|
- images_b
|
|
- 要合成的第二组图像。这些图像也会根据容器的尺寸进行调整和定位,与第一组图像类似。
|
|
- Comfy dtype: IMAGE
|
|
- Python dtype: numpy.ndarray
|
|
- images_a_x
|
|
- 第一组图像在容器内的相对水平位置(百分比)。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- images_a_y
|
|
- 第一组图像在容器内的相对垂直位置(百分比)。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- images_b_x
|
|
- 第二组图像在容器内的相对水平位置(百分比)。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- images_b_y
|
|
- 第二组图像在容器内的相对垂直位置(百分比)。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- background
|
|
- 指定哪组图像('images_a'或'images_b')应作为最终合成图像的背景。
|
|
- Comfy dtype: COMBO[STRING]
|
|
- Python dtype: str
|
|
- method
|
|
- 用于合成图像的方法,可能会影响合并结果的外观。
|
|
- Comfy dtype: COMBO[STRING]
|
|
- Python dtype: str
|
|
|
|
# Output types
|
|
- image
|
|
- 最终的合成图像,是根据容器尺寸合并和定位两组图像的结果。
|
|
- Comfy dtype: IMAGE
|
|
- Python dtype: numpy.ndarray
|
|
|
|
## Usage tips
|
|
- Infra type: `CPU`
|
|
- Common nodes: unknown
|
|
|
|
|
|
## Source code
|
|
```python
|
|
class ImageCompositeRelativeByContainer:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"container": ("IMAGE",),
|
|
"images_a": ("IMAGE",),
|
|
"images_b": ("IMAGE",),
|
|
"images_a_x": ("FLOAT", {
|
|
"default": 0.0,
|
|
"max": 1.0,
|
|
"step": 0.01
|
|
}),
|
|
"images_a_y": ("FLOAT", {
|
|
"default": 0.0,
|
|
"max": 1.0,
|
|
"step": 0.01
|
|
}),
|
|
"images_b_x": ("FLOAT", {
|
|
"default": 0.0,
|
|
"max": 1.0,
|
|
"step": 0.01
|
|
}),
|
|
"images_b_y": ("FLOAT", {
|
|
"default": 0.0,
|
|
"max": 1.0,
|
|
"step": 0.01
|
|
}),
|
|
"background": (["images_a", "images_b"],),
|
|
"method": (["pair", "matrix"],),
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = ("IMAGE",)
|
|
FUNCTION = "node"
|
|
CATEGORY = "image/composite"
|
|
|
|
def node(
|
|
self,
|
|
container,
|
|
images_a,
|
|
images_b,
|
|
images_a_x,
|
|
images_a_y,
|
|
images_b_x,
|
|
images_b_y,
|
|
background,
|
|
method
|
|
):
|
|
def offset_by_percent(container_size: int, image_size: int, percent: float):
|
|
return int((container_size - image_size) * percent)
|
|
|
|
img_a_height, img_a_width = images_a[0, :, :, 0].shape
|
|
img_b_height, img_b_width = images_b[0, :, :, 0].shape
|
|
|
|
container_width = container[0, :, :, 0].shape[1]
|
|
container_height = container[0, :, :, 0].shape[0]
|
|
|
|
if container_width < max(img_a_width, img_b_width) or container_height < max(img_a_height, img_b_height):
|
|
raise ValueError("Container can't be smaller then max width or height of images.")
|
|
|
|
return ImageCompositeAbsolute().node(
|
|
images_a,
|
|
images_b,
|
|
offset_by_percent(container_width, img_a_width, images_a_x),
|
|
offset_by_percent(container_height, img_a_height, images_a_y),
|
|
offset_by_percent(container_width, img_b_width, images_b_x),
|
|
offset_by_percent(container_height, img_b_height, images_b_y),
|
|
container_width,
|
|
container_height,
|
|
background,
|
|
method
|
|
)
|
|
|
|
```
|