diff --git a/RS_Saturation_switch.py b/RS_Saturation_switch.py index 7567617..a87a969 100644 --- a/RS_Saturation_switch.py +++ b/RS_Saturation_switch.py @@ -13,7 +13,7 @@ class RS_SaturationSwitch: "default": 1.0, "min": 0.0, "max": 3.0, - "step": 0.05, # Шаг изменения 0.05 + "step": 0.05, "display_name": "Intensity", "description": "0.0=Grayscale, 1.0=Original, 1.5=Subtle Boost" }), @@ -29,32 +29,25 @@ class RS_SaturationSwitch: if intensity == 1.0: return (image,) - # Создаем копию с явным указанием размерности - img = image.clone().float() # Конвертируем в float32 для точности + img = image.clone().float() - # Рассчитываем luminance (яркость) r, g, b = img[..., 0], img[..., 1], img[..., 2] l = 0.299 * r + 0.587 * g + 0.114 * b - l = l.unsqueeze(-1) # Добавляем размерность канала + l = l.unsqueeze(-1) - # Безопасное изменение насыщенности if intensity < 1.0: - # Для уменьшения насыщенности - линейная интерполяция result = l + intensity * (img - l) else: - # Для увеличения - нелинейное усиление с защитой - boost = 1.0 + (intensity - 1.0) * 0.7 # Мягкое усиление + boost = 1.0 + (intensity - 1.0) * 0.7 delta = img - l result = l + boost * delta - # Ограничение для предотвращения артефактов result = torch.where( (result < 0) | (result > 1), - l + 0.9 * delta, # Безопасный коэффициент + l + 0.9 * delta, result ) - # Корректное восстановление размерности if result.dim() == 3: result = result.unsqueeze(0) diff --git a/Rayko_Image_Text .py b/Rayko_Image_Text .py index 1d52f59..fc7ed72 100644 --- a/Rayko_Image_Text .py +++ b/Rayko_Image_Text .py @@ -7,7 +7,6 @@ import folder_paths print("\033[93m🦊\033[0m \033[93mRaykoStudio - RS Image-Text \033[92mLOADED\033[0m") def get_image_files(): - """Возвращает список файлов изображений в папке input.""" input_dir = folder_paths.get_input_directory() files = [] for f in os.listdir(input_dir): @@ -17,13 +16,6 @@ def get_image_files(): return files class LoadImageWithText: - """ - Загружает изображение через стандартный виджет Load Image, - читает/записывает текст в чанк tEXt (ключ 'Description'). - - Режим read: извлекает текст, возвращает тензор и текст. - - Режим write: добавляет текст, сохраняет копию в output с префиксом, - возвращает тензор и записанный текст. - """ @classmethod def INPUT_TYPES(cls): files = get_image_files() @@ -70,38 +62,30 @@ class LoadImageWithText: pil_img = Image.open(input_path) image_tensor = self.pil_to_tensor(pil_img) - # Подготовка метаданных pnginfo = PngImagePlugin.PngInfo() if text: pnginfo.add_text("Description", text) print(f"[WRITE] Записывается текст: '{text}'") - # Генерация имени для сохранения в output output_dir = folder_paths.get_output_directory() - # Получаем следующий доступный номер для файла counter = 1 while True: - # Формируем имя файла с номером output_filename = f"{filename_prefix}_{counter:05}.png" output_path = os.path.join(output_dir, output_filename) - # Если файл не существует, используем это имя if not os.path.exists(output_path): break counter += 1 print(f"[WRITE] Сохраняется в: {output_path}") - # Принудительно конвертируем в RGB, если нужно (для надежности) if pil_img.mode not in ('RGB', 'RGBA'): pil_img = pil_img.convert('RGB') - # Сохраняем pil_img.save(output_path, format="PNG", pnginfo=pnginfo) print(f"[WRITE] Файл сохранён: {os.path.exists(output_path)}") - # Проверка записи try: check_img = Image.open(output_path) saved_text = check_img.info.get("Description", "")