File size: 7,063 Bytes
baa8e90 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
#---------------------------------------------------------------------------------------------------------------------#
# Comfyroll Custom Nodes by RockOfFire and Akatsuzi https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes
# for ComfyUI https://github.com/comfyanonymous/ComfyUI
#---------------------------------------------------------------------------------------------------------------------#
import numpy as np
import torch
import random
import os
from PIL import Image, ImageDraw
from .graphics_functions import get_color_values
from ..categories import icons
from ..config import color_mapping, COLORS
def pil2tensor(image):
return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0)
#---------------------------------------------------------------------------------------------------------------------#
class CR_BinaryPatternSimple:
@classmethod
def INPUT_TYPES(s):
return {"required": {
"binary_pattern": ("STRING", {"multiline": True, "default": "10101"}),
"width": ("INT", {"default": 512, "min": 64, "max": 4096}),
"height": ("INT", {"default": 512, "min": 64, "max": 4096}),
}
}
RETURN_TYPES = ("IMAGE", "STRING", )
RETURN_NAMES = ("IMAGE", "show_help", )
FUNCTION = "draw_pattern"
CATEGORY = icons.get("Comfyroll/Graphics/Pattern")
def draw_pattern(self, binary_pattern, width, height):
# Convert multiline binary pattern to a 2D list
rows = binary_pattern.strip().split('\n')
grid = [[int(bit) for bit in row.strip()] for row in rows]
# Calculate the size of each square
square_width = width // len(rows[0])
square_height = height // len(rows)
# Create a new image
image = Image.new("RGB", (width, height), color='black')
draw = ImageDraw.Draw(image)
# Draw grid based on the binary pattern
for row_index, row in enumerate(grid):
for col_index, bit in enumerate(row):
x1 = col_index * square_width
y1 = row_index * square_height
x2 = x1 + square_width
y2 = y1 + square_height
# Draw black square if bit is 1, else draw white square
color = 'black' if bit == 1 else 'white'
draw.rectangle([x1, y1, x2, y2], fill=color, outline="black")
image_out = pil2tensor(image)
show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Text-Nodes#cr-simple-binary-pattern"
# Convert the PIL image back to a torch tensor
return (image_out, show_help, )
#---------------------------------------------------------------------------------------------------------------------#
class CR_BinaryPattern:
@classmethod
def INPUT_TYPES(s):
return {"required": {
"binary_pattern": ("STRING", {"multiline": True, "default": "10101"}),
"width": ("INT", {"default": 512, "min": 64, "max": 4096}),
"height": ("INT", {"default": 512, "min": 64, "max": 4096}),
"background_color": (COLORS,),
"color_0": (COLORS,),
"color_1": (COLORS,),
"outline_thickness": ("INT", {"default": 0, "min": 0, "max": 1024}),
"outline_color": (COLORS,),
"jitter_distance": ("INT", {"default": 0, "min": 0, "max": 1024}),
},
"optional": {
"bg_color_hex": ("STRING", {"multiline": False, "default": "#000000"}),
"color0_hex": ("STRING", {"multiline": False, "default": "#000000"}),
"color1_hex": ("STRING", {"multiline": False, "default": "#000000"}),
"outline_color_hex": ("STRING", {"multiline": False, "default": "#000000"}),
}
}
RETURN_TYPES = ("IMAGE", "STRING", )
RETURN_NAMES = ("IMAGE", "show_help", )
FUNCTION = "draw_pattern"
CATEGORY = icons.get("Comfyroll/Graphics/Pattern")
def draw_pattern(self, binary_pattern, width, height,
background_color, outline_color,
color_0="white", color_1="black", outline_thickness=0,
color0_hex='#000000', color1_hex='#000000',
bg_color_hex='#000000', outline_color_hex='#000000',
jitter_distance = 0):
# Get RGB values
color0 = get_color_values(color_0, color0_hex, color_mapping)
color1 = get_color_values(color_1, color1_hex, color_mapping)
bg_color = get_color_values(background_color, bg_color_hex, color_mapping)
outline_color = get_color_values(outline_color, outline_color_hex, color_mapping)
# Convert multiline binary pattern to a 2D list
rows = binary_pattern.strip().split('\n')
grid = [[int(bit) for bit in row.strip()] for row in rows]
# Calculate the size of each square
square_width = width // len(rows[0])
square_height = height // len(rows)
# Create a new image
image = Image.new("RGB", (width, height), color=bg_color)
draw = ImageDraw.Draw(image)
x_jitter = 0
y_jitter = 0
# Draw grid based on the binary pattern
for row_index, row in enumerate(grid):
for col_index, bit in enumerate(row):
if jitter_distance != 0:
x_jitter = random.uniform(0, jitter_distance)
y_jitter = random.uniform(0, jitter_distance)
x1 = col_index * square_width + x_jitter
y1 = row_index * square_height + y_jitter
x2 = x1 + square_width + x_jitter
y2 = y1 + square_height + y_jitter
# Draw black square if bit is 1, else draw white square
color = color1 if bit == 1 else color0
draw.rectangle([x1, y1, x2, y2], fill=color, outline=outline_color, width=outline_thickness)
image_out = pil2tensor(image)
show_help = "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes/wiki/Text-Nodes#cr-binary-pattern"
# Convert the PIL image back to a torch tensor
return (image_out, show_help, )
#---------------------------------------------------------------------------------------------------------------------#
# MAPPINGS
#---------------------------------------------------------------------------------------------------------------------#
# For reference only, actual mappings are in __init__.py
'''
NODE_CLASS_MAPPINGS = {
"CR Simple Binary Pattern Simple": CR Binary Pattern Simple,
"CR Binary Pattern": CR_BinaryPattern,
}
'''
|