mirror of
https://github.com/justUmen/Bjornulf_custom_nodes.git
synced 2026-03-21 20:52:11 -03:00
Add 2 nodes, remove alpha + convert image to grayscale
This commit is contained in:
32
README.md
32
README.md
@@ -1,4 +1,4 @@
|
|||||||
# 🔗 Comfyui : Bjornulf_custom_nodes v0.4 🔗
|
# 🔗 Comfyui : Bjornulf_custom_nodes v0.5 🔗
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
|
|
||||||
@@ -6,10 +6,12 @@
|
|||||||
|
|
||||||
# 📝 Changelog
|
# 📝 Changelog
|
||||||
|
|
||||||
- **v0.2 Ollama**: Improve ollama node with system prompt + model selection.
|
- **v0.2**: Improve ollama node with system prompt + model selection.
|
||||||
- **v0.3 Save Image to Folder**: Add a new node : Save image to a chosen folder.
|
- **v0.3**: Add a new node : Save image to a chosen folder.
|
||||||
- **v0.3 Save Images**: Add comfyui Metadata / workflow to all my image-related nodes.
|
- **v0.3**: Add comfyui Metadata / workflow to all my image-related nodes.
|
||||||
- **v0.4 Images to video**: Support transparency option with webm format, options encoders. As well as input for audio stream.
|
- **v0.4**: Support transparency option with webm format, options encoders. As well as input for audio stream.
|
||||||
|
- **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.
|
||||||
|
|
||||||
# 📝 Nodes descriptions
|
# 📝 Nodes descriptions
|
||||||
|
|
||||||
@@ -138,5 +140,21 @@ Create a ping-pong effect from a list of images (from a video) by reversing the
|
|||||||
|
|
||||||
**Description:**
|
**Description:**
|
||||||
Combine a sequence of images into a video file.
|
Combine a sequence of images into a video file.
|
||||||
❓ I made this node because it supports transparency with webm format. (Needed for rembg)
|
❓ I made this node because it supports transparency with webm format. (Needed for rembg)
|
||||||
Temporary images are stored in the folder `ComfyUI/temp_images_imgs2video/` as well as the wav audio file.
|
Temporary images are stored in the folder `ComfyUI/temp_images_imgs2video/` as well as the wav audio file.
|
||||||
|
|
||||||
|
## 22 - 🔲 Remove image Transparency (alpha)
|
||||||
|

|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Remove transparency from an image by filling the alpha channel with a solid color. (black, white or greenscreen)
|
||||||
|
Of course it takes in an image with transparency, liek from rembg nodes.
|
||||||
|
Necessary for some nodes that don't support transparency.
|
||||||
|
|
||||||
|
## 23 - 🔲 Image to grayscale (black & white)
|
||||||
|

