108 lines
3.7 KiB
Python
108 lines
3.7 KiB
Python
import os
|
|
import json
|
|
import traceback
|
|
import re
|
|
from PIL import Image
|
|
import piexif
|
|
import piexif.helper
|
|
from datetime import datetime
|
|
from typing import Dict, Optional, TypedDict, Union, List
|
|
from ..my_types import TGenInfo
|
|
|
|
|
|
|
|
class util:
|
|
# @staticmethod
|
|
# def initialize_defaults(prompt, extra_pnginfo):
|
|
# util.write_prompt(prompt, extra_pnginfo)
|
|
# print("check prompt_decode_err.log")
|
|
# traceback.print_exc()
|
|
# return "", [], "unknown", "00", "000000"
|
|
|
|
# @staticmethod
|
|
# def write_prompt(prompt, extra_pnginfo):
|
|
# log_file_name = os.path.join(os.path.dirname(__file__), "prompt_decode_err.log")
|
|
# with open(log_file_name, "w", encoding="utf-8") as f:
|
|
# f.write('"prompt:"\n')
|
|
# json.dump(prompt, f, indent=4, ensure_ascii=False)
|
|
# if extra_pnginfo is not None:
|
|
# f.write('\n\n"extra_pnginfo:"\n')
|
|
# json.dump(extra_pnginfo, f, indent=4, ensure_ascii=False)
|
|
|
|
|
|
@staticmethod
|
|
def _is_valid_text(text):
|
|
return isinstance(text, str) and text.strip() and text != "undefined"
|
|
|
|
# # #############################
|
|
# # Eagle保存用コメントを作成
|
|
# @staticmethod
|
|
# def make_annotation_text(gen_info:TGenInfo) -> str:
|
|
# positive = gen_info["prompt_text"]["prompt"]
|
|
# negative = gen_info["prompt_text"]["negative"]
|
|
# tmp_annotation = ""
|
|
|
|
# if util._is_valid_text(positive):
|
|
# tmp_annotation += positive
|
|
# if util._is_valid_text(negative):
|
|
# tmp_annotation += "\n" if tmp_annotation.strip() else ""
|
|
# tmp_annotation += "Negative prompt:" + negative
|
|
# if util._is_valid_text(memo_text):
|
|
# tmp_annotation += "\n" if tmp_annotation.strip() else ""
|
|
# tmp_annotation += "Memo:" + memo_text
|
|
# return tmp_annotation
|
|
|
|
|
|
# ####################
|
|
# 現在時刻のテキストを取得
|
|
@staticmethod
|
|
def get_datetime_str_msec() -> str:
|
|
"""
|
|
Gets the current datetime as a string with millisecond precision.
|
|
This method generates and returns a string representing the current datetime with millisecond precision.
|
|
"""
|
|
now = datetime.now()
|
|
date_time_str = now.strftime("%Y%m%d_%H%M%S")
|
|
return f"{date_time_str}_{now.microsecond:06}"
|
|
|
|
|
|
# #########################
|
|
# webp用にExifデータを作成する
|
|
# ただしa1111のPNGInfoに表示するが、ワークフローは再現しない
|
|
@staticmethod
|
|
def get_exif_from_prompt(img, formated_info:str, extra_pnginfo, prompt):
|
|
metadata = img.getexif()
|
|
|
|
if len(metadata) == 0:
|
|
metadata = {"0th": {}, "Exif": {}, "GPS": {}, "Interop": {}, "1st": {}}
|
|
|
|
if prompt is not None:
|
|
metadata["0th"][0x0110] = "prompt:{}".format(json.dumps(prompt))
|
|
if extra_pnginfo is not None:
|
|
inital_exif = 0x010f
|
|
for x in extra_pnginfo:
|
|
metadata["0th"][inital_exif] = "{}:{}".format(x, json.dumps(extra_pnginfo[x]))
|
|
inital_exif -= 1
|
|
|
|
metadata["Exif"][piexif.ExifIFD.UserComment] = piexif.helper.UserComment.dump(formated_info, "unicode")
|
|
|
|
return piexif.dump(metadata)
|
|
|
|
|
|
@staticmethod
|
|
def get_prompt_tags(prompt_text: str) -> list:
|
|
if (
|
|
not isinstance(prompt_text, str)
|
|
or not prompt_text.strip()
|
|
or prompt_text == "undefined"
|
|
):
|
|
return []
|
|
|
|
cleaned_string = re.sub(r":\d+\.\d+", "", prompt_text)
|
|
items = cleaned_string.split(",")
|
|
return [
|
|
re.sub(r"[\(\)]", "", item).strip()
|
|
for item in items
|
|
if re.sub(r"[\(\)]", "", item).strip()
|
|
]
|