apply latent_to_rgb for default preview

apply optimize for png
attach format text for preview
This commit is contained in:
Dr.Lt.Data 2023-05-19 23:51:59 +09:00
parent 448208e494
commit 1ff09e5541
4 changed files with 67 additions and 9 deletions

View File

@ -1,5 +1,6 @@
import torch import torch
import math import math
from PIL import Image
def load_torch_file(ckpt, safe_load=False): def load_torch_file(ckpt, safe_load=False):
if ckpt.lower().endswith(".safetensors"): if ckpt.lower().endswith(".safetensors"):
@ -117,3 +118,20 @@ class ProgressBar:
def update(self, value): def update(self, value):
self.update_absolute(self.current + value) self.update_absolute(self.current + value)
def latent_to_rgb(latent_tensor):
latent_rgb_factors = torch.tensor([
# R G B
[0.298, 0.207, 0.208], # L1
[0.187, 0.286, 0.173], # L2
[-0.158, 0.189, 0.264], # L3
[-0.184, -0.271, -0.473], # L4
], device="cpu")
rgb = torch.einsum('...lhw,lr -> ...rhw', latent_tensor.cpu().float(), latent_rgb_factors)
tensor = (((rgb + 1) / 2)
.clamp(0, 1) # change scale from -1..1 to 0..1
.mul(0xFF) # to 0..255
.byte())
return Image.fromarray(tensor.movedim(1, -1)[0].cpu().numpy())

BIN
logo.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

BIN
misc/latent.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -8,7 +8,7 @@ import traceback
import math import math
import time import time
from PIL import Image from PIL import Image, ImageDraw
from PIL.PngImagePlugin import PngInfo from PIL.PngImagePlugin import PngInfo
import numpy as np import numpy as np
import safetensors.torch import safetensors.torch
@ -327,24 +327,64 @@ class SavePreviewLatent(SaveLatent):
metadata.add_text(x, json.dumps(extra_pnginfo[x])) metadata.add_text(x, json.dumps(extra_pnginfo[x]))
exif_bytes = piexif.dump(exif_data) exif_bytes = piexif.dump(exif_data)
image.save(image_path, format='png', exif=exif_bytes, pnginfo=metadata) image.save(image_path, format='png', exif=exif_bytes, pnginfo=metadata, optimize=True)
@staticmethod @staticmethod
def load_preview(image): def prepare_preview(image, latent_tensor):
lower_bound = 128
upper_bound = 512
if image is None: if image is None:
comfy_path = os.path.dirname(__file__) image = comfy.utils.latent_to_rgb(latent_tensor)
image_path = os.path.join(comfy_path, "logo.png")
return Image.open(image_path) min_size = min(image.size[0], image.size[1])
max_size = max(image.size[0], image.size[1])
scale_factor = 1
if max_size > upper_bound:
scale_factor = upper_bound/max_size
# prevent too small preview
if min_size*scale_factor < lower_bound:
scale_factor = lower_bound/min_size
w = int(image.size[0] * scale_factor)
h = int(image.size[1] * scale_factor)
image = image.resize((w, h))
else: else:
# don't resize if provide preview image intentionally
i = 255. * image[0].cpu().numpy() i = 255. * image[0].cpu().numpy()
image = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8)) image = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
return image
def save_preview_latent(self, samples, filename_prefix="ComfyUI", image=None, prompt=None, extra_pnginfo=None): return SavePreviewLatent.attach_format_text(image)
@staticmethod
def attach_format_text(image):
width_a, height_a = image.size
letter_image = Image.open("misc/latent.png")
width_b, height_b = letter_image.size
new_width = max(width_a, width_b)
new_height = height_a + height_b
new_image = Image.new('RGB', (new_width, new_height), (0, 0, 0))
offset_x = (new_width - width_b) // 2
offset_y = (height_a + (new_height - height_a - height_b) // 2)
new_image.paste(letter_image, (offset_x, offset_y))
new_image.paste(image, (0, 0))
return new_image
def save_preview_latent(self, samples, filename_prefix="ComfyUI", image_opt=None, prompt=None, extra_pnginfo=None):
full_output_folder, filename, counter, subfolder, filename_prefix = folder_paths.get_save_image_path(filename_prefix, self.output_dir) full_output_folder, filename, counter, subfolder, filename_prefix = folder_paths.get_save_image_path(filename_prefix, self.output_dir)
# load preview # load preview
preview = SavePreviewLatent.load_preview(image) preview = SavePreviewLatent.prepare_preview(image_opt, samples['samples'])
# support save metadata for latent sharing # support save metadata for latent sharing
file = f"{filename}_{counter:05}_.latent.png" file = f"{filename}_{counter:05}_.latent.png"