|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Convert an image to grayscale (black & white)
|
||||||
|
Example : I sometimes use it with Ipadapter to disable color influence.
|
||||||
|
But you can sometimes also want a black and white image...
|
||||||
@@ -25,6 +25,8 @@ 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 .image_to_grayscale import GrayscaleTransform
|
||||||
|
|
||||||
# from .CUSTOM_STRING import CustomStringType
|
# from .CUSTOM_STRING import CustomStringType
|
||||||
|
|
||||||
@@ -32,6 +34,8 @@ NODE_CLASS_MAPPINGS = {
|
|||||||
# "Bjornulf_CustomStringType": CustomStringType,
|
# "Bjornulf_CustomStringType": CustomStringType,
|
||||||
"Bjornulf_ollamaLoader": ollamaLoader,
|
"Bjornulf_ollamaLoader": ollamaLoader,
|
||||||
"Bjornulf_WriteText": WriteText,
|
"Bjornulf_WriteText": WriteText,
|
||||||
|
"Bjornulf_RemoveTransparency": RemoveTransparency,
|
||||||
|
"Bjornulf_GrayscaleTransform": GrayscaleTransform,
|
||||||
# "Bjornulf_WriteImageEnvironment": WriteImageEnvironment,
|
# "Bjornulf_WriteImageEnvironment": WriteImageEnvironment,
|
||||||
# "Bjornulf_WriteImageCharacters": WriteImageCharacters,
|
# "Bjornulf_WriteImageCharacters": WriteImageCharacters,
|
||||||
# "Bjornulf_WriteImageCharacter": WriteImageCharacter,
|
# "Bjornulf_WriteImageCharacter": WriteImageCharacter,
|
||||||
@@ -65,6 +69,8 @@ NODE_DISPLAY_NAME_MAPPINGS = {
|
|||||||
"Bjornulf_ShowText": "👁 Show (Text)",
|
"Bjornulf_ShowText": "👁 Show (Text)",
|
||||||
"Bjornulf_ShowInt": "👁 Show (Int)",
|
"Bjornulf_ShowInt": "👁 Show (Int)",
|
||||||
"Bjornulf_ShowFloat": "👁 Show (Float)",
|
"Bjornulf_ShowFloat": "👁 Show (Float)",
|
||||||
|
"Bjornulf_GrayscaleTransform": "🔲 Image to grayscale (black & white)",
|
||||||
|
"Bjornulf_RemoveTransparency": "🔲 Remove image Transparency (alpha)",
|
||||||
"Bjornulf_ResizeImage": "📏 Resize Image",
|
"Bjornulf_ResizeImage": "📏 Resize Image",
|
||||||
"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",
|
||||||
|
|||||||
39
image_to_grayscale.py
Normal file
39
image_to_grayscale.py
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import torch
|
||||||
|
|
||||||
|
class GrayscaleTransform:
|
||||||
|
@classmethod
|
||||||
|
def INPUT_TYPES(s):
|
||||||
|
return {
|
||||||
|
"required": {
|
||||||
|
"image": ("IMAGE",),
|
||||||
|
"preserve_alpha": ("BOOLEAN", {"default": False}),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_TYPES = ("IMAGE",)
|
||||||
|
FUNCTION = "transform_to_grayscale"
|
||||||
|
|
||||||
|
CATEGORY = "Bjornulf"
|
||||||
|
|
||||||
|
def transform_to_grayscale(self, image, preserve_alpha):
|
||||||
|
# Check if the image has an alpha channel
|
||||||
|
has_alpha = image.shape[3] == 4
|
||||||
|
|
||||||
|
# Extract RGB channels
|
||||||
|
rgb = image[:, :, :, :3]
|
||||||
|
|
||||||
|
# Convert to grayscale using the luminosity method
|
||||||
|
# Weights are based on human perception of color
|
||||||
|
grayscale = 0.2989 * rgb[:,:,:,0] + 0.5870 * rgb[:,:,:,1] + 0.1140 * rgb[:,:,:,2]
|
||||||
|
|
||||||
|
# Expand dimensions to match original shape
|
||||||
|
grayscale = grayscale.unsqueeze(-1).repeat(1, 1, 1, 3)
|
||||||
|
|
||||||
|
if has_alpha and preserve_alpha:
|
||||||
|
# If the original image had an alpha channel and we want to preserve it
|
||||||
|
alpha = image[:, :, :, 3:4]
|
||||||
|
result = torch.cat([grayscale, alpha], dim=3)
|
||||||
|
else:
|
||||||
|
result = grayscale
|
||||||
|
|
||||||
|
return (result,)
|
||||||
47
remove_transparency.py
Normal file
47
remove_transparency.py
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
import torch
|
||||||
|
|
||||||
|
class RemoveTransparency:
|
||||||
|
@classmethod
|
||||||
|
def INPUT_TYPES(s):
|
||||||
|
return {
|
||||||
|
"required": {
|
||||||
|
"image": ("IMAGE",),
|
||||||
|
"recover_background": ("BOOLEAN", {"default": False}),
|
||||||
|
"background_color": (["black", "white", "greenscreen"], {"default": "black"}),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_TYPES = ("IMAGE",)
|
||||||
|
FUNCTION = "process_transparency"
|
||||||
|
|
||||||
|
CATEGORY = "Bjornulf"
|
||||||
|
|
||||||
|
def process_transparency(self, image, recover_background, background_color):
|
||||||
|
# Check if the image has an alpha channel
|
||||||
|
if image.shape[3] == 4:
|
||||||
|
rgb = image[:, :, :, :3]
|
||||||
|
alpha = image[:, :, :, 3:4]
|
||||||
|
|
||||||
|
if recover_background:
|
||||||
|
result = rgb
|
||||||
|
else:
|
||||||
|
# Create background color tensor
|
||||||
|
if background_color == "white":
|
||||||
|
bg_color = torch.ones_like(rgb)
|
||||||
|
elif background_color == "greenscreen":
|
||||||
|
bg_color = torch.zeros_like(rgb)
|
||||||
|
bg_color[:, :, :, 1] = 1 # Set green channel to 1
|
||||||
|
else: # black
|
||||||
|
bg_color = torch.zeros_like(rgb)
|
||||||
|
|
||||||
|
# Blend the image with the background color
|
||||||
|
result = rgb * alpha + bg_color * (1 - alpha)
|
||||||
|
else:
|
||||||
|
# If there's no alpha channel, return the original image
|
||||||
|
result = image
|
||||||
|
|
||||||
|
# Ensure the output is always 3 channels (RGB)
|
||||||
|
if result.shape[3] == 4:
|
||||||
|
result = result[:, :, :, :3]
|
||||||
|
|
||||||
|
return (result,)
|
||||||
BIN
screenshots/grayscale.png
Normal file
BIN
screenshots/grayscale.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 372 KiB |
BIN
screenshots/remove_alpha.png
Normal file
BIN
screenshots/remove_alpha.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 352 KiB |
Reference in New Issue
Block a user