diff --git a/__init__.py b/__init__.py index 023a604..064c6da 100644 --- a/__init__.py +++ b/__init__.py @@ -592,7 +592,7 @@ async def post_prompt_result(request): # 导入节点 from .nodes.PromptNode import GLIGENTextBoxApply_Advanced,EmbeddingPrompt,RandomPrompt,PromptSlide,PromptSimplification,PromptImage,JoinWithDelimiter -from .nodes.ImageNode import GridDisplayAndSave,GridInput,ImagesPrompt,SaveImageAndMetadata,SaveImageToLocal,SplitImage,GridOutput,GetImageSize_,MirroredImage,ImageColorTransfer,NoiseImage,TransparentImage,GradientImage,LoadImagesFromPath,LoadImagesFromURL,ResizeImage,TextImage,SvgImage,Image3D,ShowLayer,NewLayer,MergeLayers,CenterImage,AreaToMask,SmoothMask,SplitLongMask,ImageCropByAlpha,EnhanceImage,FaceToMask +from .nodes.ImageNode import CompositeImages,GridDisplayAndSave,GridInput,ImagesPrompt,SaveImageAndMetadata,SaveImageToLocal,SplitImage,GridOutput,GetImageSize_,MirroredImage,ImageColorTransfer,NoiseImage,TransparentImage,GradientImage,LoadImagesFromPath,LoadImagesFromURL,ResizeImage,TextImage,SvgImage,Image3D,ShowLayer,NewLayer,MergeLayers,CenterImage,AreaToMask,SmoothMask,SplitLongMask,ImageCropByAlpha,EnhanceImage,FaceToMask # from .nodes.Vae import VAELoader,VAEDecode from .nodes.ScreenShareNode import ScreenShareNode,FloatingVideo @@ -633,6 +633,7 @@ NODE_CLASS_MAPPINGS = { "ImageColorTransfer":ImageColorTransfer, "ShowLayer":ShowLayer, "NewLayer":NewLayer, + "CompositeImages_":CompositeImages, "SplitImage":SplitImage, "CenterImage":CenterImage, "GridOutput":GridOutput, @@ -711,6 +712,7 @@ NODE_DISPLAY_NAME_MAPPINGS = { "SpeechSynthesis":"SpeechSynthesis ♾️Mixlab", "SpeechRecognition":"SpeechRecognition ♾️Mixlab", "3DImage":"3DImage ♾️Mixlab", + "CompositeImages_":"Composite Images", "DynamicDelayProcessor":"DynamicDelayByText ♾️Mixlab", "LaMaInpainting":"LaMaInpainting ♾️Mixlab", "PromptSlide":"Prompt Slide ♾️Mixlab", diff --git a/nodes/ImageNode.py b/nodes/ImageNode.py index a4bccaa..94e6508 100644 --- a/nodes/ImageNode.py +++ b/nodes/ImageNode.py @@ -15,6 +15,42 @@ import math,glob from .Watcher import FolderWatcher +def composite_images(foreground, background, mask): + width,height=foreground.size + + bg_image=background + # 按z-index排序 + layer = { + "x":0, + "y":0, + "width":width, + "height":height, + "z_index":88, + "scale_option":'overall', + "image":foreground, + "mask":mask + } + + width, height = bg_image.size + + layer_image=layer['image'] + layer_mask=layer['mask'] + + bg_image=merge_images(bg_image, + layer_image, + layer_mask, + layer['x'], + layer['y'], + layer['width'], + layer['height'], + layer['scale_option'] + ) + + bg_image=bg_image.convert('RGB') + + return bg_image + + def count_files_in_directory(directory): file_count = 0 for _, _, files in os.walk(directory): @@ -1541,6 +1577,37 @@ class FaceToMask: return (mask,) +class CompositeImages: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "foreground": ("IMAGE",), + "mask":("MASK",), + "background": ("IMAGE",), + }, + } + + RETURN_TYPES = ("IMAGE",) + RETURN_NAMES = ("IMAGE",) + + FUNCTION = "run" + + CATEGORY = "♾️Mixlab/Layer" + + # OUTPUT_IS_LIST = (True,) + + def run(self, foreground,mask,background): + foreground= tensor2pil(foreground) + mask= tensor2pil(mask) + background= tensor2pil(background) + res=composite_images(foreground,background,mask) + + return (pil2tensor(res),) + + + + class EmptyLayer: @classmethod def INPUT_TYPES(s): @@ -2057,6 +2124,9 @@ class GridOutput: x,y,w,h=grid return (x,y,w,h,) + + + class ShowLayer: @classmethod def INPUT_TYPES(s):