Replace Save API node with Save Bjornulf Lobechat node

This commit is contained in:
justumen
2024-08-06 15:30:46 +02:00
parent d9a7bb733c
commit ce9d96a6e0
6 changed files with 34 additions and 22 deletions

1
.gitignore vendored
View File

@@ -6,3 +6,4 @@ web/js/clear_vram.js
CUSTOM_STRING.py.txt CUSTOM_STRING.py.txt
web/js/BJORNULF_TYPES.js.txt web/js/BJORNULF_TYPES.js.txt
web/js/CUSTOM_STRING.js.txt web/js/CUSTOM_STRING.js.txt
save_api_image.py.txt

View File

@@ -1,4 +1,4 @@
# 🔗 Comfyui : Bjornulf_custom_nodes v0.6 🔗 # 🔗 Comfyui : Bjornulf_custom_nodes v0.7 🔗
# Dependencies # Dependencies
@@ -13,6 +13,7 @@
- **v0.5**: New node : Remove image transparency (alpha) - Fill alpha channel with solid color. - **v0.5**: New node : Remove image transparency (alpha) - Fill alpha channel with solid color.
- **v0.5**: New node : Image to grayscale (black & white) - Convert an image to grayscale. - **v0.5**: New node : Image to grayscale (black & white) - Convert an image to grayscale.
- **v0.6**: New node : Combine images (Background + Overlay) - Combine two images into a single image. - **v0.6**: New node : Combine images (Background + Overlay) - Combine two images into a single image.
- **v0.7**: Replace Save API node with Save Bjornulf Lobechat node. (For my custom lobe-chat)
# 📝 Nodes descriptions # 📝 Nodes descriptions
@@ -97,20 +98,21 @@ Resize an image to exact dimensions. The other node will save the image to the e
**Description:** **Description:**
Save the given text input to a file. Useful for logging and storing text data. Save the given text input to a file. Useful for logging and storing text data.
## 16 - 🖼 Save image for API (❗For my custom [lobe-chat](https://github.com/justUmen/lobe-chat)❗) ## 16 - 🖼💬 Save image for Bjornulf LobeChat (❗For my custom [lobe-chat](https://github.com/justUmen/Bjornulf_lobe-chat)❗)
![Save API](screenshots/save_api.png) ![Save Bjornulf Lobechat](screenshots/save_bjornulf_lobechat.png)
**Description:** **Description:**
It will save the image with the name of `api_next_image.txt`, which will be incremented each time you run the node. ❓ I made that node for my custom lobe-chat to send+receive images from Comfyui API : [lobe-chat](https://github.com/justUmen/Bjornulf_lobe-chat)
It will save the image in the folder `output/BJORNULF_LOBECHAT/`.
The name will start at `api_00001.png`, then `api_00002.png`, etc... The name will start at `api_00001.png`, then `api_00002.png`, etc...
❓ I made that for my custom lobe-chat to send+receive images from Comfyui API : [lobe-chat](https://github.com/justUmen/lobe-chat) It will also create a link to the last generated image at the location `output/BJORNULF_API_LAST_IMAGE.png`.
This link will be used by my custom lobe-chat to copy the image inside the lobe-chat project.
## 17 - 🖼 Save image as `tmp_api.png` Temporary API ⚠️💣 ## 17 - 🖼 Save image as `tmp_api.png` Temporary API ⚠️💣
![Save Temporary API](screenshots/save_tmp_api.png) ![Save Temporary API](screenshots/save_tmp_api.png)
**Description:** **Description:**
Save image for short-term use : ./output/tmp_api.png ⚠️💣 Save image for short-term use : ./output/tmp_api.png ⚠️💣
## 18 - 🖼📁 Save image to a chosen folder name ## 18 - 🖼📁 Save image to a chosen folder name
![Save Temporary API](screenshots/save_image_to_folder.png) ![Save Temporary API](screenshots/save_image_to_folder.png)

View File

@@ -21,13 +21,15 @@ from .show_float import ShowFloat
from .save_text import SaveText from .save_text import SaveText
from .save_tmp_image import SaveTmpImage from .save_tmp_image import SaveTmpImage
from .save_image_path import SaveImagePath from .save_image_path import SaveImagePath
from .save_api_image import SaveApiImage # from .save_api_image import SaveApiImage
from .save_img_to_folder import SaveImageToFolder from .save_img_to_folder import SaveImageToFolder
from .resize_image import ResizeImage from .resize_image import ResizeImage
from .loop_my_combos_samplers_schedulers import LoopCombosSamplersSchedulers from .loop_my_combos_samplers_schedulers import LoopCombosSamplersSchedulers
from .remove_transparency import RemoveTransparency from .remove_transparency import RemoveTransparency
from .image_to_grayscale import GrayscaleTransform from .image_to_grayscale import GrayscaleTransform
from .combine_background_overlay import CombineBackgroundOverlay from .combine_background_overlay import CombineBackgroundOverlay
from .save_bjornulf_lobechat import SaveBjornulfLobeChat
# from .check_black_image import CheckBlackImage
# from .clear_vram import ClearVRAM # from .clear_vram import ClearVRAM
# from .CUSTOM_STRING import CustomStringType # from .CUSTOM_STRING import CustomStringType
@@ -35,7 +37,9 @@ from .combine_background_overlay import CombineBackgroundOverlay
NODE_CLASS_MAPPINGS = { NODE_CLASS_MAPPINGS = {
# "Bjornulf_CustomStringType": CustomStringType, # "Bjornulf_CustomStringType": CustomStringType,
"Bjornulf_ollamaLoader": ollamaLoader, "Bjornulf_ollamaLoader": ollamaLoader,
# "Bjornulf_CheckBlackImage": CheckBlackImage,
# "Bjornulf_ClearVRAM": ClearVRAM, # "Bjornulf_ClearVRAM": ClearVRAM,
"Bjornulf_SaveBjornulfLobeChat": SaveBjornulfLobeChat,
"Bjornulf_WriteText": WriteText, "Bjornulf_WriteText": WriteText,
"Bjornulf_RemoveTransparency": RemoveTransparency, "Bjornulf_RemoveTransparency": RemoveTransparency,
"Bjornulf_GrayscaleTransform": GrayscaleTransform, "Bjornulf_GrayscaleTransform": GrayscaleTransform,
@@ -52,7 +56,7 @@ NODE_CLASS_MAPPINGS = {
"Bjornulf_SaveImageToFolder": SaveImageToFolder, "Bjornulf_SaveImageToFolder": SaveImageToFolder,
"Bjornulf_SaveTmpImage": SaveTmpImage, "Bjornulf_SaveTmpImage": SaveTmpImage,
"Bjornulf_SaveImagePath": SaveImagePath, "Bjornulf_SaveImagePath": SaveImagePath,
"Bjornulf_SaveApiImage": SaveApiImage, # "Bjornulf_SaveApiImage": SaveApiImage,
"Bjornulf_CombineTexts": CombineTexts, "Bjornulf_CombineTexts": CombineTexts,
"Bjornulf_LoopTexts": LoopTexts, "Bjornulf_LoopTexts": LoopTexts,
"Bjornulf_RandomTexts": RandomTexts, "Bjornulf_RandomTexts": RandomTexts,
@@ -70,6 +74,8 @@ NODE_CLASS_MAPPINGS = {
NODE_DISPLAY_NAME_MAPPINGS = { NODE_DISPLAY_NAME_MAPPINGS = {
# "Bjornulf_CustomStringType": "!!! CUSTOM STRING TYPE !!!", # "Bjornulf_CustomStringType": "!!! CUSTOM STRING TYPE !!!",
"Bjornulf_ollamaLoader": "🦙 Ollama (Description)", "Bjornulf_ollamaLoader": "🦙 Ollama (Description)",
# "Bjornulf_CheckBlackImage": "🔲 Check Black Image (Empty mask)",
"Bjornulf_SaveBjornulfLobeChat": "🖼💬 Save image for Bjornulf LobeChat",
# "Bjornulf_ClearVRAM": "🧹 Clear VRAM", # "Bjornulf_ClearVRAM": "🧹 Clear VRAM",
"Bjornulf_ShowText": "👁 Show (Text)", "Bjornulf_ShowText": "👁 Show (Text)",
"Bjornulf_ShowInt": "👁 Show (Int)", "Bjornulf_ShowInt": "👁 Show (Int)",
@@ -81,7 +87,7 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"Bjornulf_SaveImagePath": "🖼 Save Image (exact path, exact name) ⚠️💣", "Bjornulf_SaveImagePath": "🖼 Save Image (exact path, exact name) ⚠️💣",
"Bjornulf_SaveImageToFolder": "🖼📁 Save Image to a folder", "Bjornulf_SaveImageToFolder": "🖼📁 Save Image to a folder",
"Bjornulf_SaveTmpImage": "🖼 Save Image (tmp_api.png) ⚠️💣", "Bjornulf_SaveTmpImage": "🖼 Save Image (tmp_api.png) ⚠️💣",
"Bjornulf_SaveApiImage": "🖼 Save Image (./output/api_00001.png...)", # "Bjornulf_SaveApiImage": "🖼 Save Image (./output/api_00001.png...)",
"Bjornulf_SaveText": "💾 Save Text", #Make SaveCharacter, SaveLocation, SaveCamera, SaveAction, SaveClothes, SaveEmotion... "Bjornulf_SaveText": "💾 Save Text", #Make SaveCharacter, SaveLocation, SaveCamera, SaveAction, SaveClothes, SaveEmotion...
"Bjornulf_LoadText": "📥 Load Text", #Make LoadCharacter, LoadLocation, LoadCamera, LoadAction, LoadClothes, LoadEmotion... "Bjornulf_LoadText": "📥 Load Text", #Make LoadCharacter, LoadLocation, LoadCamera, LoadAction, LoadClothes, LoadEmotion...
"Bjornulf_WriteText": "✒ Write Text", "Bjornulf_WriteText": "✒ Write Text",

View File

@@ -4,7 +4,7 @@ from PIL import Image
import json import json
from PIL.PngImagePlugin import PngInfo from PIL.PngImagePlugin import PngInfo
class SaveApiImage: class SaveBjornulfLobeChat:
@classmethod @classmethod
def INPUT_TYPES(cls): def INPUT_TYPES(cls):
return { return {
@@ -14,14 +14,15 @@ class SaveApiImage:
"hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"}, "hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"},
} }
FUNCTION = "save_api_image" FUNCTION = "save_bjornulf_lobe_chat"
RETURN_TYPES = () RETURN_TYPES = ()
OUTPUT_NODE = True OUTPUT_NODE = True
CATEGORY = "Bjornulf" CATEGORY = "Bjornulf"
def save_api_image(self, image, prompt=None, extra_pnginfo=None): def save_bjornulf_lobe_chat(self, image, prompt=None, extra_pnginfo=None):
# Ensure the output directory exists # Ensure the output directory exists
os.makedirs("./output/", exist_ok=True) output_dir = "./output/BJORNULF_LOBECHAT/"
os.makedirs(output_dir, exist_ok=True)
# Convert the image from ComfyUI format to PIL Image # Convert the image from ComfyUI format to PIL Image
i = 255. * image.cpu().numpy() i = 255. * image.cpu().numpy()
@@ -35,11 +36,14 @@ class SaveApiImage:
# Determine the next available filename # Determine the next available filename
counter = 1 counter = 1
while True: while True:
filename = f"./output/api_{counter:05d}.png" filename = f"{output_dir}api_{counter:05d}.png"
if not os.path.exists(filename): if not os.path.exists(filename):
break break
counter += 1 counter += 1
# Save the image with the determined filename
img.save(filename, format="PNG")
# Prepare metadata # Prepare metadata
metadata = PngInfo() metadata = PngInfo()
if prompt is not None: if prompt is not None:
@@ -48,13 +52,12 @@ class SaveApiImage:
for k, v in extra_pnginfo.items(): for k, v in extra_pnginfo.items():
metadata.add_text(k, json.dumps(v)) metadata.add_text(k, json.dumps(v))
# Save the image with the determined filename and metadata # Update the symbolic link in the output directory
img.save(filename, format="PNG", pnginfo=metadata) link_path = "./output/BJORNULF_API_LAST_IMAGE.png"
if os.path.exists(link_path):
# Write the number of the last image to a text file with leading zeroes os.remove(link_path)
with open("./output/api_next_image.txt", "w") as f: os.symlink(os.path.abspath(filename), link_path)
f.write(f"api_{counter+1:05d}.png")
print(f"Image saved as: {filename}") print(f"Image saved as: {filename}")
return {"ui": {"images": [{"filename": filename, "type": "output"}]}} return {"ui": {"images": [{"filename": filename, "type": "output"}]}}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 KiB