diff --git a/README.md b/README.md index 24a81ac..da31508 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ The project is built around three goals: - single-click dependency setup for hidden-image experiments - custom nodes for pattern preprocessing, text-mask generation, scheduler presets, and FLUX-style latent ghosting -- workflow blueprints for QR, subliminal text, logo, and optical-illusion style pipelines +- importable starter workflows plus blueprint notes for QR, subliminal text, logo, and optical-illusion style pipelines ## Features @@ -32,7 +32,9 @@ The project is built around three goals: - `model_manifest.json` Public model list, preset mapping, and manual follow-up entries. - `workflows/` - Workflow blueprints for SD 1.5, SDXL, FLUX, and a unified router preset. + Importable ComfyUI starter prompts for SD 1.5, SDXL, FLUX, and a unified router preset. +- `workflow_blueprints/` + Human-readable blueprint JSON preserved from the original workflow notes. - `docs/WORKFLOWS.md` Notes on how to wire the blueprint workflows inside ComfyUI. @@ -110,18 +112,20 @@ The installer does not auto-download gated or license-acceptance base models suc ## Workflows -The `workflows/` directory currently contains blueprint JSON files rather than exported ComfyUI canvases: +The `workflows/` directory now contains importable ComfyUI starter prompts: - `sd15_qr_hidden_image.json` - `sdxl_qr_hidden_image.json` - `flux_ghost_hidden_image.json` - `unified_illusion_router.json` -This is intentional for now. Saved ComfyUI graph exports depend on the exact checkpoint loader and FLUX packaging used in a live install. +These starters include the NanoBanana preprocessing path and placeholder model-loader branches where the exact checkpoint or ControlNet choice is install-specific. + +The original human-readable blueprint files were moved to `workflow_blueprints/` and are still referenced by `docs/WORKFLOWS.md`. ## Roadmap -- importable ComfyUI workflow canvases +- fully wired model-specific ComfyUI workflow canvases - more style presets for logos, spirals, and depth-guided illusions - optional gated-model manifest entries - stronger FLUX workflow automation @@ -130,4 +134,4 @@ This is intentional for now. Saved ComfyUI graph exports depend on the exact che This repository is released under the MIT License. See `LICENSE`. -Model weights, third-party nodes, and external checkpoints retain their own upstream licenses. \ No newline at end of file +Model weights, third-party nodes, and external checkpoints retain their own upstream licenses. diff --git a/docs/WORKFLOWS.md b/docs/WORKFLOWS.md index 9bdafcc..21c2d49 100644 --- a/docs/WORKFLOWS.md +++ b/docs/WORKFLOWS.md @@ -1,20 +1,24 @@ # Workflow Notes -The JSON files in `workflows/` are model-specific workflow blueprints rather than drag-and-drop ComfyUI graph exports. They define the node order, recommended settings, and the exact role of each NanoBanana custom node. +The `workflows/` directory now contains importable ComfyUI starter prompts instead of the old human-readable blueprint JSON. These files should open as non-empty starter canvases in ComfyUI. -Recommended graph pattern: +The original reference notes were preserved in `workflow_blueprints/`. -1. Load pattern input with `LoadImage` or generate it with `NanoBanana Text Mask`. -2. Normalize the pattern with `NanoBanana Pattern Preprocessor`. -3. Use `NanoBanana Magic Scheduler` to derive family-specific ControlNet values. -4. For FLUX, also route the processed pattern into `NanoBanana Latent Mask` and then `Set Latent Noise Mask`. -5. Feed the processed image into the correct ControlNet loader and `Apply ControlNet Advanced`. -6. Finish in the family-appropriate sampler path. +What is in the starter prompts: -The split is intentional: +1. A runnable NanoBanana preprocessing path with preview outputs, so loading and queueing the file does something useful immediately. +2. SD 1.5 and SDXL starter branches with placeholder checkpoint and ControlNet loader nodes already laid out. +3. A FLUX preprocessing starter focused on pattern prep and latent-mask generation, since full FLUX loader stacks vary across installs. + +Recommended usage: + +1. Open a starter from `workflows/`. +2. Replace the placeholder checkpoint and ControlNet selections with models that exist in your install. +3. Swap `NanoBanana Text Mask` for `LoadImage` if you want to drive the workflow from a QR image or logo file. +4. For FLUX, route the `NanoBanana Latent Mask` output into `Set Latent Noise Mask` inside your preferred FLUX sampler chain. + +The original blueprint split still applies: - SD 1.5 stays aggressive and is best for scannable QR or obvious hidden text. - SDXL uses optical-pattern composition at higher resolution. - FLUX uses low-strength ControlNet plus latent masking to avoid fighting the model's coherence. - -If you want these blueprints converted into visual ComfyUI workflow exports next, the missing piece is your exact loader stack for SDXL and FLUX in your local install. That varies based on checkpoint packaging and custom nodes. \ No newline at end of file diff --git a/illusion_nodes.py b/illusion_nodes.py index 9dda5de..18ba6ee 100644 --- a/illusion_nodes.py +++ b/illusion_nodes.py @@ -160,9 +160,9 @@ class IllusionMagicScheduler: "latent": (0.15, 0.45), }, "sdxl": { - "strength": (0.35, 1.0), - "end_percent": (0.35, 0.9), - "cfg": (4.5, 7.0), + "strength": (0.85, 1.6), + "end_percent": (0.7, 1.0), + "cfg": (3.2, 5.0), "blur": (12.0, 3.0), "latent": (0.12, 0.35), }, @@ -267,4 +267,4 @@ NODE_DISPLAY_NAME_MAPPINGS = { "IllusionTextMask": "NanoBanana Text Mask", "IllusionMagicScheduler": "NanoBanana Magic Scheduler", "IllusionLatentMask": "NanoBanana Latent Mask", -} \ No newline at end of file +} diff --git a/install.bat b/install.bat index b50d796..f45a697 100644 --- a/install.bat +++ b/install.bat @@ -1,30 +1,86 @@ @echo off -setlocal enabledelayedexpansion +setlocal EnableExtensions EnableDelayedExpansion -set SCRIPT_DIR=%~dp0 -set PYTHON_BIN=%PYTHON_BIN% -if "%PYTHON_BIN%"=="" set PYTHON_BIN=python +set "SCRIPT_DIR=%~dp0" +set "PYTHON_EXE=" +set "PYTHON_ARGS=" +set "COMFYUI_ROOT=" +set "EXTRA_ARGS=" -set COMFYUI_ROOT= -set EXTRA_ARGS= +call :find_python +if errorlevel 1 exit /b 1 -if not "%~1"=="" ( - set FIRST_ARG=%~1 - if "%FIRST_ARG:~0,2%"=="--" ( - set EXTRA_ARGS=%* - ) else ( - set COMFYUI_ROOT=%~1 - shift - set EXTRA_ARGS=%* +call :parse_args %* +if errorlevel 1 exit /b 1 + +echo Installing NanoBanana - Illusion Architect dependencies +"%PYTHON_EXE%" %PYTHON_ARGS% -m pip install -r "%SCRIPT_DIR%requirements.txt" +if errorlevel 1 exit /b 1 + +if defined COMFYUI_ROOT ( + "%PYTHON_EXE%" %PYTHON_ARGS% "%SCRIPT_DIR%scripts\check_and_fill.py" --comfyui-root "%COMFYUI_ROOT%" %EXTRA_ARGS% +) else ( + "%PYTHON_EXE%" %PYTHON_ARGS% "%SCRIPT_DIR%scripts\check_and_fill.py" %EXTRA_ARGS% +) +exit /b %ERRORLEVEL% + +:parse_args +if "%~1"=="" exit /b 0 +set "FIRST_ARG=%~1" +if "!FIRST_ARG:~0,2!"=="--" ( + goto :collect_extra_args +) +set "COMFYUI_ROOT=%~1" +shift + +:collect_extra_args +if "%~1"=="" exit /b 0 +if defined EXTRA_ARGS ( + set "EXTRA_ARGS=!EXTRA_ARGS! %1" +) else ( + set "EXTRA_ARGS=%1" +) +shift +goto :collect_extra_args + +exit /b 0 + +:find_python +if defined PYTHON_BIN ( + set "PYTHON_EXE=%PYTHON_BIN%" + "%PYTHON_EXE%" --version >nul 2>nul + if not errorlevel 1 exit /b 0 + echo Python not found: %PYTHON_BIN% + exit /b 1 +) + +for %%I in ("%SCRIPT_DIR%..\..\.venv\Scripts\python.exe") do ( + if exist "%%~fI" ( + set "PYTHON_EXE=%%~fI" + exit /b 0 ) ) -echo Installing NanoBanana - Illusion Architect dependencies -%PYTHON_BIN% -m pip install -r "%SCRIPT_DIR%requirements.txt" -if errorlevel 1 exit /b 1 +for %%I in ("%SCRIPT_DIR%..\..\python_embeded\python.exe") do ( + if exist "%%~fI" ( + set "PYTHON_EXE=%%~fI" + exit /b 0 + ) +) -if not "%COMFYUI_ROOT%"=="" ( - %PYTHON_BIN% "%SCRIPT_DIR%scripts\check_and_fill.py" --comfyui-root "%COMFYUI_ROOT%" %EXTRA_ARGS% -) else ( - %PYTHON_BIN% "%SCRIPT_DIR%scripts\check_and_fill.py" %EXTRA_ARGS% -) \ No newline at end of file +py -3 --version >nul 2>nul +if not errorlevel 1 ( + set "PYTHON_EXE=py" + set "PYTHON_ARGS=-3" + exit /b 0 +) + +python --version >nul 2>nul +if not errorlevel 1 ( + set "PYTHON_EXE=python" + exit /b 0 +) + +echo Python was not found. +echo Install Python or use the ComfyUI .venv / python_embeded distribution. +exit /b 1 diff --git a/workflow_blueprints/flux_ghost_hidden_image.json b/workflow_blueprints/flux_ghost_hidden_image.json new file mode 100644 index 0000000..202e2cf --- /dev/null +++ b/workflow_blueprints/flux_ghost_hidden_image.json @@ -0,0 +1,67 @@ +{ + "name": "FLUX Ghost Pattern Hidden Image", + "format": "nanobanana-illusion-preset-v1", + "target": "flux", + "required_models": [ + "flux1_dev_controlnet_canny.safetensors", + "your_flux_dev_base" + ], + "required_nodes": [ + "NanoBanana Pattern Preprocessor", + "NanoBanana Magic Scheduler", + "NanoBanana Latent Mask" + ], + "graph": [ + { + "step": 1, + "node": "LoadImage or NanoBanana Text Mask", + "purpose": "Load the hidden pattern as a high contrast source." + }, + { + "step": 2, + "node": "NanoBanana Pattern Preprocessor", + "settings": { + "blur_radius": 10.0, + "contrast": 1.3, + "threshold": 0.42, + "invert": false + } + }, + { + "step": 3, + "node": "NanoBanana Latent Mask", + "settings": { + "blur_radius": 18.0, + "contrast": 2.0, + "midpoint": 0.48, + "mask_strength": 0.58 + } + }, + { + "step": 4, + "node": "NanoBanana Magic Scheduler", + "settings": { + "model_family": "flux", + "magic_slider": 0.46 + } + }, + { + "step": 5, + "node": "Apply ControlNet Advanced + Set Latent Noise Mask", + "purpose": "Run the Canny ControlNet at low strength and combine it with the latent mask for early-step ghosting." + }, + { + "step": 6, + "node": "Flux sampler path", + "settings": { + "steps": 24, + "guidance": "low", + "controlnet_strength": "0.2 - 0.45" + } + } + ], + "notes": [ + "FLUX hidden images rely on subtle control rather than brute forcing.", + "If the illusion vanishes completely, reduce blur slightly before increasing ControlNet strength." + ] +} \ No newline at end of file diff --git a/workflow_blueprints/sd15_qr_hidden_image.json b/workflow_blueprints/sd15_qr_hidden_image.json new file mode 100644 index 0000000..3c5482c --- /dev/null +++ b/workflow_blueprints/sd15_qr_hidden_image.json @@ -0,0 +1,57 @@ +{ + "name": "SD 1.5 QR Hidden Image", + "format": "nanobanana-illusion-preset-v1", + "target": "sd15", + "required_models": [ + "control_v1p_sd15_qrcode_monster_v2.safetensors", + "your_sd15_checkpoint.safetensors" + ], + "required_nodes": [ + "NanoBanana Pattern Preprocessor", + "NanoBanana Magic Scheduler" + ], + "graph": [ + { + "step": 1, + "node": "LoadImage or NanoBanana Text Mask", + "purpose": "Load a logo, QR payload image, or render black and white text." + }, + { + "step": 2, + "node": "NanoBanana Pattern Preprocessor", + "settings": { + "blur_radius": 4.0, + "contrast": 1.75, + "threshold": 0.48, + "invert": false + } + }, + { + "step": 3, + "node": "NanoBanana Magic Scheduler", + "settings": { + "model_family": "sd15", + "magic_slider": 0.82 + } + }, + { + "step": 4, + "node": "Apply ControlNet Advanced", + "purpose": "Feed the processed image into QR Code Monster with the scheduler outputs driving strength and end percent." + }, + { + "step": 5, + "node": "KSampler", + "settings": { + "steps": 28, + "sampler": "dpmpp_2m_sde", + "scheduler": "karras", + "denoise": 1.0 + } + } + ], + "notes": [ + "This is the most aggressive family and remains the easiest path for readable QR or text reveals.", + "Raise the magic slider when the encoded pattern must remain scannable." + ] +} \ No newline at end of file diff --git a/workflow_blueprints/sdxl_qr_hidden_image.json b/workflow_blueprints/sdxl_qr_hidden_image.json new file mode 100644 index 0000000..9db79e0 --- /dev/null +++ b/workflow_blueprints/sdxl_qr_hidden_image.json @@ -0,0 +1,57 @@ +{ + "name": "SDXL QR Hidden Image", + "format": "nanobanana-illusion-preset-v1", + "target": "sdxl", + "required_models": [ + "control_v04u_sdxl_opticalpattern.safetensors", + "your_sdxl_checkpoint.safetensors" + ], + "required_nodes": [ + "NanoBanana Pattern Preprocessor", + "NanoBanana Magic Scheduler" + ], + "graph": [ + { + "step": 1, + "node": "LoadImage or NanoBanana Text Mask", + "purpose": "Prepare the hidden pattern image at SDXL working resolution." + }, + { + "step": 2, + "node": "NanoBanana Pattern Preprocessor", + "settings": { + "blur_radius": 6.0, + "contrast": 1.55, + "threshold": 0.5, + "invert": false + } + }, + { + "step": 3, + "node": "NanoBanana Magic Scheduler", + "settings": { + "model_family": "sdxl", + "magic_slider": 0.7 + } + }, + { + "step": 4, + "node": "Apply ControlNet Advanced", + "purpose": "Use the SDXL optical pattern controlnet for global composition instead of hard QR forcing." + }, + { + "step": 5, + "node": "KSampler", + "settings": { + "steps": 32, + "sampler": "dpmpp_2m", + "scheduler": "karras", + "denoise": 1.0 + } + } + ], + "notes": [ + "SDXL responds better to softer pattern control than SD 1.5.", + "Keep end percent below 0.9 when the result feels too literal." + ] +} \ No newline at end of file diff --git a/workflow_blueprints/unified_illusion_router.json b/workflow_blueprints/unified_illusion_router.json new file mode 100644 index 0000000..4689146 --- /dev/null +++ b/workflow_blueprints/unified_illusion_router.json @@ -0,0 +1,15 @@ +{ + "name": "Unified Illusion Router", + "format": "nanobanana-illusion-preset-v1", + "target": "multi-model", + "families": { + "sd15": "workflows/sd15_qr_hidden_image.json", + "sdxl": "workflows/sdxl_qr_hidden_image.json", + "flux": "workflows/flux_ghost_hidden_image.json" + }, + "magic_slider_guidance": { + "0.0": "Nearly invisible pattern; optimized for optical illusion style.", + "0.5": "Balanced hidden structure and overall artistry.", + "1.0": "Pattern preservation prioritized for readable QR or explicit hidden text." + } +} \ No newline at end of file diff --git a/workflows/flux_ghost_hidden_image.json b/workflows/flux_ghost_hidden_image.json index 202e2cf..6e5fec6 100644 --- a/workflows/flux_ghost_hidden_image.json +++ b/workflows/flux_ghost_hidden_image.json @@ -1,67 +1,84 @@ { - "name": "FLUX Ghost Pattern Hidden Image", - "format": "nanobanana-illusion-preset-v1", - "target": "flux", - "required_models": [ - "flux1_dev_controlnet_canny.safetensors", - "your_flux_dev_base" - ], - "required_nodes": [ - "NanoBanana Pattern Preprocessor", - "NanoBanana Magic Scheduler", - "NanoBanana Latent Mask" - ], - "graph": [ - { - "step": 1, - "node": "LoadImage or NanoBanana Text Mask", - "purpose": "Load the hidden pattern as a high contrast source." + "1": { + "class_type": "IllusionTextMask", + "inputs": { + "text": "GHOST", + "width": 1024, + "height": 1024, + "font_size": 220, + "margin": 72, + "invert": false }, - { - "step": 2, - "node": "NanoBanana Pattern Preprocessor", - "settings": { - "blur_radius": 10.0, - "contrast": 1.3, - "threshold": 0.42, - "invert": false - } - }, - { - "step": 3, - "node": "NanoBanana Latent Mask", - "settings": { - "blur_radius": 18.0, - "contrast": 2.0, - "midpoint": 0.48, - "mask_strength": 0.58 - } - }, - { - "step": 4, - "node": "NanoBanana Magic Scheduler", - "settings": { - "model_family": "flux", - "magic_slider": 0.46 - } - }, - { - "step": 5, - "node": "Apply ControlNet Advanced + Set Latent Noise Mask", - "purpose": "Run the Canny ControlNet at low strength and combine it with the latent mask for early-step ghosting." - }, - { - "step": 6, - "node": "Flux sampler path", - "settings": { - "steps": 24, - "guidance": "low", - "controlnet_strength": "0.2 - 0.45" - } + "_meta": { + "title": "Optional Pattern Source - NanoBanana Text Mask" } - ], - "notes": [ - "FLUX hidden images rely on subtle control rather than brute forcing.", - "If the illusion vanishes completely, reduce blur slightly before increasing ControlNet strength." - ] -} \ No newline at end of file + }, + "2": { + "class_type": "IllusionPatternPreprocessor", + "inputs": { + "image": [ + "1", + 0 + ], + "blur_radius": 10.0, + "contrast": 1.3, + "brightness": 1.0, + "threshold": 0.42, + "invert": false + }, + "_meta": { + "title": "NanoBanana Pattern Preprocessor" + } + }, + "3": { + "class_type": "IllusionLatentMask", + "inputs": { + "image": [ + "2", + 0 + ], + "blur_radius": 18.0, + "contrast": 2.0, + "midpoint": 0.48, + "mask_strength": 0.58, + "invert": false + }, + "_meta": { + "title": "NanoBanana Latent Mask" + } + }, + "4": { + "class_type": "IllusionMagicScheduler", + "inputs": { + "model_family": "flux", + "magic_slider": 0.46 + }, + "_meta": { + "title": "NanoBanana Magic Scheduler (FLUX)" + } + }, + "5": { + "class_type": "PreviewImage", + "inputs": { + "images": [ + "2", + 0 + ] + }, + "_meta": { + "title": "Preview Processed Pattern" + } + }, + "6": { + "class_type": "PreviewImage", + "inputs": { + "images": [ + "3", + 1 + ] + }, + "_meta": { + "title": "Preview Latent Mask" + } + } +} diff --git a/workflows/sd15_qr_hidden_image.json b/workflows/sd15_qr_hidden_image.json index 3c5482c..5ef615f 100644 --- a/workflows/sd15_qr_hidden_image.json +++ b/workflows/sd15_qr_hidden_image.json @@ -1,57 +1,195 @@ { - "name": "SD 1.5 QR Hidden Image", - "format": "nanobanana-illusion-preset-v1", - "target": "sd15", - "required_models": [ - "control_v1p_sd15_qrcode_monster_v2.safetensors", - "your_sd15_checkpoint.safetensors" - ], - "required_nodes": [ - "NanoBanana Pattern Preprocessor", - "NanoBanana Magic Scheduler" - ], - "graph": [ - { - "step": 1, - "node": "LoadImage or NanoBanana Text Mask", - "purpose": "Load a logo, QR payload image, or render black and white text." + "1": { + "class_type": "IllusionTextMask", + "inputs": { + "text": "SCAN ME", + "width": 768, + "height": 768, + "font_size": 160, + "margin": 48, + "invert": false }, - { - "step": 2, - "node": "NanoBanana Pattern Preprocessor", - "settings": { - "blur_radius": 4.0, - "contrast": 1.75, - "threshold": 0.48, - "invert": false - } - }, - { - "step": 3, - "node": "NanoBanana Magic Scheduler", - "settings": { - "model_family": "sd15", - "magic_slider": 0.82 - } - }, - { - "step": 4, - "node": "Apply ControlNet Advanced", - "purpose": "Feed the processed image into QR Code Monster with the scheduler outputs driving strength and end percent." - }, - { - "step": 5, - "node": "KSampler", - "settings": { - "steps": 28, - "sampler": "dpmpp_2m_sde", - "scheduler": "karras", - "denoise": 1.0 - } + "_meta": { + "title": "Optional Pattern Source - NanoBanana Text Mask" } - ], - "notes": [ - "This is the most aggressive family and remains the easiest path for readable QR or text reveals.", - "Raise the magic slider when the encoded pattern must remain scannable." - ] -} \ No newline at end of file + }, + "2": { + "class_type": "IllusionPatternPreprocessor", + "inputs": { + "image": [ + "1", + 0 + ], + "blur_radius": 4.0, + "contrast": 1.75, + "brightness": 1.0, + "threshold": 0.48, + "invert": false + }, + "_meta": { + "title": "NanoBanana Pattern Preprocessor" + } + }, + "3": { + "class_type": "IllusionMagicScheduler", + "inputs": { + "model_family": "sd15", + "magic_slider": 0.82 + }, + "_meta": { + "title": "NanoBanana Magic Scheduler (SD 1.5)" + } + }, + "4": { + "class_type": "PreviewImage", + "inputs": { + "images": [ + "2", + 0 + ] + }, + "_meta": { + "title": "Preview Processed Pattern" + } + }, + "5": { + "class_type": "CheckpointLoaderSimple", + "inputs": { + "ckpt_name": "your_sd15_checkpoint.safetensors" + }, + "_meta": { + "title": "Pick Your SD 1.5 Checkpoint Here" + } + }, + "6": { + "class_type": "CLIPTextEncode", + "inputs": { + "text": "best quality, high contrast hidden image, optical illusion, qr code reveal", + "clip": [ + "5", + 1 + ] + }, + "_meta": { + "title": "Positive Prompt" + } + }, + "7": { + "class_type": "CLIPTextEncode", + "inputs": { + "text": "blurry, unreadable, low contrast, distorted code", + "clip": [ + "5", + 1 + ] + }, + "_meta": { + "title": "Negative Prompt" + } + }, + "8": { + "class_type": "ControlNetLoader", + "inputs": { + "control_net_name": "control_v1p_sd15_qrcode_monster_v2.safetensors" + }, + "_meta": { + "title": "Pick SD 1.5 QR ControlNet Here" + } + }, + "9": { + "class_type": "ControlNetApplyAdvanced", + "inputs": { + "positive": [ + "6", + 0 + ], + "negative": [ + "7", + 0 + ], + "control_net": [ + "8", + 0 + ], + "image": [ + "2", + 0 + ], + "strength": [ + "3", + 0 + ], + "start_percent": [ + "3", + 1 + ], + "end_percent": [ + "3", + 2 + ] + }, + "_meta": { + "title": "Apply ControlNet" + } + }, + "10": { + "class_type": "EmptyLatentImage", + "inputs": { + "width": 768, + "height": 768, + "batch_size": 1 + }, + "_meta": { + "title": "Empty Latent" + } + }, + "11": { + "class_type": "KSampler", + "inputs": { + "model": [ + "5", + 0 + ], + "seed": 42, + "steps": 28, + "cfg": [ + "3", + 3 + ], + "sampler_name": "dpmpp_2m_sde", + "scheduler": "karras", + "positive": [ + "9", + 0 + ], + "negative": [ + "9", + 1 + ], + "latent_image": [ + "10", + 0 + ], + "denoise": 1.0 + }, + "_meta": { + "title": "KSampler" + } + }, + "12": { + "class_type": "VAEDecode", + "inputs": { + "samples": [ + "11", + 0 + ], + "vae": [ + "5", + 2 + ] + }, + "_meta": { + "title": "VAE Decode" + } + } +} diff --git a/workflows/sdxl_qr_hidden_image.json b/workflows/sdxl_qr_hidden_image.json index 9db79e0..3de399d 100644 --- a/workflows/sdxl_qr_hidden_image.json +++ b/workflows/sdxl_qr_hidden_image.json @@ -1,57 +1,1034 @@ { - "name": "SDXL QR Hidden Image", - "format": "nanobanana-illusion-preset-v1", - "target": "sdxl", - "required_models": [ - "control_v04u_sdxl_opticalpattern.safetensors", - "your_sdxl_checkpoint.safetensors" - ], - "required_nodes": [ - "NanoBanana Pattern Preprocessor", - "NanoBanana Magic Scheduler" - ], - "graph": [ + "id": "00000000-0000-0000-0000-000000000000", + "revision": 0, + "last_node_id": 17, + "last_link_id": 45, + "nodes": [ { - "step": 1, - "node": "LoadImage or NanoBanana Text Mask", - "purpose": "Prepare the hidden pattern image at SDXL working resolution." + "id": 2, + "type": "IllusionPatternPreprocessor", + "pos": [ + 600, + 130 + ], + "size": [ + 328.6373046875, + 174 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 39 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 20, + 26, + 43 + ] + }, + { + "name": "mask", + "type": "MASK", + "links": null + } + ], + "properties": { + "aux_id": "GeekatplayStudio/ComfyUI-HiddenImages", + "ver": "3c21b691306c1d2af16ed05adadfd3184fc8bced", + "Node name for S&R": "IllusionPatternPreprocessor" + }, + "widgets_values": [ + 1.0, + 2.5, + 1, + 0.56, + false + ] }, { - "step": 2, - "node": "NanoBanana Pattern Preprocessor", - "settings": { - "blur_radius": 6.0, - "contrast": 1.55, - "threshold": 0.5, - "invert": false - } + "id": 3, + "type": "IllusionMagicScheduler", + "pos": [ + 100, + 488 + ], + "size": [ + 299.714453125, + 162 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "controlnet_strength", + "type": "FLOAT", + "links": [ + 27 + ] + }, + { + "name": "start_percent", + "type": "FLOAT", + "links": [ + 28 + ] + }, + { + "name": "end_percent", + "type": "FLOAT", + "links": [ + 29 + ] + }, + { + "name": "recommended_cfg", + "type": "FLOAT", + "links": [ + 31 + ] + }, + { + "name": "latent_mask_strength", + "type": "FLOAT", + "links": null + } + ], + "title": "NanoBanana Magic Scheduler (SDXL)", + "properties": { + "aux_id": "GeekatplayStudio/ComfyUI-HiddenImages", + "ver": "3c21b691306c1d2af16ed05adadfd3184fc8bced", + "Node name for S&R": "IllusionMagicScheduler" + }, + "widgets_values": [ + "sdxl", + 1 + ] }, { - "step": 3, - "node": "NanoBanana Magic Scheduler", - "settings": { - "model_family": "sdxl", - "magic_slider": 0.7 - } + "id": 7, + "type": "CLIPTextEncode", + "pos": [ + 600, + 764 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 22 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 24 + ] + } + ], + "title": "Negative Prompt", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "pattern lost, unreadable structure, low pattern contrast, silhouette drift, internal shape drift, muddy composition, deformed symbol, noisy details" + ] }, { - "step": 4, - "node": "Apply ControlNet Advanced", - "purpose": "Use the SDXL optical pattern controlnet for global composition instead of hard QR forcing." + "id": 8, + "type": "ControlNetLoader", + "pos": [ + 100, + 1008 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 25 + ] + } + ], + "title": "Pick SDXL Optical Pattern ControlNet Here", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v04u_sdxl_opticalpattern.safetensors" + ] }, { - "step": 5, - "node": "KSampler", - "settings": { - "steps": 32, - "sampler": "dpmpp_2m", - "scheduler": "karras", - "denoise": 1.0 - } + "id": 9, + "type": "ControlNetApplyAdvanced", + "pos": [ + 1100, + 286 + ], + "size": [ + 270, + 186 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 23 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 24 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 25 + }, + { + "name": "image", + "type": "IMAGE", + "link": 26 + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": 36 + }, + { + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": 27 + }, + { + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": 28 + }, + { + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": 29 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 32 + ] + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 33 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 10, + "type": "EmptyLatentImage", + "pos": [ + 100, + 1196 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 41 + }, + { + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 42 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [] + } + ], + "title": "Fallback Empty Latent", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 1024, + 1024, + 1 + ] + }, + { + "id": 11, + "type": "KSampler", + "pos": [ + 1470, + 130 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 30 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 32 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 33 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 45 + }, + { + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": 31 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 35 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 630263734976341, + "randomize", + 30, + 8, + "dpmpp_2m", + "karras", + 0.32 + ] + }, + { + "id": 5, + "type": "CheckpointLoaderSimple", + "pos": [ + 100, + 780 + ], + "size": [ + 270, + 98 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 30 + ] + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 21, + 22 + ] + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 36, + 44 + ] + } + ], + "title": "Pick Your SDXL Checkpoint Here", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "sd_xl_base_1.0_0.9vae.safetensors" + ] + }, + { + "id": 12, + "type": "VAEDecode", + "pos": [ + 1868, + 144 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 35 + }, + { + "name": "vae", + "type": "VAE", + "link": 36 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 37 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 13, + "type": "PreviewImage", + "pos": [ + 2255, + 126 + ], + "size": [ + 389, + 511 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 37 + } + ], + "outputs": [], + "title": "Generated Output With Hidden Pattern", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 4, + "type": "PreviewImage", + "pos": [ + 1114, + -85 + ], + "size": [ + 140, + 246 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 20 + } + ], + "outputs": [], + "title": "Processed Pattern Sent To ControlNet", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 14, + "type": "LoadImage", + "pos": [ + 55.7541743461804, + -294.545286860641 + ], + "size": [ + 282.798828125, + 314 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 38 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "title": "Input Pattern Image - Choose Your Source", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "Google_2015_logo.svg.png", + "image" + ] + }, + { + "id": 1, + "type": "IllusionTextMask", + "pos": [ + 17, + 132 + ], + "size": [ + 410, + 228 + ], + "flags": {}, + "order": 5, + "mode": 4, + "inputs": [], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [] + }, + { + "name": "mask", + "type": "MASK", + "links": null + } + ], + "title": "Optional Pattern Source - NanoBanana Text Mask", + "properties": { + "aux_id": "GeekatplayStudio/ComfyUI-HiddenImages", + "ver": "3c21b691306c1d2af16ed05adadfd3184fc8bced", + "Node name for S&R": "IllusionTextMask" + }, + "widgets_values": [ + "HIDDEN\nTEXT", + 1024, + 1024, + 180, + 64, + false + ] + }, + { + "id": 6, + "type": "CLIPTextEncode", + "pos": [ + 577, + 420 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 21 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 23 + ] + } + ], + "title": "Positive Prompt", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "best quality, build the new image around the loaded pattern, preserve the exact silhouette, preserve internal line structure, recognizable embedded symbol, only stylize texture and color, pattern remains clearly recoverable" + ] + }, + { + "id": 15, + "type": "ImageScaleToTotalPixels", + "pos": [ + 355, + -294 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 38 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 39, + 40 + ] + } + ], + "title": "Scale Pattern While Keeping Aspect Ratio", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "ImageScaleToTotalPixels" + }, + "widgets_values": [ + "nearest-exact", + 2.0, + 8 + ] + }, + { + "id": 16, + "type": "GetImageSize", + "pos": [ + 680, + -292 + ], + "size": [ + 187.5, + 66 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 40 + } + ], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 41 + ] + }, + { + "name": "height", + "type": "INT", + "links": [ + 42 + ] + }, + { + "name": "batch_size", + "type": "INT", + "links": null + } + ], + "title": "Read Pattern Size For Output Latent", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "GetImageSize" + }, + "widgets_values": [] + }, + { + "id": 17, + "type": "VAEEncode", + "pos": [ + 1460, + -78 + ], + "size": [ + 190, + 46 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "pixels", + "type": "IMAGE", + "link": 43 + }, + { + "name": "vae", + "type": "VAE", + "link": 44 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 45 + ] + } + ], + "title": "Strong Pattern Anchor (VAE Encode)", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "VAEEncode" + }, + "widgets_values": [] } ], - "notes": [ - "SDXL responds better to softer pattern control than SD 1.5.", - "Keep end percent below 0.9 when the result feels too literal." - ] -} \ No newline at end of file + "links": [ + [ + 20, + 2, + 0, + 4, + 0, + "IMAGE" + ], + [ + 21, + 5, + 1, + 6, + 0, + "CLIP" + ], + [ + 22, + 5, + 1, + 7, + 0, + "CLIP" + ], + [ + 23, + 6, + 0, + 9, + 0, + "CONDITIONING" + ], + [ + 24, + 7, + 0, + 9, + 1, + "CONDITIONING" + ], + [ + 25, + 8, + 0, + 9, + 2, + "CONTROL_NET" + ], + [ + 26, + 2, + 0, + 9, + 3, + "IMAGE" + ], + [ + 27, + 3, + 0, + 9, + 5, + "FLOAT" + ], + [ + 28, + 3, + 1, + 9, + 6, + "FLOAT" + ], + [ + 29, + 3, + 2, + 9, + 7, + "FLOAT" + ], + [ + 30, + 5, + 0, + 11, + 0, + "MODEL" + ], + [ + 31, + 3, + 3, + 11, + 4, + "FLOAT" + ], + [ + 32, + 9, + 0, + 11, + 1, + "CONDITIONING" + ], + [ + 33, + 9, + 1, + 11, + 2, + "CONDITIONING" + ], + [ + 35, + 11, + 0, + 12, + 0, + "LATENT" + ], + [ + 36, + 5, + 2, + 12, + 1, + "VAE" + ], + [ + 37, + 12, + 0, + 13, + 0, + "IMAGE" + ], + [ + 38, + 14, + 0, + 15, + 0, + "IMAGE" + ], + [ + 39, + 15, + 0, + 2, + 0, + "IMAGE" + ], + [ + 40, + 15, + 0, + 16, + 0, + "IMAGE" + ], + [ + 41, + 16, + 0, + 10, + 0, + "INT" + ], + [ + 42, + 16, + 1, + 10, + 1, + "INT" + ], + [ + 43, + 2, + 0, + 17, + 0, + "IMAGE" + ], + [ + 44, + 5, + 2, + 17, + 1, + "VAE" + ], + [ + 45, + 17, + 0, + 11, + 3, + "LATENT" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 1.2100000000000002, + "offset": [ + 296.77673116089636, + 152.27385949291283 + ] + }, + "frontendVersion": "1.42.8", + "VHS_latentpreview": false, + "VHS_latentpreviewrate": 0, + "VHS_MetadataImage": true, + "VHS_KeepIntermediate": true + }, + "version": 0.4 +} diff --git a/workflows/sdxl_qr_hidden_image_ultra_strong.json b/workflows/sdxl_qr_hidden_image_ultra_strong.json new file mode 100644 index 0000000..a67f454 --- /dev/null +++ b/workflows/sdxl_qr_hidden_image_ultra_strong.json @@ -0,0 +1,1160 @@ +{ + "id": "00000000-0000-0000-0000-000000000000", + "revision": 0, + "last_node_id": 19, + "last_link_id": 52, + "nodes": [ + { + "id": 2, + "type": "IllusionPatternPreprocessor", + "pos": [ + 600, + 130 + ], + "size": [ + 328.6373046875, + 174 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 39 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 20, + 26, + 43, + 51 + ] + }, + { + "name": "mask", + "type": "MASK", + "links": null + } + ], + "properties": { + "aux_id": "GeekatplayStudio/ComfyUI-HiddenImages", + "ver": "3c21b691306c1d2af16ed05adadfd3184fc8bced", + "Node name for S&R": "IllusionPatternPreprocessor" + }, + "widgets_values": [ + 1.8, + 2.2, + 1, + 0.54, + false + ] + }, + { + "id": 3, + "type": "IllusionMagicScheduler", + "pos": [ + 100, + 488 + ], + "size": [ + 299.714453125, + 162 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "controlnet_strength", + "type": "FLOAT", + "links": [ + 27 + ] + }, + { + "name": "start_percent", + "type": "FLOAT", + "links": [ + 28 + ] + }, + { + "name": "end_percent", + "type": "FLOAT", + "links": [ + 29 + ] + }, + { + "name": "recommended_cfg", + "type": "FLOAT", + "links": [ + 31 + ] + }, + { + "name": "latent_mask_strength", + "type": "FLOAT", + "links": null + } + ], + "title": "NanoBanana Magic Scheduler (SDXL Ultra Strong)", + "properties": { + "aux_id": "GeekatplayStudio/ComfyUI-HiddenImages", + "ver": "3c21b691306c1d2af16ed05adadfd3184fc8bced", + "Node name for S&R": "IllusionMagicScheduler" + }, + "widgets_values": [ + "sdxl", + 0.92 + ] + }, + { + "id": 7, + "type": "CLIPTextEncode", + "pos": [ + 600, + 764 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 22 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 24 + ] + } + ], + "title": "Negative Prompt (Ultra Strong Pattern Lock)", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "pattern lost, unreadable structure, low pattern contrast, silhouette drift, internal shape drift, muddy composition, deformed symbol, noisy details, raw source pattern only, flat grayscale guide, unrendered scaffold, monochrome, black and white, simple logo, plain line art" + ] + }, + { + "id": 8, + "type": "ControlNetLoader", + "pos": [ + 100, + 1008 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 25 + ] + } + ], + "title": "Pick SDXL Optical Pattern ControlNet Here", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v04u_sdxl_opticalpattern.safetensors" + ] + }, + { + "id": 9, + "type": "ControlNetApplyAdvanced", + "pos": [ + 1100, + 286 + ], + "size": [ + 270, + 186 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 23 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 24 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 25 + }, + { + "name": "image", + "type": "IMAGE", + "link": 26 + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": 36 + }, + { + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": 27 + }, + { + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": 28 + }, + { + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": 29 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 32 + ] + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 33 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 10, + "type": "EmptyLatentImage", + "pos": [ + 100, + 1196 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 41 + }, + { + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 42 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 47 + ] + } + ], + "title": "Fallback Empty Latent", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 1024, + 1024, + 1 + ] + }, + { + "id": 11, + "type": "KSampler", + "pos": [ + 1470, + 130 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 30 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 32 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 33 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 48 + }, + { + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": 31 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 35 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 630263734976341, + "randomize", + 34, + 8, + "dpmpp_2m", + "karras", + 1.0 + ] + }, + { + "id": 5, + "type": "CheckpointLoaderSimple", + "pos": [ + 100, + 780 + ], + "size": [ + 270, + 98 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 30 + ] + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 21, + 22 + ] + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 36, + 44 + ] + } + ], + "title": "Pick Your SDXL Checkpoint Here", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "sd_xl_base_1.0_0.9vae.safetensors" + ] + }, + { + "id": 12, + "type": "VAEDecode", + "pos": [ + 1868, + 144 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 35 + }, + { + "name": "vae", + "type": "VAE", + "link": 36 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 37 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 13, + "type": "PreviewImage", + "pos": [ + 2255, + 126 + ], + "size": [ + 389, + 511 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 52 + } + ], + "outputs": [], + "title": "Rendered Output With Hidden Pattern (Ultra Strong)", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 4, + "type": "PreviewImage", + "pos": [ + 1114, + -85 + ], + "size": [ + 140, + 246 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 20 + } + ], + "outputs": [], + "title": "Processed Pattern Sent To ControlNet", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 14, + "type": "LoadImage", + "pos": [ + 55.7541743461804, + -294.545286860641 + ], + "size": [ + 282.798828125, + 314 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 38 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "title": "Input Pattern Image - Choose Your Source", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "Google_2015_logo.svg.png", + "image" + ] + }, + { + "id": 1, + "type": "IllusionTextMask", + "pos": [ + 17, + 132 + ], + "size": [ + 410, + 228 + ], + "flags": {}, + "order": 5, + "mode": 4, + "inputs": [], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [] + }, + { + "name": "mask", + "type": "MASK", + "links": null + } + ], + "title": "Optional Pattern Source - NanoBanana Text Mask", + "properties": { + "aux_id": "GeekatplayStudio/ComfyUI-HiddenImages", + "ver": "3c21b691306c1d2af16ed05adadfd3184fc8bced", + "Node name for S&R": "IllusionTextMask" + }, + "widgets_values": [ + "HIDDEN\nTEXT", + 1024, + 1024, + 180, + 64, + false + ] + }, + { + "id": 6, + "type": "CLIPTextEncode", + "pos": [ + 577, + 420 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 21 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 23 + ] + } + ], + "title": "Positive Prompt - Replace With Your Subject", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "a richly rendered surreal poster illustration, vibrant full color, dramatic lighting, layered textures, atmospheric depth, best quality, render a complete new image over the loaded pattern, use the loaded pattern only as a hidden scaffold, preserve the exact silhouette and internal line structure, keep the embedded symbol obvious and recoverable" + ] + }, + { + "id": 15, + "type": "ImageScaleToTotalPixels", + "pos": [ + 355, + -294 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 38 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 39, + 40 + ] + } + ], + "title": "Scale Pattern While Keeping Aspect Ratio", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "ImageScaleToTotalPixels" + }, + "widgets_values": [ + "nearest-exact", + 2.5, + 8 + ] + }, + { + "id": 16, + "type": "GetImageSize", + "pos": [ + 680, + -292 + ], + "size": [ + 187.5, + 66 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 40 + } + ], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 41 + ] + }, + { + "name": "height", + "type": "INT", + "links": [ + 42 + ] + }, + { + "name": "batch_size", + "type": "INT", + "links": null + } + ], + "title": "Read Pattern Size For Output Latent", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "GetImageSize" + }, + "widgets_values": [] + }, + { + "id": 17, + "type": "VAEEncode", + "pos": [ + 1460, + -78 + ], + "size": [ + 190, + 46 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "pixels", + "type": "IMAGE", + "link": 43 + }, + { + "name": "vae", + "type": "VAE", + "link": 44 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 45 + ] + } + ], + "title": "Strong Pattern Anchor (VAE Encode Ultra Strong)", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "VAEEncode" + }, + "widgets_values": [] + }, + { + "id": 18, + "type": "LatentBlend", + "pos": [ + 1735, + -70 + ], + "size": [ + 220, + 82 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "samples1", + "type": "LATENT", + "link": 45 + }, + { + "name": "samples2", + "type": "LATENT", + "link": 47 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 48 + ] + } + ], + "title": "Blend Pattern With Empty Latent", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "LatentBlend" + }, + "widgets_values": [ + 0.12 + ] + }, + { + "id": 19, + "type": "ImageBlend", + "pos": [ + 2105, + 142 + ], + "size": [ + 220, + 86 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 37 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 51 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 52 + ] + } + ], + "title": "Blend Hidden Pattern Back Into Render", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "ImageBlend" + }, + "widgets_values": [ + 0.14, + "soft_light" + ] + } + ], + "links": [ + [ + 20, + 2, + 0, + 4, + 0, + "IMAGE" + ], + [ + 21, + 5, + 1, + 6, + 0, + "CLIP" + ], + [ + 22, + 5, + 1, + 7, + 0, + "CLIP" + ], + [ + 23, + 6, + 0, + 9, + 0, + "CONDITIONING" + ], + [ + 24, + 7, + 0, + 9, + 1, + "CONDITIONING" + ], + [ + 25, + 8, + 0, + 9, + 2, + "CONTROL_NET" + ], + [ + 26, + 2, + 0, + 9, + 3, + "IMAGE" + ], + [ + 27, + 3, + 0, + 9, + 5, + "FLOAT" + ], + [ + 28, + 3, + 1, + 9, + 6, + "FLOAT" + ], + [ + 29, + 3, + 2, + 9, + 7, + "FLOAT" + ], + [ + 30, + 5, + 0, + 11, + 0, + "MODEL" + ], + [ + 31, + 3, + 3, + 11, + 4, + "FLOAT" + ], + [ + 32, + 9, + 0, + 11, + 1, + "CONDITIONING" + ], + [ + 33, + 9, + 1, + 11, + 2, + "CONDITIONING" + ], + [ + 35, + 11, + 0, + 12, + 0, + "LATENT" + ], + [ + 36, + 5, + 2, + 12, + 1, + "VAE" + ], + [ + 37, + 12, + 0, + 19, + 0, + "IMAGE" + ], + [ + 38, + 14, + 0, + 15, + 0, + "IMAGE" + ], + [ + 39, + 15, + 0, + 2, + 0, + "IMAGE" + ], + [ + 40, + 15, + 0, + 16, + 0, + "IMAGE" + ], + [ + 41, + 16, + 0, + 10, + 0, + "INT" + ], + [ + 42, + 16, + 1, + 10, + 1, + "INT" + ], + [ + 43, + 2, + 0, + 17, + 0, + "IMAGE" + ], + [ + 44, + 5, + 2, + 17, + 1, + "VAE" + ], + [ + 45, + 17, + 0, + 18, + 0, + "LATENT" + ], + [ + 47, + 10, + 0, + 18, + 1, + "LATENT" + ], + [ + 48, + 18, + 0, + 11, + 3, + "LATENT" + ], + [ + 51, + 2, + 0, + 19, + 1, + "IMAGE" + ], + [ + 52, + 19, + 0, + 13, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 1.2100000000000002, + "offset": [ + 296.77673116089636, + 152.27385949291283 + ] + }, + "frontendVersion": "1.42.8", + "VHS_latentpreview": false, + "VHS_latentpreviewrate": 0, + "VHS_MetadataImage": true, + "VHS_KeepIntermediate": true + }, + "version": 0.4 +} diff --git a/workflows/unified_illusion_router.json b/workflows/unified_illusion_router.json index 4689146..98bfc8e 100644 --- a/workflows/unified_illusion_router.json +++ b/workflows/unified_illusion_router.json @@ -1,15 +1,58 @@ { - "name": "Unified Illusion Router", - "format": "nanobanana-illusion-preset-v1", - "target": "multi-model", - "families": { - "sd15": "workflows/sd15_qr_hidden_image.json", - "sdxl": "workflows/sdxl_qr_hidden_image.json", - "flux": "workflows/flux_ghost_hidden_image.json" + "1": { + "class_type": "IllusionTextMask", + "inputs": { + "text": "NANOBANANA", + "width": 1024, + "height": 1024, + "font_size": 180, + "margin": 64, + "invert": false + }, + "_meta": { + "title": "Sample Pattern" + } }, - "magic_slider_guidance": { - "0.0": "Nearly invisible pattern; optimized for optical illusion style.", - "0.5": "Balanced hidden structure and overall artistry.", - "1.0": "Pattern preservation prioritized for readable QR or explicit hidden text." + "2": { + "class_type": "PreviewImage", + "inputs": { + "images": [ + "1", + 0 + ] + }, + "_meta": { + "title": "Pattern Preview" + } + }, + "3": { + "class_type": "IllusionMagicScheduler", + "inputs": { + "model_family": "sd15", + "magic_slider": 0.82 + }, + "_meta": { + "title": "SD 1.5 Guidance" + } + }, + "4": { + "class_type": "IllusionMagicScheduler", + "inputs": { + "model_family": "sdxl", + "magic_slider": 0.7 + }, + "_meta": { + "title": "SDXL Guidance" + } + }, + "5": { + "class_type": "IllusionMagicScheduler", + "inputs": { + "model_family": "flux", + "magic_slider": 0.46 + }, + "_meta": { + "title": "FLUX Guidance" + } } -} \ No newline at end of file +}