Files
Gin3601-LLS-node/tests/test_image_composite_node.py
2026-05-25 11:15:13 +08:00

205 lines
6.7 KiB
Python

import unittest
try:
from .test_image_composite_helpers import (
HAS_IMAGE_COMPOSITE_RUNTIME_DEPS,
IMAGE_COMPOSITE_RUNTIME_DEPS_MESSAGE,
load_plugin_package,
make_image,
)
except ImportError:
from test_image_composite_helpers import (
HAS_IMAGE_COMPOSITE_RUNTIME_DEPS,
IMAGE_COMPOSITE_RUNTIME_DEPS_MESSAGE,
load_plugin_package,
make_image,
)
@unittest.skipUnless(HAS_IMAGE_COMPOSITE_RUNTIME_DEPS, IMAGE_COMPOSITE_RUNTIME_DEPS_MESSAGE)
class TestImageCompositeNode(unittest.TestCase):
@classmethod
def setUpClass(cls):
plugin = load_plugin_package()
cls.node = plugin.NODE_CLASS_MAPPINGS["LLSSimpleImageComposite"]()
def test_top_left_offset_places_overlay_at_requested_position(self):
background = make_image(width=6, height=6, color=(0.0, 0.0, 0.0))
overlay = make_image(width=2, height=2, color=(1.0, 1.0, 1.0))
(output_image,) = self.node.composite(
background_image=background,
overlay_image=overlay,
x_offset=3,
y_offset=1,
anchor_mode="top_left",
rotation_origin_mode="center",
opacity=1.0,
blend_mode="normal",
scale=1.0,
rotation=0.0,
keep_aspect=True,
)
self.assertEqual(tuple(output_image.shape), (1, 6, 6, 3))
self.assertTrue((output_image[0, 1:3, 3:5] > 0.99).all().item())
self.assertEqual(float(output_image[0, 0, 0, 0].item()), 0.0)
def test_center_anchor_places_overlay_by_its_center(self):
background = make_image(width=6, height=6, color=(0.0, 0.0, 0.0))
overlay = make_image(width=2, height=2, color=(0.0, 1.0, 0.0))
(output_image,) = self.node.composite(
background_image=background,
overlay_image=overlay,
x_offset=3,
y_offset=2,
anchor_mode="center",
rotation_origin_mode="center",
opacity=1.0,
blend_mode="normal",
scale=1.0,
rotation=0.0,
keep_aspect=True,
)
self.assertTrue((output_image[0, 1:3, 2:4, 1] > 0.99).all().item())
def test_partial_overflow_is_clipped_to_background_bounds(self):
background = make_image(width=5, height=5, color=(0.0, 0.0, 0.0))
overlay = make_image(width=3, height=3, color=(1.0, 0.0, 0.0))
(output_image,) = self.node.composite(
background_image=background,
overlay_image=overlay,
x_offset=4,
y_offset=4,
anchor_mode="top_left",
rotation_origin_mode="center",
opacity=1.0,
blend_mode="normal",
scale=1.0,
rotation=0.0,
keep_aspect=True,
)
self.assertGreater(float(output_image[0, 4, 4, 0].item()), 0.99)
self.assertEqual(float(output_image[0, 0, 0, 0].item()), 0.0)
def test_overlay_fully_outside_returns_background(self):
background = make_image(width=5, height=5, color=(0.1, 0.1, 0.1))
overlay = make_image(width=2, height=2, color=(1.0, 1.0, 1.0))
(output_image,) = self.node.composite(
background_image=background,
overlay_image=overlay,
x_offset=8,
y_offset=8,
anchor_mode="top_left",
rotation_origin_mode="center",
opacity=1.0,
blend_mode="normal",
scale=1.0,
rotation=0.0,
keep_aspect=True,
)
self.assertTrue((output_image == background).all().item())
def test_opacity_zero_returns_background(self):
background = make_image(width=4, height=4, color=(0.2, 0.2, 0.2))
overlay = make_image(width=2, height=2, color=(1.0, 0.0, 0.0))
(output_image,) = self.node.composite(
background_image=background,
overlay_image=overlay,
x_offset=1,
y_offset=1,
anchor_mode="top_left",
rotation_origin_mode="center",
opacity=0.0,
blend_mode="normal",
scale=1.0,
rotation=0.0,
keep_aspect=True,
)
self.assertTrue((output_image == background).all().item())
def test_rgba_overlay_uses_alpha_and_opacity(self):
background = make_image(width=4, height=4, color=(0.0, 0.0, 0.0))
overlay = make_image(width=2, height=2, color=(1.0, 0.0, 0.0), alpha=0.5)
(output_image,) = self.node.composite(
background_image=background,
overlay_image=overlay,
x_offset=1,
y_offset=1,
anchor_mode="top_left",
rotation_origin_mode="center",
opacity=0.5,
blend_mode="normal",
scale=1.0,
rotation=0.0,
keep_aspect=True,
)
self.assertAlmostEqual(float(output_image[0, 1, 1, 0].item()), 0.25, places=2)
def test_scale_expands_overlay_footprint(self):
background = make_image(width=5, height=5, color=(0.0, 0.0, 0.0))
overlay = make_image(width=1, height=1, color=(1.0, 1.0, 1.0))
(output_image,) = self.node.composite(
background_image=background,
overlay_image=overlay,
x_offset=1,
y_offset=1,
anchor_mode="top_left",
rotation_origin_mode="center",
opacity=1.0,
blend_mode="normal",
scale=2.0,
rotation=0.0,
keep_aspect=True,
)
self.assertTrue((output_image[0, 1:3, 1:3] > 0.99).all().item())
def test_rotation_origin_mode_changes_rotated_result(self):
background = make_image(width=8, height=8, color=(0.0, 0.0, 0.0))
overlay = make_image(width=3, height=1, color=(0.0, 0.0, 1.0))
(center_rotated,) = self.node.composite(
background_image=background,
overlay_image=overlay,
x_offset=3,
y_offset=3,
anchor_mode="top_left",
rotation_origin_mode="center",
opacity=1.0,
blend_mode="normal",
scale=1.0,
rotation=90.0,
keep_aspect=True,
)
(corner_rotated,) = self.node.composite(
background_image=background,
overlay_image=overlay,
x_offset=3,
y_offset=3,
anchor_mode="top_left",
rotation_origin_mode="top_left",
opacity=1.0,
blend_mode="normal",
scale=1.0,
rotation=90.0,
keep_aspect=True,
)
self.assertFalse((center_rotated == corner_rotated).all().item())
if __name__ == "__main__":
unittest.main()