This repository has been archived by the owner on May 11, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathsave_image.py
99 lines (82 loc) · 3.27 KB
/
save_image.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
from comfy.cli_args import args
import folder_paths
import json
import numpy
import os
from PIL import Image, ExifTags
from PIL.PngImagePlugin import PngInfo
class SaveImageExtended:
def __init__(self):
pass
FILE_TYPE_PNG = "PNG"
FILE_TYPE_JPEG = "JPEG"
FILE_TYPE_WEBP_LOSSLESS = "WEBP (lossless)"
FILE_TYPE_WEBP_LOSSY = "WEBP (lossy)"
RETURN_TYPES = ()
FUNCTION = "save_images"
OUTPUT_NODE = True
CATEGORY = "image"
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"images": ("IMAGE", ),
"filename_prefix": ("STRING", {"default": "ComfyUI"}),
"file_type": ([s.FILE_TYPE_PNG, s.FILE_TYPE_JPEG, s.FILE_TYPE_WEBP_LOSSLESS, s.FILE_TYPE_WEBP_LOSSY], ),
},
"hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"},
}
def save_images(self, images, filename_prefix="ComfyUI", file_type=FILE_TYPE_PNG, prompt=None, extra_pnginfo=None):
output_dir = folder_paths.get_output_directory()
full_output_folder, filename, counter, subfolder, _ = folder_paths.get_save_image_path(filename_prefix, output_dir, images[0].shape[1], images[0].shape[0])
extension = {
self.FILE_TYPE_PNG: "png",
self.FILE_TYPE_JPEG: "jpg",
self.FILE_TYPE_WEBP_LOSSLESS: "webp",
self.FILE_TYPE_WEBP_LOSSY: "webp",
}.get(file_type, "png")
results = []
for image in images:
array = 255. * image.cpu().numpy()
img = Image.fromarray(numpy.clip(array, 0, 255).astype(numpy.uint8))
kwargs = dict()
if extension == "png":
kwargs["compress_level"] = 4
if not args.disable_metadata:
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]))
kwargs["pnginfo"] = metadata
else:
if file_type == self.FILE_TYPE_WEBP_LOSSLESS:
kwargs["lossless"] = True
else:
kwargs["quality"] = 90
if not args.disable_metadata:
metadata = {}
if prompt is not None:
metadata["prompt"] = prompt
if extra_pnginfo is not None:
metadata.update(extra_pnginfo)
exif = img.getexif()
exif[ExifTags.Base.UserComment] = json.dumps(metadata)
kwargs["exif"] = exif.tobytes()
file = f"{filename}_{counter:05}_.{extension}"
img.save(os.path.join(full_output_folder, file), **kwargs)
results.append({
"filename": file,
"subfolder": subfolder,
"type": "output",
})
counter += 1
return { "ui": { "images": results } }
NODE_CLASS_MAPPINGS = {
"SaveImageExtended": SaveImageExtended
}
NODE_DISPLAY_NAME_MAPPINGS = {
"SaveImageExtended": "Save Image (Extended)"
}
WEB_DIRECTORY = "web"