from PIL import Image, ImageOps from io import BytesIO import numpy as np import struct import comfy.utils import time #You can use this node to save full size images through the websocket, the #images will be sent in exactly the same format as the image previews: as #binary images on the websocket with a 8 byte header indicating the type #of binary message (first 4 bytes) and the image format (next 4 bytes). #The reason this node is disabled by default is because there is a small #issue when using it with the default ComfyUI web interface: When generating #batches only the last image will be shown in the UI. #Note that no metadata will be put in the images saved with this node. class SaveImageWebsocket: @classmethod def INPUT_TYPES(s): return {"required": {"images": ("IMAGE", ),} } RETURN_TYPES = () FUNCTION = "save_images" OUTPUT_NODE = True CATEGORY = "image" def save_images(self, images): pbar = comfy.utils.ProgressBar(images.shape[0]) step = 0 for image in images: i = 255. * image.cpu().numpy() img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8)) pbar.update_absolute(step, images.shape[0], ("PNG", img, None)) step += 1 return {} def IS_CHANGED(s, images): return time.time() NODE_CLASS_MAPPINGS = { "SaveImageWebsocket": SaveImageWebsocket, }