129 lines
4.0 KiB
Python
129 lines
4.0 KiB
Python
import os
|
|
|
|
import numpy as np
|
|
from PIL import Image
|
|
|
|
import folder_paths
|
|
|
|
|
|
TIP_PREFIX = (
|
|
"\u8f93\u51fa\u6587\u4ef6\u540d\u524d\u7f00\u3002"
|
|
"\u53ea\u5f71\u54cd\u6587\u4ef6\u540d\uff0c\u4e0d\u4f1a\u5199\u5165\u56fe\u7247\u5143\u6570\u636e\u3002"
|
|
)
|
|
TIP_FORMAT = (
|
|
"\u63a8\u8350\u4fdd\u6301 PNG\u3002PNG \u662f\u65e0\u635f\u683c\u5f0f\uff0c"
|
|
"\u4e0d\u4f1a\u538b\u7f29\u753b\u8d28\uff1bJPEG \u662f\u6709\u635f\u683c\u5f0f\uff0c"
|
|
"\u6587\u4ef6\u66f4\u5c0f\u4f46\u753b\u8d28\u53ef\u80fd\u4e0b\u964d\u3002"
|
|
)
|
|
TIP_PNG_LEVEL = (
|
|
"\u63a8\u8350\u4fdd\u6301\u9ed8\u8ba4 4\u3002PNG \u538b\u7f29\u7b49\u7ea7"
|
|
"\u53ea\u5f71\u54cd\u6587\u4ef6\u5927\u5c0f\u548c\u4fdd\u5b58\u901f\u5ea6\uff0c"
|
|
"\u4e0d\u5f71\u54cd\u753b\u8d28\u30020 \u6700\u5feb\u4f46\u6587\u4ef6\u6700\u5927\uff1b"
|
|
"9 \u6587\u4ef6\u6700\u5c0f\u4f46\u4fdd\u5b58\u66f4\u6162\u3002"
|
|
)
|
|
TIP_JPEG_QUALITY = (
|
|
"\u63a8\u8350 100\u3002JPEG \u672c\u8eab\u662f\u6709\u635f\u683c\u5f0f\uff0c"
|
|
"\u6570\u503c\u8d8a\u9ad8\u8d8a\u63a5\u8fd1\u539f\u56fe\u4f46\u6587\u4ef6\u8d8a\u5927\uff1b"
|
|
"\u6570\u503c\u8d8a\u4f4e\u6587\u4ef6\u8d8a\u5c0f\uff0c\u538b\u7f29\u75d5\u8ff9\u8d8a\u660e\u663e\u3002"
|
|
)
|
|
|
|
|
|
class SaveImageWithoutMetadata:
|
|
def __init__(self):
|
|
self.output_dir = folder_paths.get_output_directory()
|
|
self.type = "output"
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"images": ("IMAGE",),
|
|
"filename_prefix": (
|
|
"STRING",
|
|
{"default": "NoMetadata", "tooltip": TIP_PREFIX},
|
|
),
|
|
"format": (
|
|
["PNG", "JPEG"],
|
|
{"default": "PNG", "tooltip": TIP_FORMAT},
|
|
),
|
|
"png_compress_level": (
|
|
"INT",
|
|
{
|
|
"default": 4,
|
|
"min": 0,
|
|
"max": 9,
|
|
"step": 1,
|
|
"tooltip": TIP_PNG_LEVEL,
|
|
},
|
|
),
|
|
"jpeg_quality": (
|
|
"INT",
|
|
{
|
|
"default": 100,
|
|
"min": 1,
|
|
"max": 100,
|
|
"step": 1,
|
|
"tooltip": TIP_JPEG_QUALITY,
|
|
},
|
|
),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ()
|
|
FUNCTION = "save_images"
|
|
OUTPUT_NODE = True
|
|
CATEGORY = "image"
|
|
DESCRIPTION = "Save images without ComfyUI prompt/workflow metadata."
|
|
|
|
def save_images(
|
|
self,
|
|
images,
|
|
filename_prefix="NoMetadata",
|
|
format="PNG",
|
|
png_compress_level=4,
|
|
jpeg_quality=100,
|
|
):
|
|
if len(images) == 0:
|
|
return {"ui": {"images": []}}
|
|
|
|
image_format = format.upper()
|
|
extension = "png" if image_format == "PNG" else "jpg"
|
|
|
|
full_output_folder, filename, counter, subfolder, filename_prefix = (
|
|
folder_paths.get_save_image_path(
|
|
filename_prefix,
|
|
self.output_dir,
|
|
images[0].shape[1],
|
|
images[0].shape[0],
|
|
)
|
|
)
|
|
|
|
results = []
|
|
for image in images:
|
|
array = 255.0 * image.cpu().numpy()
|
|
img = Image.fromarray(np.clip(array, 0, 255).astype(np.uint8))
|
|
|
|
file = f"{filename}_{counter:05}_.{extension}"
|
|
path = os.path.join(full_output_folder, file)
|
|
|
|
if image_format == "PNG":
|
|
img.save(path, compress_level=png_compress_level)
|
|
else:
|
|
if img.mode != "RGB":
|
|
img = img.convert("RGB")
|
|
img.save(path, format="JPEG", quality=jpeg_quality)
|
|
|
|
results.append({"filename": file, "subfolder": subfolder, "type": self.type})
|
|
counter += 1
|
|
|
|
return {"ui": {"images": results}}
|
|
|
|
|
|
NODE_CLASS_MAPPINGS = {
|
|
"SaveImageWithoutMetadata": SaveImageWithoutMetadata,
|
|
}
|
|
|
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
|
"SaveImageWithoutMetadata": "Save Image Without Metadata",
|
|
}
|