From fd35bb8e62a7835fa31f20f57a96a2151784ca2f Mon Sep 17 00:00:00 2001 From: Corey Ryan Hanson <2010074-coreyryanhanson@users.noreply.gitlab.com> Date: Mon, 14 Aug 2023 02:36:20 +0000 Subject: [PATCH] Ability to seperate function patterns --- README.md | 37 +- examples/module-driven-control-net.json | 94 +- ...isy-latent-split-controlnet-validated.json | 2863 +++++++++++++++++ examples/noisy-latent-split-controlnet.json | 2640 +++++++++++++++ img/badgers_levels_adjusted.png | Bin 0 -> 1546544 bytes qr_nodes.py | 89 +- 6 files changed, 5671 insertions(+), 52 deletions(-) create mode 100644 examples/noisy-latent-split-controlnet-validated.json create mode 100644 examples/noisy-latent-split-controlnet.json create mode 100644 img/badgers_levels_adjusted.png diff --git a/README.md b/README.md index c0ea671..3409411 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,11 @@ A set of ComfyUI nodes to dynamically create QR image layers for generative QR art without the hassle of leaving the webui. +Everything in this pack is for the purpose of creating patterns. If you would like to evaluate rendered patterns for scannability, check out the companion project [Comfy QR Validation Nodes](https://gitlab.com/sofuego-comfy-nodes/comfy-qr-validation-nodes). Any workflow in the example that ends with "validated" assume the installation of the validation pack as well. + This repository is managed publicly on [Gitlab](https://gitlab.com/sofuego-comfy-nodes/comfy-qr), but also mirrored on [Github](https://github.com/coreyryanhanson/comfy-qr). Please submit any [issues](https://gitlab.com/sofuego-comfy-nodes/comfy-qr/-/issues) or [pull requests](https://gitlab.com/sofuego-comfy-nodes/comfy-qr/-/merge_requests) to the gitlab repo. -![QR code with repo link](img/badgers.png) +![QR code with repo link](img/badgers_levels_adjusted.png) ## Getting started @@ -71,6 +73,37 @@ A QR code fixed to specific output dimensions through image resampling. * `IMAGE` - The QR code * `QR_VERSION` - An integer of the QR version that was selected based on the text length and error correction level. +### QR Code (Split) + +A version of the `QR Code` node that also outputs split layers for the function patterns and a mask for the function patterns. + +#### Inputs + +* `protocol` - If enabled this will prefix the textbox input with a preset to represent the internet protocol. This is included both for convenience and as a workaround for the textbox clipping strings with this character combination. + * `Http` - Adds "http://" before the text. + * `Https` - Adds "https://" before the text. + * `None` - Uses only the contents of the `text` box. +* `text` - What text to build your QR code with. If `protocol` is specified, this textbox will be combined it with the selected option. +* `module_size` - The pixel width of the smallest unit of a QR code. +* `max_image_size` - The maximum size of the resulting QR code. If the combination of `text`, `module_size`, and `error_correction` create dimensions that exceed this, an error will halt the pipeline. +* `fill_hexcolor` - A string of characters representing the hex value of the QR units. Can be 3 or 6 hexadecimal characters with an optional # before. +* `back_hexcolor` - A string of characters representing the hex value of the space around the QR units. Can be 3 or 6 hexadecimal characters with an optional # before. +* `error_correction` - The level of error correction to apply. + * `Low` - 7% error correction. + * `Medium` - 15% error correction. + * `Quartile` - 25% error correction. + * `High` - 30% error correction. +* `border` - The border size (In multiples of `module` widths) + +#### Outputs + +* `QR_FLATTENED` - The QR code +* `MODULE_LAYER` - The QR code with the `back_hexcolor` filling in the function patterns (to remove their influence from the early diffusion steps). +* `FINDER_LAYER` - The isolated finder patterns over the `back_hexcolor`. +* `FINDER_MASK` - A mask that isolates the locations of the 3 finder patterns. +* `QR_VERSION` - An integer of the QR version that was selected based on the text length and error correction level. +* `IMAGE_SIZE` - An integer based on the pixel width of the resulting QR code. + ## Future updates -If the solution is clean enough, I plan on implementing a node that will automatically generate a mask to extract the 3 QR markers (based on `module_size`, `border`, and `QR_VERSION`) for more advanced workflows. \ No newline at end of file +If the solution is clean enough and if it can definitively improve scanability, there may be additional plans for the seperation of alignment patterns (based on `module_size`, `border`, and `QR_VERSION`) for more advanced workflows. diff --git a/examples/module-driven-control-net.json b/examples/module-driven-control-net.json index d050439..d2de4d4 100644 --- a/examples/module-driven-control-net.json +++ b/examples/module-driven-control-net.json @@ -127,10 +127,10 @@ 678, 604 ], - "size": [ - 315, - 106 - ], + "size": { + "0": 315, + "1": 106 + }, "flags": {}, "order": 5, "mode": 0, @@ -312,7 +312,7 @@ "Node name for S&R": "KSampler" }, "widgets_values": [ - 679629273700059, + 483918444996335, "randomize", 20, 8, @@ -321,6 +321,45 @@ 1 ] }, + { + "id": 8, + "type": "CLIPTextEncode", + "pos": [ + 656, + 351 + ], + "size": { + "0": 400, + "1": 200 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 3 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 23 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "worst quality" + ] + }, { "id": 14, "type": "comfy-qr-by-module-size", @@ -371,55 +410,16 @@ 16, 512, "#000000", - "#999999", + "#FFFFFF", "Medium", 1 ] }, - { - "id": 8, - "type": "CLIPTextEncode", - "pos": [ - 656, - 351 - ], - "size": { - "0": 400, - "1": 200 - }, - "flags": {}, - "order": 4, - "mode": 0, - "inputs": [ - { - "name": "clip", - "type": "CLIP", - "link": 3 - } - ], - "outputs": [ - { - "name": "CONDITIONING", - "type": "CONDITIONING", - "links": [ - 23 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "CLIPTextEncode" - }, - "widgets_values": [ - "worst quality" - ] - }, { "id": 17, "type": "ControlNetApplyAdvanced", "pos": [ - 808, + 804, 796 ], "size": { @@ -475,7 +475,7 @@ "Node name for S&R": "ControlNetApplyAdvanced" }, "widgets_values": [ - 2.49999999999999, + 1.6, 0, 1 ] diff --git a/examples/noisy-latent-split-controlnet-validated.json b/examples/noisy-latent-split-controlnet-validated.json new file mode 100644 index 0000000..2dde4cf --- /dev/null +++ b/examples/noisy-latent-split-controlnet-validated.json @@ -0,0 +1,2863 @@ +{ + "last_node_id": 69, + "last_link_id": 158, + "nodes": [ + { + "id": 13, + "type": "VAEDecode", + "pos": [ + 1272, + 671 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 34, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 63 + }, + { + "name": "vae", + "type": "VAE", + "link": 11 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 25, + 28 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 21, + "type": "ImagePadForOutpaint", + "pos": [ + 1227, + 790 + ], + "size": { + "0": 315, + "1": 174 + }, + "flags": {}, + "order": 35, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 25 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 26 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "ImagePadForOutpaint" + }, + "widgets_values": [ + 40, + 40, + 40, + 40, + 0 + ] + }, + { + "id": 19, + "type": "comfy-qr-read", + "pos": [ + 1243, + 1046 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 36, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 26 + } + ], + "outputs": [ + { + "name": "EXTRACTED_TEXT", + "type": "STRING", + "links": [ + 27 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "comfy-qr-read" + }, + "widgets_values": [ + "pyzbar" + ] + }, + { + "id": 47, + "type": "MaskToImage", + "pos": [ + -242, + 776 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 104 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 49, + "type": "MaskComposite", + "pos": [ + 25, + 841 + ], + "size": { + "0": 315, + "1": 126 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "MASK", + "link": 107 + }, + { + "name": "source", + "type": "MASK", + "link": 106 + }, + { + "name": "x", + "type": "INT", + "link": 117, + "widget": { + "name": "x", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "y", + "type": "INT", + "link": 121, + "widget": { + "name": "y", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 124 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskComposite" + }, + "widgets_values": [ + 48, + 48, + "add" + ] + }, + { + "id": 44, + "type": "ImageCompositeMasked", + "pos": [ + 29, + 663 + ], + "size": { + "0": 315, + "1": 122 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "IMAGE", + "link": 146 + }, + { + "name": "source", + "type": "IMAGE", + "link": 127 + }, + { + "name": "mask", + "type": "MASK", + "link": null + }, + { + "name": "x", + "type": "INT", + "link": 115, + "widget": { + "name": "x", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "y", + "type": "INT", + "link": 120, + "widget": { + "name": "y", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 123, + 132 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Finder Layer Composite", + "properties": { + "Node name for S&R": "ImageCompositeMasked" + }, + "widgets_values": [ + 48, + 48 + ] + }, + { + "id": 8, + "type": "CLIPTextEncode", + "pos": [ + 372, + 47 + ], + "size": { + "0": 400, + "1": 200 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 3 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 23, + 34, + 88 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Negative Prompt", + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "worst quality" + ] + }, + { + "id": 7, + "type": "CLIPTextEncode", + "pos": [ + 376, + -201 + ], + "size": { + "0": 400, + "1": 200 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 2 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 17, + 87 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Positive Prompt", + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "Hot lava" + ] + }, + { + "id": 39, + "type": "comfy-qr-by-module-split", + "pos": [ + -422, + 353 + ], + "size": [ + 400, + 344 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 155, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + }, + { + "name": "protocol", + "type": "Http,Https,None", + "link": 156, + "widget": { + "name": "protocol", + "config": [ + [ + "Http", + "Https", + "None" + ], + { + "default": "Https" + } + ] + } + } + ], + "outputs": [ + { + "name": "QR_FLATTENED", + "type": "IMAGE", + "links": [ + 102 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MODULE_LAYER", + "type": "IMAGE", + "links": [ + 126 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "FINDER_LAYER", + "type": "IMAGE", + "links": [ + 127 + ], + "shape": 3, + "slot_index": 2 + }, + { + "name": "FINDER_MASK", + "type": "MASK", + "links": [ + 104, + 106 + ], + "shape": 3, + "slot_index": 3 + }, + { + "name": "QR_VERSION", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "IMAGE_SIZE", + "type": "INT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "comfy-qr-by-module-split" + }, + "widgets_values": [ + "Https", + "gitlab.com/sofuego-comfy-nodes/comfy-qr", + 16, + 768, + "#000000", + "#FFFFFF", + "High", + 1 + ] + }, + { + "id": 54, + "type": "PrimitiveNode", + "pos": [ + -594, + 733 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 114, + 115, + 116, + 117 + ], + "slot_index": 0, + "widget": { + "name": "x", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "title": "X Offset", + "properties": {}, + "widgets_values": [ + 48, + "fixed" + ] + }, + { + "id": 55, + "type": "PrimitiveNode", + "pos": [ + -592, + 863 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 118, + 119, + 120, + 121 + ], + "slot_index": 0, + "widget": { + "name": "y", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "title": "Y Offset", + "properties": {}, + "widgets_values": [ + 48, + "fixed" + ] + }, + { + "id": 29, + "type": "LatentCompositeMasked", + "pos": [ + 1234, + 432 + ], + "size": { + "0": 315, + "1": 122 + }, + "flags": {}, + "order": 32, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "LATENT", + "link": 57 + }, + { + "name": "source", + "type": "LATENT", + "link": 65 + }, + { + "name": "mask", + "type": "MASK", + "link": 124 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 64 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "LatentCompositeMasked" + }, + "widgets_values": [ + 0, + 0 + ] + }, + { + "id": 18, + "type": "ControlNetLoader", + "pos": [ + 27, + 217 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 19, + 35, + 92 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v1p_sd15_qrcode_monster_v2.safetensors" + ] + }, + { + "id": 20, + "type": "comfy-qr-validate", + "pos": [ + 1581, + 685 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 37, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 28 + }, + { + "name": "extracted_text", + "type": "STRING", + "link": 27 + }, + { + "name": "protocol", + "type": "Http,Https,None", + "link": 157, + "widget": { + "name": "protocol", + "config": [ + [ + "Http", + "Https", + "None" + ], + { + "default": "Https" + } + ] + } + }, + { + "name": "text", + "type": "STRING", + "link": 158, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 130 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "VALIDATION_CODE", + "type": "INT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "comfy-qr-validate" + }, + "widgets_values": [ + "Https", + "gitlab.com/sofuego-comfy-nodes/comfy-qr", + "False" + ] + }, + { + "id": 23, + "type": "ControlNetApplyAdvanced", + "pos": [ + 480, + 809 + ], + "size": { + "0": 315, + "1": 166 + }, + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 135 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 34 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 35 + }, + { + "name": "image", + "type": "IMAGE", + "link": 123 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 136 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 48 + ], + "shape": 3, + "slot_index": 1 + } + ], + "title": "ControlNet (FG)", + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 3, + 0, + 1 + ] + }, + { + "id": 57, + "type": "CLIPTextEncode", + "pos": [ + 413, + 1033 + ], + "size": { + "0": 400, + "1": 200 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 134 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 135 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Finder Layer Prompt", + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "Yellow with black markings" + ] + }, + { + "id": 36, + "type": "VAEEncode", + "pos": [ + 522, + 689 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 29, + "mode": 0, + "inputs": [ + { + "name": "pixels", + "type": "IMAGE", + "link": 132 + }, + { + "name": "vae", + "type": "VAE", + "link": 78 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 80 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "VAE Encode (FG)", + "properties": { + "Node name for S&R": "VAEEncode" + } + }, + { + "id": 63, + "type": "VAEEncode", + "pos": [ + 519, + 550 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "pixels", + "type": "IMAGE", + "link": 140 + }, + { + "name": "vae", + "type": "VAE", + "link": 141 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 139 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "VAE Encode (BG)", + "properties": { + "Node name for S&R": "VAEEncode" + } + }, + { + "id": 52, + "type": "PrimitiveNode", + "pos": [ + -591, + 991 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 110, + 112 + ], + "slot_index": 0, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "title": "Width", + "properties": {}, + "widgets_values": [ + 768, + "fixed" + ] + }, + { + "id": 53, + "type": "PrimitiveNode", + "pos": [ + -593, + 1130 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 111, + 113, + 144, + 145 + ], + "slot_index": 0, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "title": "Height", + "properties": {}, + "widgets_values": [ + 768, + "fixed" + ] + }, + { + "id": 64, + "type": "SolidMask", + "pos": [ + -344, + 1263 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 144, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 145, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 142 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "SolidMask (White)", + "properties": { + "Node name for S&R": "SolidMask" + }, + "widgets_values": [ + 1, + 768, + 768 + ] + }, + { + "id": 40, + "type": "SolidMask", + "pos": [ + -347, + 949 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 110, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 111, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 100 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "SolidMask (Grey)", + "properties": { + "Node name for S&R": "SolidMask" + }, + "widgets_values": [ + 0.5, + 768, + 768 + ] + }, + { + "id": 42, + "type": "ImageCompositeMasked", + "pos": [ + 30, + 322 + ], + "size": { + "0": 315, + "1": 122 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "IMAGE", + "link": 153 + }, + { + "name": "source", + "type": "IMAGE", + "link": 102 + }, + { + "name": "mask", + "type": "MASK", + "link": null + }, + { + "name": "x", + "type": "INT", + "link": 116, + "widget": { + "name": "x", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "y", + "type": "INT", + "link": 118, + "widget": { + "name": "y", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 125 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "QR Flattened Composite", + "properties": { + "Node name for S&R": "ImageCompositeMasked" + }, + "widgets_values": [ + 48, + 48 + ] + }, + { + "id": 43, + "type": "ImageCompositeMasked", + "pos": [ + 42, + 491 + ], + "size": { + "0": 315, + "1": 122 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "IMAGE", + "link": 154 + }, + { + "name": "source", + "type": "IMAGE", + "link": 126 + }, + { + "name": "mask", + "type": "MASK", + "link": null + }, + { + "name": "x", + "type": "INT", + "link": 114, + "widget": { + "name": "x", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "y", + "type": "INT", + "link": 119, + "widget": { + "name": "y", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 122, + 140 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Module Layer Composite", + "properties": { + "Node name for S&R": "ImageCompositeMasked" + }, + "widgets_values": [ + 48, + 48 + ] + }, + { + "id": 65, + "type": "MaskToImage", + "pos": [ + 32, + 1267 + ], + "size": { + "0": 195.12049865722656, + "1": 26 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 142 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 146 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Solid (White)", + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 50, + "type": "SolidMask", + "pos": [ + -345, + 1106 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 112, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 113, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 107, + 151 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "SolidMask (Black)", + "properties": { + "Node name for S&R": "SolidMask" + }, + "widgets_values": [ + 0, + 768, + 768 + ] + }, + { + "id": 67, + "type": "MaskToImage", + "pos": [ + 36, + 1144 + ], + "size": { + "0": 195.12049865722656, + "1": 26 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 151 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Solid (Black)", + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 24, + "type": "KSamplerAdvanced", + "pos": [ + 878, + -37 + ], + "size": { + "0": 315, + "1": 546 + }, + "flags": {}, + "order": 30, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 40 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 89 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 38 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 139 + }, + { + "name": "end_at_step", + "type": "INT", + "link": 45, + "widget": { + "name": "end_at_step", + "config": [ + "INT", + { + "default": 10000, + "min": 0, + "max": 10000 + } + ] + } + }, + { + "name": "steps", + "type": "INT", + "link": 82, + "widget": { + "name": "steps", + "config": [ + "INT", + { + "default": 20, + "min": 1, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 57 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "KSampler (BG)", + "properties": { + "Node name for S&R": "KSamplerAdvanced" + }, + "widgets_values": [ + "enable", + 1004190433642169, + "randomize", + 25, + 8, + "euler_ancestral", + "normal", + 0, + 13, + "enable" + ] + }, + { + "id": 30, + "type": "KSamplerAdvanced", + "pos": [ + 1634, + 25 + ], + "size": { + "0": 315, + "1": 542 + }, + "flags": {}, + "order": 33, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 62 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 90 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 91 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 64 + }, + { + "name": "start_at_step", + "type": "INT", + "link": 58, + "widget": { + "name": "start_at_step", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 10000 + } + ] + } + }, + { + "name": "steps", + "type": "INT", + "link": 84, + "widget": { + "name": "steps", + "config": [ + "INT", + { + "default": 20, + "min": 1, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 63 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "KSampler (Combined)", + "properties": { + "Node name for S&R": "KSamplerAdvanced" + }, + "widgets_values": [ + "disable", + 399768739536783, + "randomize", + 25, + 8, + "euler_ancestral", + "normal", + 13, + 10000, + "disable" + ] + }, + { + "id": 37, + "type": "PrimitiveNode", + "pos": [ + 991, + -189 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 82, + 83, + 84 + ], + "slot_index": 0, + "widget": { + "name": "steps", + "config": [ + "INT", + { + "default": 20, + "min": 1, + "max": 10000 + } + ] + } + } + ], + "title": "Steps", + "properties": {}, + "widgets_values": [ + 25, + "fixed" + ] + }, + { + "id": 17, + "type": "ControlNetApplyAdvanced", + "pos": [ + 471, + 294 + ], + "size": { + "0": 315, + "1": 166 + }, + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 17 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 23 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 19 + }, + { + "name": "image", + "type": "IMAGE", + "link": 122 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 89 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 38 + ], + "shape": 3, + "slot_index": 1 + } + ], + "title": "ControlNet (BG)", + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 1.4000000000000001, + 0, + 1 + ] + }, + { + "id": 27, + "type": "KSamplerAdvanced", + "pos": [ + 872, + 571 + ], + "size": { + "0": 315, + "1": 546 + }, + "flags": {}, + "order": 31, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 46 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 136 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 48 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 80 + }, + { + "name": "end_at_step", + "type": "INT", + "link": 44, + "widget": { + "name": "end_at_step", + "config": [ + "INT", + { + "default": 10000, + "min": 0, + "max": 10000 + } + ] + } + }, + { + "name": "steps", + "type": "INT", + "link": 83, + "widget": { + "name": "steps", + "config": [ + "INT", + { + "default": 20, + "min": 1, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 65 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "KSampler (FG)", + "properties": { + "Node name for S&R": "KSamplerAdvanced" + }, + "widgets_values": [ + "enable", + 604210257117158, + "randomize", + 25, + 8, + "euler", + "normal", + 2, + 13, + "enable" + ] + }, + { + "id": 12, + "type": "SaveImage", + "pos": [ + 2032, + 646 + ], + "size": { + "0": 315, + "1": 270 + }, + "flags": {}, + "order": 38, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 130 + } + ], + "properties": {}, + "widgets_values": [ + "ComfyUI" + ] + }, + { + "id": 28, + "type": "PrimitiveNode", + "pos": [ + 1235, + -191 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 44, + 45, + 58 + ], + "slot_index": 0, + "widget": { + "name": "end_at_step", + "config": [ + "INT", + { + "default": 10000, + "min": 0, + "max": 10000 + } + ] + } + } + ], + "title": "Seperation Step", + "properties": {}, + "widgets_values": [ + 13, + "fixed" + ] + }, + { + "id": 38, + "type": "ControlNetApplyAdvanced", + "pos": [ + 1235, + 204 + ], + "size": { + "0": 315, + "1": 166 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 87 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 88 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 92 + }, + { + "name": "image", + "type": "IMAGE", + "link": 125 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 90 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 91 + ], + "shape": 3, + "slot_index": 1 + } + ], + "title": "ControlNet (Combined)", + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 1.5, + 0, + 1 + ] + }, + { + "id": 6, + "type": "CheckpointLoaderSimple", + "pos": [ + 24, + 53 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 40, + 46, + 62 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 2, + 3, + 134 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 11, + 78, + 141 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "1.5/v1-5-pruned-emaonly.safetensors" + ] + }, + { + "id": 41, + "type": "MaskToImage", + "pos": [ + -247, + 864 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 100 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 153, + 154 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Solid (Grey)", + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 68, + "type": "PrimitiveNode", + "pos": [ + -422, + 208 + ], + "size": { + "0": 210, + "1": 76 + }, + "flags": {}, + "order": 8, + "mode": 0, + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 155, + 158 + ], + "slot_index": 0, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + } + ], + "title": "URL", + "properties": {}, + "widgets_values": [ + "gitlab.com/sofuego-comfy-nodes/comfy-qr" + ] + }, + { + "id": 69, + "type": "PrimitiveNode", + "pos": [ + -422, + 70 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 9, + "mode": 0, + "outputs": [ + { + "name": "COMBO", + "type": "Http,Https,None", + "links": [ + 156, + 157 + ], + "slot_index": 0, + "widget": { + "name": "protocol", + "config": [ + [ + "Http", + "Https", + "None" + ], + { + "default": "Https" + } + ] + } + } + ], + "title": "Protocol", + "properties": {}, + "widgets_values": [ + "Https", + "fixed" + ] + } + ], + "links": [ + [ + 2, + 6, + 1, + 7, + 0, + "CLIP" + ], + [ + 3, + 6, + 1, + 8, + 0, + "CLIP" + ], + [ + 11, + 6, + 2, + 13, + 1, + "VAE" + ], + [ + 17, + 7, + 0, + 17, + 0, + "CONDITIONING" + ], + [ + 19, + 18, + 0, + 17, + 2, + "CONTROL_NET" + ], + [ + 23, + 8, + 0, + 17, + 1, + "CONDITIONING" + ], + [ + 25, + 13, + 0, + 21, + 0, + "IMAGE" + ], + [ + 26, + 21, + 0, + 19, + 0, + "IMAGE" + ], + [ + 27, + 19, + 0, + 20, + 1, + "STRING" + ], + [ + 28, + 13, + 0, + 20, + 0, + "IMAGE" + ], + [ + 34, + 8, + 0, + 23, + 1, + "CONDITIONING" + ], + [ + 35, + 18, + 0, + 23, + 2, + "CONTROL_NET" + ], + [ + 38, + 17, + 1, + 24, + 2, + "CONDITIONING" + ], + [ + 40, + 6, + 0, + 24, + 0, + "MODEL" + ], + [ + 44, + 28, + 0, + 27, + 4, + "INT" + ], + [ + 45, + 28, + 0, + 24, + 4, + "INT" + ], + [ + 46, + 6, + 0, + 27, + 0, + "MODEL" + ], + [ + 48, + 23, + 1, + 27, + 2, + "CONDITIONING" + ], + [ + 57, + 24, + 0, + 29, + 0, + "LATENT" + ], + [ + 58, + 28, + 0, + 30, + 4, + "INT" + ], + [ + 62, + 6, + 0, + 30, + 0, + "MODEL" + ], + [ + 63, + 30, + 0, + 13, + 0, + "LATENT" + ], + [ + 64, + 29, + 0, + 30, + 3, + "LATENT" + ], + [ + 65, + 27, + 0, + 29, + 1, + "LATENT" + ], + [ + 78, + 6, + 2, + 36, + 1, + "VAE" + ], + [ + 80, + 36, + 0, + 27, + 3, + "LATENT" + ], + [ + 82, + 37, + 0, + 24, + 5, + "INT" + ], + [ + 83, + 37, + 0, + 27, + 5, + "INT" + ], + [ + 84, + 37, + 0, + 30, + 5, + "INT" + ], + [ + 87, + 7, + 0, + 38, + 0, + "CONDITIONING" + ], + [ + 88, + 8, + 0, + 38, + 1, + "CONDITIONING" + ], + [ + 89, + 17, + 0, + 24, + 1, + "CONDITIONING" + ], + [ + 90, + 38, + 0, + 30, + 1, + "CONDITIONING" + ], + [ + 91, + 38, + 1, + 30, + 2, + "CONDITIONING" + ], + [ + 92, + 18, + 0, + 38, + 2, + "CONTROL_NET" + ], + [ + 100, + 40, + 0, + 41, + 0, + "MASK" + ], + [ + 102, + 39, + 0, + 42, + 1, + "IMAGE" + ], + [ + 104, + 39, + 3, + 47, + 0, + "MASK" + ], + [ + 106, + 39, + 3, + 49, + 1, + "MASK" + ], + [ + 107, + 50, + 0, + 49, + 0, + "MASK" + ], + [ + 110, + 52, + 0, + 40, + 0, + "INT" + ], + [ + 111, + 53, + 0, + 40, + 1, + "INT" + ], + [ + 112, + 52, + 0, + 50, + 0, + "INT" + ], + [ + 113, + 53, + 0, + 50, + 1, + "INT" + ], + [ + 114, + 54, + 0, + 43, + 3, + "INT" + ], + [ + 115, + 54, + 0, + 44, + 3, + "INT" + ], + [ + 116, + 54, + 0, + 42, + 3, + "INT" + ], + [ + 117, + 54, + 0, + 49, + 2, + "INT" + ], + [ + 118, + 55, + 0, + 42, + 4, + "INT" + ], + [ + 119, + 55, + 0, + 43, + 4, + "INT" + ], + [ + 120, + 55, + 0, + 44, + 4, + "INT" + ], + [ + 121, + 55, + 0, + 49, + 3, + "INT" + ], + [ + 122, + 43, + 0, + 17, + 3, + "IMAGE" + ], + [ + 123, + 44, + 0, + 23, + 3, + "IMAGE" + ], + [ + 124, + 49, + 0, + 29, + 2, + "MASK" + ], + [ + 125, + 42, + 0, + 38, + 3, + "IMAGE" + ], + [ + 126, + 39, + 1, + 43, + 1, + "IMAGE" + ], + [ + 127, + 39, + 2, + 44, + 1, + "IMAGE" + ], + [ + 130, + 20, + 0, + 12, + 0, + "IMAGE" + ], + [ + 132, + 44, + 0, + 36, + 0, + "IMAGE" + ], + [ + 134, + 6, + 1, + 57, + 0, + "CLIP" + ], + [ + 135, + 57, + 0, + 23, + 0, + "CONDITIONING" + ], + [ + 136, + 23, + 0, + 27, + 1, + "CONDITIONING" + ], + [ + 139, + 63, + 0, + 24, + 3, + "LATENT" + ], + [ + 140, + 43, + 0, + 63, + 0, + "IMAGE" + ], + [ + 141, + 6, + 2, + 63, + 1, + "VAE" + ], + [ + 142, + 64, + 0, + 65, + 0, + "MASK" + ], + [ + 144, + 53, + 0, + 64, + 0, + "INT" + ], + [ + 145, + 53, + 0, + 64, + 1, + "INT" + ], + [ + 146, + 65, + 0, + 44, + 0, + "IMAGE" + ], + [ + 151, + 50, + 0, + 67, + 0, + "MASK" + ], + [ + 153, + 41, + 0, + 42, + 0, + "IMAGE" + ], + [ + 154, + 41, + 0, + 43, + 0, + "IMAGE" + ], + [ + 155, + 68, + 0, + 39, + 0, + "STRING" + ], + [ + 156, + 69, + 0, + 39, + 1, + "Http,Https,None" + ], + [ + 157, + 69, + 0, + 20, + 2, + "Http,Https,None" + ], + [ + 158, + 68, + 0, + 20, + 3, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} diff --git a/examples/noisy-latent-split-controlnet.json b/examples/noisy-latent-split-controlnet.json new file mode 100644 index 0000000..071f4c2 --- /dev/null +++ b/examples/noisy-latent-split-controlnet.json @@ -0,0 +1,2640 @@ +{ + "last_node_id": 69, + "last_link_id": 160, + "nodes": [ + { + "id": 47, + "type": "MaskToImage", + "pos": [ + -242, + 776 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 104 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 49, + "type": "MaskComposite", + "pos": [ + 25, + 841 + ], + "size": { + "0": 315, + "1": 126 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "MASK", + "link": 107 + }, + { + "name": "source", + "type": "MASK", + "link": 106 + }, + { + "name": "x", + "type": "INT", + "link": 117, + "widget": { + "name": "x", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "y", + "type": "INT", + "link": 121, + "widget": { + "name": "y", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 124 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskComposite" + }, + "widgets_values": [ + 48, + 48, + "add" + ] + }, + { + "id": 44, + "type": "ImageCompositeMasked", + "pos": [ + 29, + 663 + ], + "size": { + "0": 315, + "1": 122 + }, + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "IMAGE", + "link": 146 + }, + { + "name": "source", + "type": "IMAGE", + "link": 127 + }, + { + "name": "mask", + "type": "MASK", + "link": null + }, + { + "name": "x", + "type": "INT", + "link": 115, + "widget": { + "name": "x", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "y", + "type": "INT", + "link": 120, + "widget": { + "name": "y", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 123, + 132 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Finder Layer Composite", + "properties": { + "Node name for S&R": "ImageCompositeMasked" + }, + "widgets_values": [ + 48, + 48 + ] + }, + { + "id": 8, + "type": "CLIPTextEncode", + "pos": [ + 372, + 47 + ], + "size": { + "0": 400, + "1": 200 + }, + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 3 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 23, + 34, + 88 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Negative Prompt", + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "worst quality" + ] + }, + { + "id": 7, + "type": "CLIPTextEncode", + "pos": [ + 376, + -201 + ], + "size": { + "0": 400, + "1": 200 + }, + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 2 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 17, + 87 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Positive Prompt", + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "Hot lava" + ] + }, + { + "id": 39, + "type": "comfy-qr-by-module-split", + "pos": [ + -422, + 353 + ], + "size": [ + 400, + 344 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 155, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + }, + { + "name": "protocol", + "type": "Http,Https,None", + "link": 156, + "widget": { + "name": "protocol", + "config": [ + [ + "Http", + "Https", + "None" + ], + { + "default": "Https" + } + ] + } + } + ], + "outputs": [ + { + "name": "QR_FLATTENED", + "type": "IMAGE", + "links": [ + 102 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MODULE_LAYER", + "type": "IMAGE", + "links": [ + 126 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "FINDER_LAYER", + "type": "IMAGE", + "links": [ + 127 + ], + "shape": 3, + "slot_index": 2 + }, + { + "name": "FINDER_MASK", + "type": "MASK", + "links": [ + 104, + 106 + ], + "shape": 3, + "slot_index": 3 + }, + { + "name": "QR_VERSION", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "IMAGE_SIZE", + "type": "INT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "comfy-qr-by-module-split" + }, + "widgets_values": [ + "Https", + "gitlab.com/sofuego-comfy-nodes/comfy-qr", + 16, + 768, + "#000000", + "#FFFFFF", + "High", + 1 + ] + }, + { + "id": 54, + "type": "PrimitiveNode", + "pos": [ + -594, + 733 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 114, + 115, + 116, + 117 + ], + "slot_index": 0, + "widget": { + "name": "x", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "title": "X Offset", + "properties": {}, + "widgets_values": [ + 48, + "fixed" + ] + }, + { + "id": 55, + "type": "PrimitiveNode", + "pos": [ + -592, + 863 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 118, + 119, + 120, + 121 + ], + "slot_index": 0, + "widget": { + "name": "y", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "title": "Y Offset", + "properties": {}, + "widgets_values": [ + 48, + "fixed" + ] + }, + { + "id": 29, + "type": "LatentCompositeMasked", + "pos": [ + 1234, + 432 + ], + "size": { + "0": 315, + "1": 122 + }, + "flags": {}, + "order": 32, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "LATENT", + "link": 57 + }, + { + "name": "source", + "type": "LATENT", + "link": 65 + }, + { + "name": "mask", + "type": "MASK", + "link": 124 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 64 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "LatentCompositeMasked" + }, + "widgets_values": [ + 0, + 0 + ] + }, + { + "id": 18, + "type": "ControlNetLoader", + "pos": [ + 27, + 217 + ], + "size": { + "0": 315, + "1": 58 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 19, + 35, + 92 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v1p_sd15_qrcode_monster_v2.safetensors" + ] + }, + { + "id": 23, + "type": "ControlNetApplyAdvanced", + "pos": [ + 480, + 809 + ], + "size": { + "0": 315, + "1": 166 + }, + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 135 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 34 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 35 + }, + { + "name": "image", + "type": "IMAGE", + "link": 123 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 136 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 48 + ], + "shape": 3, + "slot_index": 1 + } + ], + "title": "ControlNet (FG)", + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 3, + 0, + 1 + ] + }, + { + "id": 57, + "type": "CLIPTextEncode", + "pos": [ + 413, + 1033 + ], + "size": { + "0": 400, + "1": 200 + }, + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 134 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 135 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Finder Layer Prompt", + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "Yellow with black markings" + ] + }, + { + "id": 36, + "type": "VAEEncode", + "pos": [ + 522, + 689 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 29, + "mode": 0, + "inputs": [ + { + "name": "pixels", + "type": "IMAGE", + "link": 132 + }, + { + "name": "vae", + "type": "VAE", + "link": 78 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 80 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "VAE Encode (FG)", + "properties": { + "Node name for S&R": "VAEEncode" + } + }, + { + "id": 63, + "type": "VAEEncode", + "pos": [ + 519, + 550 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "pixels", + "type": "IMAGE", + "link": 140 + }, + { + "name": "vae", + "type": "VAE", + "link": 141 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 139 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "VAE Encode (BG)", + "properties": { + "Node name for S&R": "VAEEncode" + } + }, + { + "id": 52, + "type": "PrimitiveNode", + "pos": [ + -591, + 991 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 3, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 110, + 112 + ], + "slot_index": 0, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "title": "Width", + "properties": {}, + "widgets_values": [ + 768, + "fixed" + ] + }, + { + "id": 53, + "type": "PrimitiveNode", + "pos": [ + -593, + 1130 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 4, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 111, + 113, + 144, + 145 + ], + "slot_index": 0, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "title": "Height", + "properties": {}, + "widgets_values": [ + 768, + "fixed" + ] + }, + { + "id": 64, + "type": "SolidMask", + "pos": [ + -344, + 1263 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 144, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 145, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 142 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "SolidMask (White)", + "properties": { + "Node name for S&R": "SolidMask" + }, + "widgets_values": [ + 1, + 768, + 768 + ] + }, + { + "id": 40, + "type": "SolidMask", + "pos": [ + -347, + 949 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 110, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 111, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 100 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "SolidMask (Grey)", + "properties": { + "Node name for S&R": "SolidMask" + }, + "widgets_values": [ + 0.5, + 768, + 768 + ] + }, + { + "id": 42, + "type": "ImageCompositeMasked", + "pos": [ + 30, + 322 + ], + "size": { + "0": 315, + "1": 122 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "IMAGE", + "link": 153 + }, + { + "name": "source", + "type": "IMAGE", + "link": 102 + }, + { + "name": "mask", + "type": "MASK", + "link": null + }, + { + "name": "x", + "type": "INT", + "link": 116, + "widget": { + "name": "x", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "y", + "type": "INT", + "link": 118, + "widget": { + "name": "y", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 125 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "QR Flattened Composite", + "properties": { + "Node name for S&R": "ImageCompositeMasked" + }, + "widgets_values": [ + 48, + 48 + ] + }, + { + "id": 43, + "type": "ImageCompositeMasked", + "pos": [ + 42, + 491 + ], + "size": { + "0": 315, + "1": 122 + }, + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "IMAGE", + "link": 154 + }, + { + "name": "source", + "type": "IMAGE", + "link": 126 + }, + { + "name": "mask", + "type": "MASK", + "link": null + }, + { + "name": "x", + "type": "INT", + "link": 114, + "widget": { + "name": "x", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "y", + "type": "INT", + "link": 119, + "widget": { + "name": "y", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 122, + 140 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Module Layer Composite", + "properties": { + "Node name for S&R": "ImageCompositeMasked" + }, + "widgets_values": [ + 48, + 48 + ] + }, + { + "id": 65, + "type": "MaskToImage", + "pos": [ + 32, + 1267 + ], + "size": { + "0": 195.12049865722656, + "1": 26 + }, + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 142 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 146 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Solid (White)", + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 50, + "type": "SolidMask", + "pos": [ + -345, + 1106 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "link": 112, + "widget": { + "name": "width", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + }, + { + "name": "height", + "type": "INT", + "link": 113, + "widget": { + "name": "height", + "config": [ + "INT", + { + "default": 512, + "min": 1, + "max": 8192, + "step": 1 + } + ] + } + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 107, + 151 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "SolidMask (Black)", + "properties": { + "Node name for S&R": "SolidMask" + }, + "widgets_values": [ + 0, + 768, + 768 + ] + }, + { + "id": 67, + "type": "MaskToImage", + "pos": [ + 36, + 1144 + ], + "size": { + "0": 195.12049865722656, + "1": 26 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 151 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Solid (Black)", + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 24, + "type": "KSamplerAdvanced", + "pos": [ + 878, + -37 + ], + "size": { + "0": 315, + "1": 546 + }, + "flags": {}, + "order": 30, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 40 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 89 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 38 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 139 + }, + { + "name": "end_at_step", + "type": "INT", + "link": 45, + "widget": { + "name": "end_at_step", + "config": [ + "INT", + { + "default": 10000, + "min": 0, + "max": 10000 + } + ] + } + }, + { + "name": "steps", + "type": "INT", + "link": 82, + "widget": { + "name": "steps", + "config": [ + "INT", + { + "default": 20, + "min": 1, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 57 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "KSampler (BG)", + "properties": { + "Node name for S&R": "KSamplerAdvanced" + }, + "widgets_values": [ + "enable", + 414560518288903, + "randomize", + 25, + 8, + "euler_ancestral", + "normal", + 0, + 13, + "enable" + ] + }, + { + "id": 30, + "type": "KSamplerAdvanced", + "pos": [ + 1634, + 25 + ], + "size": { + "0": 315, + "1": 542 + }, + "flags": {}, + "order": 33, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 62 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 90 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 91 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 64 + }, + { + "name": "start_at_step", + "type": "INT", + "link": 58, + "widget": { + "name": "start_at_step", + "config": [ + "INT", + { + "default": 0, + "min": 0, + "max": 10000 + } + ] + } + }, + { + "name": "steps", + "type": "INT", + "link": 84, + "widget": { + "name": "steps", + "config": [ + "INT", + { + "default": 20, + "min": 1, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 63 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "KSampler (Combined)", + "properties": { + "Node name for S&R": "KSamplerAdvanced" + }, + "widgets_values": [ + "disable", + 447592191701148, + "randomize", + 25, + 8, + "euler_ancestral", + "normal", + 13, + 10000, + "disable" + ] + }, + { + "id": 37, + "type": "PrimitiveNode", + "pos": [ + 991, + -189 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 5, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 82, + 83, + 84 + ], + "slot_index": 0, + "widget": { + "name": "steps", + "config": [ + "INT", + { + "default": 20, + "min": 1, + "max": 10000 + } + ] + } + } + ], + "title": "Steps", + "properties": {}, + "widgets_values": [ + 25, + "fixed" + ] + }, + { + "id": 17, + "type": "ControlNetApplyAdvanced", + "pos": [ + 471, + 294 + ], + "size": { + "0": 315, + "1": 166 + }, + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 17 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 23 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 19 + }, + { + "name": "image", + "type": "IMAGE", + "link": 122 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 89 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 38 + ], + "shape": 3, + "slot_index": 1 + } + ], + "title": "ControlNet (BG)", + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 1.4000000000000001, + 0, + 1 + ] + }, + { + "id": 27, + "type": "KSamplerAdvanced", + "pos": [ + 872, + 571 + ], + "size": { + "0": 315, + "1": 546 + }, + "flags": {}, + "order": 31, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 46 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 136 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 48 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 80 + }, + { + "name": "end_at_step", + "type": "INT", + "link": 44, + "widget": { + "name": "end_at_step", + "config": [ + "INT", + { + "default": 10000, + "min": 0, + "max": 10000 + } + ] + } + }, + { + "name": "steps", + "type": "INT", + "link": 83, + "widget": { + "name": "steps", + "config": [ + "INT", + { + "default": 20, + "min": 1, + "max": 10000 + } + ] + } + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 65 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "KSampler (FG)", + "properties": { + "Node name for S&R": "KSamplerAdvanced" + }, + "widgets_values": [ + "enable", + 502985537802905, + "randomize", + 25, + 8, + "euler", + "normal", + 2, + 13, + "enable" + ] + }, + { + "id": 28, + "type": "PrimitiveNode", + "pos": [ + 1235, + -191 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 6, + "mode": 0, + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 44, + 45, + 58 + ], + "slot_index": 0, + "widget": { + "name": "end_at_step", + "config": [ + "INT", + { + "default": 10000, + "min": 0, + "max": 10000 + } + ] + } + } + ], + "title": "Seperation Step", + "properties": {}, + "widgets_values": [ + 13, + "fixed" + ] + }, + { + "id": 38, + "type": "ControlNetApplyAdvanced", + "pos": [ + 1235, + 204 + ], + "size": { + "0": 315, + "1": 166 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 87 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 88 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 92 + }, + { + "name": "image", + "type": "IMAGE", + "link": 125 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 90 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 91 + ], + "shape": 3, + "slot_index": 1 + } + ], + "title": "ControlNet (Combined)", + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 1.5, + 0, + 1 + ] + }, + { + "id": 6, + "type": "CheckpointLoaderSimple", + "pos": [ + 24, + 53 + ], + "size": { + "0": 315, + "1": 98 + }, + "flags": {}, + "order": 7, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 40, + 46, + 62 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 2, + 3, + 134 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 11, + 78, + 141 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "1.5/v1-5-pruned-emaonly.safetensors" + ] + }, + { + "id": 41, + "type": "MaskToImage", + "pos": [ + -247, + 864 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 100 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 153, + 154 + ], + "shape": 3, + "slot_index": 0 + } + ], + "title": "Solid (Grey)", + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 68, + "type": "PrimitiveNode", + "pos": [ + -422, + 208 + ], + "size": { + "0": 210, + "1": 76 + }, + "flags": {}, + "order": 8, + "mode": 0, + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 155 + ], + "slot_index": 0, + "widget": { + "name": "text", + "config": [ + "STRING", + { + "multiline": true + } + ] + } + } + ], + "title": "URL", + "properties": {}, + "widgets_values": [ + "gitlab.com/sofuego-comfy-nodes/comfy-qr" + ] + }, + { + "id": 69, + "type": "PrimitiveNode", + "pos": [ + -422, + 70 + ], + "size": { + "0": 210, + "1": 82 + }, + "flags": {}, + "order": 9, + "mode": 0, + "outputs": [ + { + "name": "COMBO", + "type": "Http,Https,None", + "links": [ + 156 + ], + "slot_index": 0, + "widget": { + "name": "protocol", + "config": [ + [ + "Http", + "Https", + "None" + ], + { + "default": "Https" + } + ] + } + } + ], + "title": "Protocol", + "properties": {}, + "widgets_values": [ + "Https", + "fixed" + ] + }, + { + "id": 13, + "type": "VAEDecode", + "pos": [ + 1272, + 671 + ], + "size": { + "0": 210, + "1": 46 + }, + "flags": {}, + "order": 34, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 63 + }, + { + "name": "vae", + "type": "VAE", + "link": 11 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 159 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 12, + "type": "SaveImage", + "pos": [ + 1537, + 672 + ], + "size": { + "0": 315, + "1": 270 + }, + "flags": {}, + "order": 35, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 159 + } + ], + "properties": {}, + "widgets_values": [ + "ComfyUI" + ] + } + ], + "links": [ + [ + 2, + 6, + 1, + 7, + 0, + "CLIP" + ], + [ + 3, + 6, + 1, + 8, + 0, + "CLIP" + ], + [ + 11, + 6, + 2, + 13, + 1, + "VAE" + ], + [ + 17, + 7, + 0, + 17, + 0, + "CONDITIONING" + ], + [ + 19, + 18, + 0, + 17, + 2, + "CONTROL_NET" + ], + [ + 23, + 8, + 0, + 17, + 1, + "CONDITIONING" + ], + [ + 34, + 8, + 0, + 23, + 1, + "CONDITIONING" + ], + [ + 35, + 18, + 0, + 23, + 2, + "CONTROL_NET" + ], + [ + 38, + 17, + 1, + 24, + 2, + "CONDITIONING" + ], + [ + 40, + 6, + 0, + 24, + 0, + "MODEL" + ], + [ + 44, + 28, + 0, + 27, + 4, + "INT" + ], + [ + 45, + 28, + 0, + 24, + 4, + "INT" + ], + [ + 46, + 6, + 0, + 27, + 0, + "MODEL" + ], + [ + 48, + 23, + 1, + 27, + 2, + "CONDITIONING" + ], + [ + 57, + 24, + 0, + 29, + 0, + "LATENT" + ], + [ + 58, + 28, + 0, + 30, + 4, + "INT" + ], + [ + 62, + 6, + 0, + 30, + 0, + "MODEL" + ], + [ + 63, + 30, + 0, + 13, + 0, + "LATENT" + ], + [ + 64, + 29, + 0, + 30, + 3, + "LATENT" + ], + [ + 65, + 27, + 0, + 29, + 1, + "LATENT" + ], + [ + 78, + 6, + 2, + 36, + 1, + "VAE" + ], + [ + 80, + 36, + 0, + 27, + 3, + "LATENT" + ], + [ + 82, + 37, + 0, + 24, + 5, + "INT" + ], + [ + 83, + 37, + 0, + 27, + 5, + "INT" + ], + [ + 84, + 37, + 0, + 30, + 5, + "INT" + ], + [ + 87, + 7, + 0, + 38, + 0, + "CONDITIONING" + ], + [ + 88, + 8, + 0, + 38, + 1, + "CONDITIONING" + ], + [ + 89, + 17, + 0, + 24, + 1, + "CONDITIONING" + ], + [ + 90, + 38, + 0, + 30, + 1, + "CONDITIONING" + ], + [ + 91, + 38, + 1, + 30, + 2, + "CONDITIONING" + ], + [ + 92, + 18, + 0, + 38, + 2, + "CONTROL_NET" + ], + [ + 100, + 40, + 0, + 41, + 0, + "MASK" + ], + [ + 102, + 39, + 0, + 42, + 1, + "IMAGE" + ], + [ + 104, + 39, + 3, + 47, + 0, + "MASK" + ], + [ + 106, + 39, + 3, + 49, + 1, + "MASK" + ], + [ + 107, + 50, + 0, + 49, + 0, + "MASK" + ], + [ + 110, + 52, + 0, + 40, + 0, + "INT" + ], + [ + 111, + 53, + 0, + 40, + 1, + "INT" + ], + [ + 112, + 52, + 0, + 50, + 0, + "INT" + ], + [ + 113, + 53, + 0, + 50, + 1, + "INT" + ], + [ + 114, + 54, + 0, + 43, + 3, + "INT" + ], + [ + 115, + 54, + 0, + 44, + 3, + "INT" + ], + [ + 116, + 54, + 0, + 42, + 3, + "INT" + ], + [ + 117, + 54, + 0, + 49, + 2, + "INT" + ], + [ + 118, + 55, + 0, + 42, + 4, + "INT" + ], + [ + 119, + 55, + 0, + 43, + 4, + "INT" + ], + [ + 120, + 55, + 0, + 44, + 4, + "INT" + ], + [ + 121, + 55, + 0, + 49, + 3, + "INT" + ], + [ + 122, + 43, + 0, + 17, + 3, + "IMAGE" + ], + [ + 123, + 44, + 0, + 23, + 3, + "IMAGE" + ], + [ + 124, + 49, + 0, + 29, + 2, + "MASK" + ], + [ + 125, + 42, + 0, + 38, + 3, + "IMAGE" + ], + [ + 126, + 39, + 1, + 43, + 1, + "IMAGE" + ], + [ + 127, + 39, + 2, + 44, + 1, + "IMAGE" + ], + [ + 132, + 44, + 0, + 36, + 0, + "IMAGE" + ], + [ + 134, + 6, + 1, + 57, + 0, + "CLIP" + ], + [ + 135, + 57, + 0, + 23, + 0, + "CONDITIONING" + ], + [ + 136, + 23, + 0, + 27, + 1, + "CONDITIONING" + ], + [ + 139, + 63, + 0, + 24, + 3, + "LATENT" + ], + [ + 140, + 43, + 0, + 63, + 0, + "IMAGE" + ], + [ + 141, + 6, + 2, + 63, + 1, + "VAE" + ], + [ + 142, + 64, + 0, + 65, + 0, + "MASK" + ], + [ + 144, + 53, + 0, + 64, + 0, + "INT" + ], + [ + 145, + 53, + 0, + 64, + 1, + "INT" + ], + [ + 146, + 65, + 0, + 44, + 0, + "IMAGE" + ], + [ + 151, + 50, + 0, + 67, + 0, + "MASK" + ], + [ + 153, + 41, + 0, + 42, + 0, + "IMAGE" + ], + [ + 154, + 41, + 0, + 43, + 0, + "IMAGE" + ], + [ + 155, + 68, + 0, + 39, + 0, + "STRING" + ], + [ + 156, + 69, + 0, + 39, + 1, + "Http,Https,None" + ], + [ + 159, + 13, + 0, + 12, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": {}, + "version": 0.4 +} diff --git a/img/badgers_levels_adjusted.png b/img/badgers_levels_adjusted.png new file mode 100644 index 0000000000000000000000000000000000000000..0db4458595c806c437a64becb15de47de5f3d1de GIT binary patch literal 1546544 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