-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathimage_filename.py
136 lines (115 loc) · 4.53 KB
/
image_filename.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
from folder_paths import base_path
import os, torch, json
from PIL import Image, ImageOps
from PIL.PngImagePlugin import PngInfo
import numpy as np
import hashlib
from nodes import SaveImage
from comfy.cli_args import args
import folder_paths
class SaveFilename(SaveImage):
CATEGORY = "quicknodes/images"
RETURN_TYPES = ("STRING",)
RETURN_NAME = ("filepath",)
FUNCTION = "func"
def func(self, **kwargs):
ret = self.save_images(**kwargs)
outfile = ret['ui']['images'][0]
directory = folder_paths.get_output_directory()
if 'subfolder' in outfile and outfile['subfolder']: directory = os.path.join(directory, outfile['subfolder'])
ret['result'] = ( os.path.join(directory, outfile['filename']), )
return ret
class SaveTextfile:
CATEGORY = "quicknodes/images"
RETURN_TYPES = ()
FUNCTION = "func"
OUTPUT_NODE = True
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"text": ("STRING", {"default": ""}),
"filepath": ("STRING", {"default": "output", "tooltip": "The filepath, extension will be changed to .txt."}),
}
}
def func(self, text, filepath):
filepath = os.path.splitext(filepath)[0]+".txt"
with open(filepath, 'w', encoding="utf-8") as f:
print(text, file=f)
return ()
class SaveImageExplicitPath:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"images": ("IMAGE", {"tooltip": "The images to save."}),
"filepath": ("STRING", {"default": "output", "tooltip": "The full path of the file. _XXXXX will be appended."}),
"compress": ("INT", {"default":4, "min":0, "max":9})
},
"hidden": {
"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"
},
}
RETURN_TYPES = ()
FUNCTION = "save_images"
OUTPUT_NODE = True
CATEGORY = "quicknodes"
def save_images(self, images, filepath, compress, prompt=None, extra_pnginfo=None):
basepath, extension = os.path.splitext(filepath)
extension = extension or ".png"
digit = 0
for image in images:
i = 255. * image.cpu().numpy()
img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
metadata = None
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]))
digit = "00000"
while os.path.exists( f"{basepath}_{digit}{extension}" ):
d = int(digit)
digit = "{:0>5}".format(d+1)
save_path = f"{basepath}_{digit}{extension}"
img.save(save_path, pnginfo=metadata, compress_level=compress)
return ()
'''
class LoadImageWithFilename():
RETURN_TYPES = ("IMAGE", "MASK", "STRING",)
RETURN_NAMES = ("IMAGE", "MASK", "filepath",)
FUNCTION = "func"
directory = os.path.join(base_path,"styles")
@classmethod
def INPUT_TYPES(cls):
files = [f for f in os.listdir(cls.directory) if os.path.isfile(os.path.join(cls.directory, f))]
return {"required": {"image": (sorted(files), {"image_upload": True})}, }
CATEGORY = "quicknodes/images"
def func(self, image):
image_path = os.path.join(self.directory,image)
i = Image.open(image_path)
i = ImageOps.exif_transpose(i)
image = i.convert("RGB")
image = np.array(image).astype(np.float32) / 255.0
image = torch.from_numpy(image)[None,]
if 'A' in i.getbands():
mask = np.array(i.getchannel('A')).astype(np.float32) / 255.0
mask = 1. - torch.from_numpy(mask)
else:
mask = torch.zeros((64,64), dtype=torch.float32, device="cpu")
return (image, mask.unsqueeze(0), image)
@classmethod
def IS_CHANGED(cls, image):
image_path = os.path.join(cls.directory,image)
m = hashlib.sha256()
with open(image_path, 'rb') as f:
m.update(f.read())
return m.digest().hex()
@classmethod
def VALIDATE_INPUTS(cls, image):
return True if os.path.exists( os.path.join(cls.directory,image) ) else "Invalid image file: {}".format(image)
'''
CLAZZES = [SaveImageExplicitPath, SaveFilename, SaveTextfile]
#LoadImageWithFilename,