| | from PIL import Image |
| | from PIL.PngImagePlugin import PngInfo |
| | import numpy as np |
| | import json |
| | import re |
| |
|
| | import time |
| |
|
| | import os |
| | if __name__ == os.path.splitext(os.path.basename(__file__))[0] : |
| | from ConsoleColor import print, console |
| | from mypath import * |
| | else: |
| | from .ConsoleColor import print, console |
| | from .mypath import * |
| | |
| | |
| |
|
| |
|
| | class SaveImageSimple: |
| | def __init__(self): |
| | self.type = "output" |
| | |
| | @classmethod |
| | def INPUT_TYPES(s): |
| | return { |
| | "required": { |
| | "images": ("IMAGE", ), |
| | "filename_prefix": ("STRING", {"default": ""}) |
| | }, |
| | "hidden": { |
| | "prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO" |
| | }, |
| | } |
| | RETURN_TYPES = () |
| | FUNCTION = "save_images" |
| |
|
| | OUTPUT_NODE = True |
| |
|
| | CATEGORY = "image" |
| |
|
| | def save_images(self, images, filename_prefix="", prompt=None, extra_pnginfo=None): |
| |
|
| | outputdir=os.path.join(mainfolder, "output") |
| | |
| |
|
| | |
| | filename_prefix=re.sub(r"[*]", "",filename_prefix) |
| | filename_prefix+=time.strftime('_%Y%m%d_%H%M%S') |
| | results = list() |
| | cnt=1 |
| | for image in images : |
| | i = 255. * image.cpu().numpy() |
| | img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8)) |
| | metadata = PngInfo() |
| | if prompt is not None: |
| | metadata.add_text("prompt", json.dumps(prompt)) |
| | if extra_pnginfo is not None: |
| | |
| | for x in extra_pnginfo: |
| | metadata.add_text(x, json.dumps(extra_pnginfo[x])) |
| | if not os.path.exists(outputdir): |
| | print("makedirs : " + outputdir ) |
| | os.makedirs(outputdir) |
| | filename=filename_prefix+f"_{cnt:05}_.png" |
| | filename=os.path.join(outputdir, filename) |
| | img.save(filename, pnginfo=metadata, optimize=True) |
| | results.append({ |
| | "filename": filename, |
| | "subfolder": subfolder, |
| | "type": self.type |
| | }); |
| | cnt+=1 |
| | |
| | return { "ui": { "images": results } } |