fix(view): EXIF orientation, atomic mask outputs, robust hash split
This commit is contained in:
parent
676a6df4f8
commit
c0ac823cc8
|
|
@ -20,7 +20,7 @@ def get_or_create_preview_file(
|
||||||
source_abs_path: str, max_size: int, quality: int
|
source_abs_path: str, max_size: int, quality: int
|
||||||
) -> str:
|
) -> str:
|
||||||
source_hash, source_ref_id = _ensure_source_asset(source_abs_path)
|
source_hash, source_ref_id = _ensure_source_asset(source_abs_path)
|
||||||
hash_hex = source_hash.partition(":")[2]
|
hash_hex = source_hash.split(":")[-1]
|
||||||
preview_dir = folder_paths.get_system_user_directory("preview_cache")
|
preview_dir = folder_paths.get_system_user_directory("preview_cache")
|
||||||
preview_path = os.path.join(
|
preview_path = os.path.join(
|
||||||
preview_dir, f"{hash_hex}_{max_size}_q{quality}.webp"
|
preview_dir, f"{hash_hex}_{max_size}_q{quality}.webp"
|
||||||
|
|
@ -32,10 +32,10 @@ def get_or_create_preview_file(
|
||||||
tmp_path = f"{preview_path}.{uuid.uuid4().hex}.tmp"
|
tmp_path = f"{preview_path}.{uuid.uuid4().hex}.tmp"
|
||||||
try:
|
try:
|
||||||
with Image.open(source_abs_path) as img:
|
with Image.open(source_abs_path) as img:
|
||||||
preview_img = img
|
preview_img = ImageOps.exif_transpose(img)
|
||||||
if max(img.size) > max_size:
|
if max(preview_img.size) > max_size:
|
||||||
preview_img = ImageOps.contain(
|
preview_img = ImageOps.contain(
|
||||||
img, (max_size, max_size), Image.Resampling.LANCZOS
|
preview_img, (max_size, max_size), Image.Resampling.LANCZOS
|
||||||
)
|
)
|
||||||
preview_img.save(tmp_path, format="webp", quality=quality)
|
preview_img.save(tmp_path, format="webp", quality=quality)
|
||||||
os.replace(tmp_path, preview_path)
|
os.replace(tmp_path, preview_path)
|
||||||
|
|
|
||||||
47
server.py
47
server.py
|
|
@ -515,7 +515,8 @@ class PromptServer():
|
||||||
if hasattr(original_pil,'text'):
|
if hasattr(original_pil,'text'):
|
||||||
for key in original_pil.text:
|
for key in original_pil.text:
|
||||||
metadata.add_text(key, original_pil.text[key])
|
metadata.add_text(key, original_pil.text[key])
|
||||||
original_pil = original_pil.convert('RGBA')
|
|
||||||
|
original_pil = ImageOps.exif_transpose(original_pil.convert('RGBA'))
|
||||||
original_pil.putalpha(Image.new('L', original_pil.size, 255))
|
original_pil.putalpha(Image.new('L', original_pil.size, 255))
|
||||||
mask_pil = Image.open(image.file).convert('RGBA')
|
mask_pil = Image.open(image.file).convert('RGBA')
|
||||||
|
|
||||||
|
|
@ -527,7 +528,7 @@ class PromptServer():
|
||||||
|
|
||||||
masked_pil = original_pil.copy()
|
masked_pil = original_pil.copy()
|
||||||
masked_pil.putalpha(new_alpha)
|
masked_pil.putalpha(new_alpha)
|
||||||
masked_pil.save(filepath, compress_level=4, pnginfo=metadata)
|
outputs = [(filepath, masked_pil, {"pnginfo": metadata})]
|
||||||
|
|
||||||
paint = post.get("paint")
|
paint = post.get("paint")
|
||||||
if paint is not None and paint.file:
|
if paint is not None and paint.file:
|
||||||
|
|
@ -545,26 +546,28 @@ class PromptServer():
|
||||||
("painted_filename", painted_pil, {"pnginfo": metadata}),
|
("painted_filename", painted_pil, {"pnginfo": metadata}),
|
||||||
("painted_masked_filename", painted_masked_pil, {"pnginfo": metadata}),
|
("painted_masked_filename", painted_masked_pil, {"pnginfo": metadata}),
|
||||||
]
|
]
|
||||||
staged = []
|
for field, pil_image, save_kwargs in sibling_outputs:
|
||||||
try:
|
name = post.get(field)
|
||||||
for field, pil_image, save_kwargs in sibling_outputs:
|
if not name:
|
||||||
name = post.get(field)
|
continue
|
||||||
if not name:
|
outputs.append((os.path.join(save_dir, os.path.basename(name)), pil_image, save_kwargs))
|
||||||
continue
|
|
||||||
dest = os.path.join(save_dir, os.path.basename(name))
|
staged = []
|
||||||
tmp = f"{dest}.{uuid.uuid4().hex}.tmp"
|
try:
|
||||||
pil_image.save(tmp, format="PNG", compress_level=4, **save_kwargs)
|
for dest, pil_image, save_kwargs in outputs:
|
||||||
staged.append((tmp, dest))
|
tmp = f"{dest}.{uuid.uuid4().hex}.tmp"
|
||||||
for tmp, dest in staged:
|
pil_image.save(tmp, format="PNG", compress_level=4, **save_kwargs)
|
||||||
os.replace(tmp, dest)
|
staged.append((tmp, dest))
|
||||||
except Exception:
|
for tmp, dest in staged:
|
||||||
for tmp, _ in staged:
|
os.replace(tmp, dest)
|
||||||
if os.path.exists(tmp):
|
except Exception:
|
||||||
try:
|
for tmp, _ in staged:
|
||||||
os.remove(tmp)
|
if os.path.exists(tmp):
|
||||||
except OSError:
|
try:
|
||||||
pass
|
os.remove(tmp)
|
||||||
raise
|
except OSError:
|
||||||
|
pass
|
||||||
|
raise
|
||||||
|
|
||||||
# Compositing large originals can take seconds; keep it off the event loop
|
# Compositing large originals can take seconds; keep it off the event loop
|
||||||
return await asyncio.get_running_loop().run_in_executor(
|
return await asyncio.get_running_loop().run_in_executor(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue