mirror of
https://git.datalinker.icu/kijai/ComfyUI-KJNodes.git
synced 2025-12-23 11:44:34 +08:00
Add CrossFadeImages -node
This commit is contained in:
parent
ec5adf5f62
commit
432301313f
81
nodes.py
81
nodes.py
@ -9,7 +9,7 @@ import librosa
|
|||||||
from scipy.special import erf
|
from scipy.special import erf
|
||||||
from .fluid import Fluid
|
from .fluid import Fluid
|
||||||
import comfy.model_management
|
import comfy.model_management
|
||||||
|
import math
|
||||||
from nodes import MAX_RESOLUTION
|
from nodes import MAX_RESOLUTION
|
||||||
|
|
||||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
@ -266,6 +266,83 @@ class CreateFadeMask:
|
|||||||
return (1.0 - torch.cat(out, dim=0),)
|
return (1.0 - torch.cat(out, dim=0),)
|
||||||
return (torch.cat(out, dim=0),)
|
return (torch.cat(out, dim=0),)
|
||||||
|
|
||||||
|
class CrossFadeImages:
|
||||||
|
|
||||||
|
RETURN_TYPES = ("IMAGE",)
|
||||||
|
FUNCTION = "crossfadeimages"
|
||||||
|
CATEGORY = "KJNodes"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def INPUT_TYPES(s):
|
||||||
|
return {
|
||||||
|
"required": {
|
||||||
|
"images_1": ("IMAGE",),
|
||||||
|
"images_2": ("IMAGE",),
|
||||||
|
"interpolation": (["linear", "ease_in", "ease_out", "ease_in_out", "bounce", "elastic", "glitchy", "exponential_ease_out"],),
|
||||||
|
"transition_start_index": ("INT", {"default": 1,"min": 0, "max": 4096, "step": 1}),
|
||||||
|
"transitioning_frames": ("INT", {"default": 1,"min": 0, "max": 4096, "step": 1}),
|
||||||
|
"start_level": ("FLOAT", {"default": 1.0,"min": 0.0, "max": 1.0, "step": 0.01}),
|
||||||
|
"end_level": ("FLOAT", {"default": 0.0,"min": 0.0, "max": 1.0, "step": 0.01}),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
def crossfadeimages(self, images_1, images_2, transition_start_index, transitioning_frames, interpolation, start_level, end_level):
|
||||||
|
|
||||||
|
def crossfade(images_1, images_2, alpha):
|
||||||
|
crossfade = (1 - alpha) * images_1 + alpha * images_2
|
||||||
|
return crossfade
|
||||||
|
def ease_in(t):
|
||||||
|
return t * t
|
||||||
|
def ease_out(t):
|
||||||
|
return 1 - (1 - t) * (1 - t)
|
||||||
|
def ease_in_out(t):
|
||||||
|
return 3 * t * t - 2 * t * t * t
|
||||||
|
def bounce(t):
|
||||||
|
if t < 0.5:
|
||||||
|
return self.ease_out(t * 2) * 0.5
|
||||||
|
else:
|
||||||
|
return self.ease_in((t - 0.5) * 2) * 0.5 + 0.5
|
||||||
|
def elastic(t):
|
||||||
|
return math.sin(13 * math.pi / 2 * t) * math.pow(2, 10 * (t - 1))
|
||||||
|
def glitchy(t):
|
||||||
|
return t + 0.1 * math.sin(40 * t)
|
||||||
|
def exponential_ease_out(t):
|
||||||
|
return 1 - (1 - t) ** 4
|
||||||
|
|
||||||
|
easing_functions = {
|
||||||
|
"linear": lambda t: t,
|
||||||
|
"ease_in": ease_in,
|
||||||
|
"ease_out": ease_out,
|
||||||
|
"ease_in_out": ease_in_out,
|
||||||
|
"bounce": bounce,
|
||||||
|
"elastic": elastic,
|
||||||
|
"glitchy": glitchy,
|
||||||
|
"exponential_ease_out": exponential_ease_out,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
batch_size = images_1.size(0)
|
||||||
|
crossfade_images = []
|
||||||
|
#transition_frame_length = int(batch_size / transitioning_frames)
|
||||||
|
|
||||||
|
alphas = torch.linspace(start_level, end_level, batch_size)
|
||||||
|
for i in range(batch_size):
|
||||||
|
alpha = alphas[i]
|
||||||
|
image1 = images_1[i]
|
||||||
|
image2 = images_2[i]
|
||||||
|
easing_function = easing_functions.get(interpolation)
|
||||||
|
if i >= transition_start_index and i < transition_start_index + transitioning_frames:
|
||||||
|
# Apply transition effect within the transition frame length
|
||||||
|
transition_alpha = (i - transition_start_index) / transitioning_frames
|
||||||
|
alpha = easing_function(transition_alpha) # Apply the easing function to the alpha value
|
||||||
|
else:
|
||||||
|
alpha = end_level if i < transition_start_index else start_level
|
||||||
|
|
||||||
|
crossfade_image = crossfade(image1, image2, alpha)
|
||||||
|
crossfade_images.append(crossfade_image)
|
||||||
|
|
||||||
|
return (torch.stack(crossfade_images, dim=0),)
|
||||||
|
|
||||||
class CreateTextMask:
|
class CreateTextMask:
|
||||||
|
|
||||||
RETURN_TYPES = ("IMAGE", "MASK",)
|
RETURN_TYPES = ("IMAGE", "MASK",)
|
||||||
@ -764,6 +841,7 @@ NODE_CLASS_MAPPINGS = {
|
|||||||
"CreateFadeMask": CreateFadeMask,
|
"CreateFadeMask": CreateFadeMask,
|
||||||
"CreateFluidMask" :CreateFluidMask,
|
"CreateFluidMask" :CreateFluidMask,
|
||||||
"VRAM_Debug" : VRAM_Debug,
|
"VRAM_Debug" : VRAM_Debug,
|
||||||
|
"CrossFadeImages": CrossFadeImages
|
||||||
}
|
}
|
||||||
NODE_DISPLAY_NAME_MAPPINGS = {
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
||||||
"INTConstant": "INT Constant",
|
"INTConstant": "INT Constant",
|
||||||
@ -779,4 +857,5 @@ NODE_DISPLAY_NAME_MAPPINGS = {
|
|||||||
"CreateFadeMask" : "CreateFadeMask",
|
"CreateFadeMask" : "CreateFadeMask",
|
||||||
"CreateFluidMask" : "CreateFluidMask",
|
"CreateFluidMask" : "CreateFluidMask",
|
||||||
"VRAM_Debug" : "VRAM Debug",
|
"VRAM_Debug" : "VRAM Debug",
|
||||||
|
"CrossFadeImages": "CrossFadeImages"
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user