# ComfyUI_Mira **Repository Path**: analyzesystem/ComfyUI_Mira ## Basic Information - **Project Name**: ComfyUI_Mira - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-03-15 - **Last Updated**: 2024-08-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ComfyUI_Mira A custom node for [ComfyUI](https://github.com/comfyanonymous/ComfyUI/) to improve all those custom nodes I feel not comfortable in my workflow. ------ ## Installation `Clone` the repository to custom_nodes in your `ComfyUI\custom_nodes` directory: ``` git clone https://github.com/mirabarukaso/ComfyUI_Mira.git ``` ------ ## Functions ### Mask #### Create Tilling PNG Mask Create a `Tilling` PNG image with Color Mask stack for regional conditioning mask. Ideas from [sd-webui-regional-prompter](https://github.com/hako-mikan/sd-webui-regional-prompter) | Inputs | Description | | --- | --- | | `Width` `Height` | Image size, could be difference with cavan size, but recommended to connect them together. | | `Colum_first` | A boolean trigger, when enabled, will treat default cut as a horizontal cut. | | `Rows` `Colums` | Define how many `Blocks` you want, all `Blocks` are the same weight. (Blocks = Rows x Colums)
***Low prority, only works when Layout is incorrect.*** | | `Layout` | Customized `Blocks` with layouts input. e.g. `1,2,1,1;2,4,6`
`0-9` `,` `;` Check Examples section for more detail.
***High prority, in case you don't need custom layout, simply put `#` here.*** | | Outputs | Description | | --- | --- | | `Image` | Visualisation Image of your Layout. | | `PngColorMasks` | A List contains all your Blocks' color information.
Connect to `Create PNG Mask ` `Color Mask to HEX String` `Color Mask to INT RGB` `Color Masks List` | | `PngRectangles` | A List contains all PNG Blocks' rectangle informationm, last one is the whole Image's Width and Height. | | `Debug` | Debug information as String. | | Examples | Description | | --- | --- | | `0-9` | Block weights | | `,` | A normal segmentation. Let's call it `N` cut| | `;` | A high-priority segmentation perpendicular to the normal direction. Let's call it `G` cut| | `1,2,1,1;2,4,6`
`Colum_first ENABLED`| When combining `,` and `;`, the first and the following `;` elements are treated as the weight of `G` for current cavans. Node will first split the canvas with weight `1` and `;2` as `G` cuts. Then split the following parts with `2,1,1` and `4,6` as `N` cuts.
***NOTE: The arithmetic logic here are different from WebUI, please use "Colum_first" if you need to change the direction, don't replace `,` and `;` directly.*** | | `1,2,3,2,1`
`Colum_first DISABLED`| A simple horizontal `N` cut with weights. | | `1,2,3,2,1`
`Colum_first ENABLED`| A simple vertical `N` cut with weights. | | ***1,2,1,1;2,4,6 with Colum_first*** | ***1,2,3,2,1*** | ***1,2,3,2,1 with Colum_first*** | | --- | --- | --- | | | | | ------ #### Create Nested Rectangles PNG Mask Create a `Nested Rectangles` PNG image with Color Mask stack for regional conditioning mask. Ideas from [Watermark Removal](https://github.com/mirabarukaso/ComfyUI_Mira?tab=readme-ov-file#create-watermark-removal-mask) | Inputs | Description | | --- | --- | | `Width` `Height` | Image size, could be difference with cavan size, but recommended to connect them together. | | `X`, `Y` | Center point (`X`,`Y`) of all Rectangles. | | `unlimit_top` | When `ENABLED`, all `masks` will create from the top of Image. | | `unlimit_bottom` | When `ENABLED`, all `masks` will create till the bottom of Image. | | `unlimit_left` | When `ENABLED`, all `masks` will create from the left of Image. | | `unlimit_right` | When `ENABLED`, all `masks` will create till the right of Image. | | `Layout` | Customized `Blocks` with layouts input. e.g. `2,4,1`
`0-9` `,` `;` Check Examples section for more detail. | | Outputs | Description | | --- | --- | | `Image` | Visualisation Image of your Layout. | | `PngColorMasks` | A List contains all your Blocks' color information.
Connect to `Create PNG Mask ` `Color Mask to HEX String` `Color Mask to INT RGB` `Color Masks List` | | `PngRectangles` | A List contains all PNG Blocks' rectangle informationm, last one is the whole Image's Width and Height. | | `Debug` | Debug information as String. | | Examples | Description | | --- | --- | | `0-9` | Block weights | | `,` | A normal segmentation. `;` will treat as same as `,` | | `;` | Ignored in `, ;` | | ***2,4,1*** | ***2,4,1 unlimit bottom*** | ***2,4,1 unlimit bottom and right and blur 16*** | | --- | --- | --- | | | | | ------ #### PngColor Masks to Mask List Convert ranged `PngColorMasks` to Masks with(or without) Blur. **Dunno if there is a proper way to solve the output problem.** Ideas from [ComfyUI_essentials](https://github.com/cubiq/ComfyUI_essentials) | Inputs | Description | | --- | --- | | `Image` | Image from ` Mira/Mask/Create PNG Mask` | | `PngColorMasks` | List from ` Mira/Mask/Create PNG Mask` | | `Blur` | The intensity of blur around the edge of Mask, set to `0` for a solid edge. | | `Start_At_Index` | The first block index number you want. | | Outputs | Description | | --- | --- | | `mask_[0-9]` | The Mask for `Regional Conditioning` or ***Anything*** who need a Mask. | | ***Solid*** | ***Blur 16.0*** | | --- | --- | | | | ------ #### PngColor Mask to HEX String Convert specified `Index` of `PngColorMasks` to HEX value. e.g. `RGB(255,0,255)` to `#FF00FF` | Inputs | Description | | --- | --- | | `PngColorMasks` | List from ` Mira/Mask/Create PNG Mask` | | `Index` | The block index number. | | Outputs | Description | | --- | --- | | `mask_color` | The color RGB in HEX for `Regional Conditioning By Color Mask (Inspire)` or etc. | ------ #### PngColor Mask to INT RGB Convert specified `Index` `PngColorMasks` to RGB value for `🔧 Mask From Color` or etc. e.g. `RGB(255,0,255)` | Inputs | Description | | --- | --- | | `PngColorMasks` | List from ` Mira/Mask/Create PNG Mask` | | `Index` | The block index number. | | Outputs | Description | | --- | --- | | `R` | Red | | `G` | Green | | `B` | Blue | ------ #### PngColor Masks to List Convert ranged `PngColorMasks` to HEX value. **Dunno if there is a proper way to solve the output problem.** | Inputs | Description | | --- | --- | | `PngColorMasks` | List from ` Mira/Mask/Create PNG Mask` | | `Start_At_Index` | The first block index number you want. | | Outputs | Description | | --- | --- | | `mask_color_[0-9]` | The color RGB in HEX for `Regional Conditioning By Color Mask (Inspire)` or etc. | ------ #### PngRectangles to Mask (List) Convert ranged `PngRectangles` to Mask with Mask `Intenisity` and `Blur` function. | Inputs (Common) | Description | | --- | --- | | `PngRectangles` | List from ` Mira/Mask/Create PNG Mask` | | `Intenisity` | `Intenisity` of Mask, set to `1.0` for solid Mask. | | `Blur` | The intensity of blur around the edge of Mask, set to `0` for a solid edge. | | `Start_At_Index` | The first block index number you want. | | Inputs (Single Mask) | Description | | --- | --- | | `Overlap` | Combine the `Previous` or `Next` Masks into current Mask. `None` for disable. | | `Overlap_Count` | How many `Previous` or `Next` Masks you want to combine. | | Outputs | Description | | --- | --- | | Normal | | `mask` | Mask with specified `Intenisity` and `Blur`. | | List | | `mask_[0-9]` | Masks List with specified `Intenisity` and `Blur`. | Example | ***Normal*** | ***Overlap*** | | --- | --- | | | | ------ #### Create Mask With Canvas Create a new `mask` on defined `cavans`. In case you need `merge` multiple `masks`, try search `MaskComposite` with `operation add`. | Inputs | Description | | --- | --- | | `C_Width` | Width of cavans. | | `C_Height` | Height of cavans. | | `X` | The left point of new mask on cavans. | | `Y` | The top point of new mask on cavans. | | `Width` | Mask width. | | `Height` | Mask height. | | `Intenisity` | `Intenisity` of Mask, set to `1.0` for solid Mask. | | `Blur` | The intensity of blur around the edge of Mask, set to `0` for a solid edge. | | Outputs | Description | | --- | --- | | `mask` | New mask with defined cavans | Example ------ #### Create Watermark Removal Mask Creates multiple `masks` at the corners of the image for subsequent watermark detection and removal. Ideas from [comfyui-lama-remover](https://github.com/Layer-norm/comfyui-lama-remover) | Inputs | Description | | --- | --- | | `C_Width` | Width of cavans. | | `C_Height` | Height of cavans. | | `Mask_W` | Mask width, maxium value are half of cavans width. | | `Mask_H` | Mask height, maxium value are half of cavans height. | | `Top_L` | Create mask from top left. | | `Top_R` | Create mask from top right. | | `Bottom_L` | Create mask from bottom left. | | `Bottom_R` | Create mask from bottom right. | | `EdgeToEdge` | Preserve the N pixels at the outermost edges of the image to prevent image noise. Set to 0 for borderless. | | `Intenisity` | `Intenisity` of Mask, set to `1.0` for solid Mask. | | `Blur` | The intensity of blur around the edge of Mask, set to `0` for a solid edge. | | Outputs | Description | | --- | --- | | `Mask` | New mask with defined cavans | | ***Before*** | ***After*** | | --- | --- | | | | ------ ### Util #### Create Canvas Create Canvas information `Width` and `Height` for Latent with Landscape switch. There's an advanced version also controls `Batch` and `HiResMultiplier`. | Inputs | Description | | --- | --- | | Basic | | `Width` `Height` | Image size. | | Normal | | `Landscape` | Swap `Width` and `Height` by one click. | | Advanced | | `Batch` | Batch size. | | `HiResMultiplier` | Automatically calculated (in steps of 8) for HiResFix. | | `Debug` | Debug information as String. | | Outputs | Description | | --- | --- | | Basic & Normal | | `Width` `Height` | Image size. Swaps automatically when `Landscape` is Enabled. | | Advanced | | `Batch` | Batch size. | | `HiRes Width` `HiRes Height` | Width and Height for HiResFix or etc.
***NOTE:The result is not the product of the original data, but the nearest multiple of 8.***| ------ #### Random Tilling Layouts Random Tilling Mask `Layout` Generator for `Create Tilling PNG Mask -> Layout` **Highly recommend connect the output `layout` or `Create PNG Mask -> Debug` to `ShowText` node.** Refer to [ComfyUI-Custom-Scripts](https://github.com/pythongosssss/ComfyUI-Custom-Scripts) **Known Issue** about `Seed Generator` Switching `randomize` to `fixed` now works immediately. But, switching `fixed` to `randomize`, it need 2 times `Queue Prompt` to take affect. (Because of the ComfyUI logic) Solution: Try `Global Seed (Inspire)` from [ComfyUI-Inspire-Pack](https://github.com/ltdrdata/ComfyUI-Inspire-Pack) **Reminder** The `rnd_seed` have nothing to do with the actual random numbers, you can't get the same `layout` with the same `rnd_seed`, it is recommended to use `ShowText` and `Notes` to save your favourite `layout`. **Hint** Set rows or colums to `0` for only one direction cuts. Whichever is set to `0` will automatically cut according to the other non-zero setting. Just in case all fours are `0`, it will return `1,1`. | Inputs | Description | | --- | --- | | `min_rows` `max_rows` | Range of how many `N cuts` you may want, set both to 0 to disable it. | | `min_colums` `max_colums` | Range of how many `G cuts` you may want, set both to 0 to disable it. | | `max_weights_gcuts` | The maxium weight of `G cuts` range from 1 to `max_weights_gcuts` | | `max_weights_ncuts` | The maxium weight of `N cuts` range from 1 to `max_weights_ncuts` | | `rnd_seed`| Connect to the `Seed Generator` node, then use `Global Seed (Inspire)` node to control it properly. | | Outputs | Description | | --- | --- | | `Layout` | Layouts string, you need connect it to `Create PNG Mask -> layout` | Example ------ #### Random Nested Mask Layouts Random Nested Mask `Layout` Generator for `Create Nested PNG Mask -> Layout` **Known Issue** same as upper one. | Inputs | Description | | --- | --- | | `min_nested`, `max_nested` | Range of nest you want. | | `min_weights`, `max_weights` | The weight of every nest. | | `rnd_seed` | Connect to the `Seed Generator` node, then use `Global Seed (Inspire)` node to control it properly. | | Outputs | Description | | --- | --- | | `Layout` | Layouts string, you need connect it to `Create Nested PNG Mask -> layout` | | `top`, `bottom`, `left`, `right` | Random Boolean for `Create Nested PNG Mask -> Layout` | Example ------ #### Seed Generator Random `Seed` Generator for `Random Layouts`, same as normal random seed generator. ------ ### Text #### Text Switcher Selects `text1` or `text2` depending on the `use_text2` and automatically adds `common_text` for output. | Inputs | Description | | --- | --- | | `use_text2` | When `ENABLED`, will switch `Output` to `text2 + separator + common_text`. | | `common_text_at_front` | When `ENABLED`, the common text is placed in front of the text (1 or 2). | | `text1` | Default output text. | | `text2` | Alternative text when `use_text2` is `ENABLED`. | | `common_text` | Common text input for quality tags and etc, leave it blank if you don't need it.. | | Outputs | Description | | --- | --- | | `text` | A combined text output. | | `text_alt` | Alternative combined text output. | Example ------ #### Text Combiner Simply combine text inputs together, switch them to `input node` as you wish, then connect to `Text Switcher` or `Simple Text Box` | Inputs | Description | | --- | --- | | `text1-6` | Default output text. | | Outputs | Description | | --- | --- | | `text` | A combined text output. | For `Text Combiner Six`, you can use my naming logic to make the whole workflow easier to understand. | Inputs | Description | | --- | --- | | `text1` | All common `prompts` for model required. e.g. `score_9, score_8_up, score_7_up, score_6_up, score_5_up, best quality, masterpiece,`| | `text2`| Base information for what you want. e.g. camera `front view, low angle view,`, style `cyberpunk, reflection,`, location `street, outdoors,`, characters (number) `1anthro` | | `text3` | The Charater's pose information. e.g. `smile, standing, open mouth, looking at viewer,`| | `text4` | The Charater's race and outlook information. e.g. `anthro dragon, no pupils, cowboy shot, (4 fingers:1.2), claws, (hair slicked back:1.1),` and ` (two-tone scales, (blue scales:1.2), grey stomach scales, cyan striped, cyan hair, black sclera, gold eyes:1.1), (wet, shark dragon, shark tail, (skin-covered dragon horn:1.3), arm fins, ear fins, gills, (mohawk:0.9), sidelocks:1.1), `| | `text5` | LoRA trigger words. | | `text6` | Any addional informaion you want. e.g. `glowing eyes, ` | ------ #### Text Switcher Two/Three Ways Found a satisfied random number and didn't want to mess up your regional nodes too much? ***Reminder: In case you are not use a symmetrical(`1:1:1`) Mask, do not forget your `Mask Layout`*** | Inputs | Description | | --- | --- | | `text1-3` | Full combined text before Regional confiton | | `switch` | Boolean/List for how to switch outputs | | Outputs | Description | | --- | --- | | `text1-3` | As is, but switched order | Three ways | Switch | Output | | --- | --- | | `False` | `text1` `text2` | | `True` | `text2` `text1` | Three ways | Switch | Output | | --- | --- | | 1 | 123 | | 2 | 132 | | 3 | 213 | | 4 | 231 | | 5 | 312 | | 6 | 321 | ------ ### Logic #### Boolean Few `Boolean` stacks. | Inputs | Description | | --- | --- | | `bool_N` | Triggers. | | `bool_list` | Boolean List from `N Bool` | | Outputs | Description | | --- | --- | | `bool_N` | Bool value. | | `bool_list` | Boolean List to `N Bool from List` | #### Logic NOT Always return `not Boolean` | Input | Output | | --- | --- | | `True` | `False` | | `False` | `True` | #### Even or Odd Check if a `Integer` is odd or even. | Input | Output | | --- | --- | | `Even` | `False` | | `Odd` | `True` | #### None To Zero Check if the `check_none` is None, then set return value to `0`. This is a `spoofing Node` to `mess up` with `other Nodes`. Imaging everyothers could follow this rule to create their `Custom Node`, the `ComfyUI` could be more `Logic`. ***The extra logic calls do add a bit of system overhead, but it's Python, so who cares?*** | Inputs | Description | | --- | --- | | `check_none` | `None` or `NOT None` from `74 family` | | `ret_float` | The `float` result when `NOT None` | | `ret_int` | The `intenger` result when `NOT None` | | Outputs | Description | | --- | --- | | `ret_float` | `AS IS` when `NOT None`, and `0` when `None` | | `ret_int` | `AS IS` when `NOT None`, and `0` when `None` | | `ret_image` | `AS IS` when `NOT None`, and `2x2 img` when `None` | | `none_image` | `AS IS` when `NOT None`, and `None` when `None` | ------ #### Even or Odd List Checks whether each `digit` (decimal) of the input `integer` is odd or even, and returns `true` for even numbers and `false` for odd numbers. The final output is a `Boolean List` which is connected to the `Boolean List Interpreter`. If the input `Number of digits` is less than the `Requirement`, it will go back to the lowest digit to re-recognize and complete the list, and the way the list is completed can be chosen as `as is` or `not`. The output node `String` displays the actual results. | Inputs | Description | | --- | --- | | `integer` | Recommend connect to `Seed Generator` | | `quantity` | Length of the `Boolean list`, if `quantity` is greater than `len(str(integer))`, will trigger `filling` for extra bits.| | `NOT_filling` | Filling algorithm, `Enable` for switch between `NOT` and `AS IS` in future loop, `Disable` for `AS IS` in every loop. | | Outputs | Description | | --- | --- | | `bool_list` | Boolean list | | `result` | String result | Example ------ #### Function Swap Swap `func1` and `func2` outputs depends on `trigger`. | Inputs | Description | | --- | --- | | `swap` | `True` or `False` | | `func1` | Any function. E.g. `Mask_1`. | | `func2` | Any function. E.g. `Mask_2`. | | Outputs | A | B | | --- | --- | --- | | swap | A | B | | `True` | func2 | func1 | | `False` | func1 | func2 | ------ ### Logic-74 In case you didn't know about `74 family`, refer to [List of 7400-series integrated circuits](https://en.wikipedia.org/wiki/List_of_7400-series_integrated_circuits) #### SN74LVC1G125 Single Bus Buffer Gate With Enable | OE | A | | --- | --- | | True | Y | | False | None | ------ #### SN74HC1G86 Single 2-Input Exclusive-OR(XOR) Gate #### SN74HC86 Quadruple 2-Input Exclusive-OR(XOR) Gates | A | B | Y | | --- | --- | --- | | True | True | None | | False | False | None | | True | False | A | | False | True | B | Example ------ ### Numeral #### Convert Numeral to String Convert `Integer` or `Float` to String. #### Floats And, few `Float` stacks. | Inputs | Description | | --- | --- | | `float_N` | Triggers. | | `float_list` | Float List from `N Float` | | Outputs | Description | | --- | --- | | `float_N` | Float value. | | `float_list` | Float List to `N Float from List` | ------ ### Arithmetic (WIP as I need......) Addition, Subtraction, Multiplication and Division. **Multiplier now renamed to Arithmetic.** #### Multiplication `Integer` and `Float` Multiplier with various output interfaces. There is also an `Integer to Float` Multiplier, connect to `Seed Generator` (x0.1) for `Even or Odd` and `Text Switcher`. | Inputs | Description | | --- | --- | | `int_value` `float_value` | The number you want to multiply. | | `multiply_value` | How many times? | | Outputs | Description | | --- | --- | | `Integer` | `Integer` result. ***When converting `Floating` to `Integer`, the fractional part are discarded.***| | `Float` | `Float` result. | | `String` | Convert result to `String`. | ------ #### Subtraction `Integer` Subtraction with various output interfaces. **Mostly usage for `Create Mask With Cavans`, connect `Y` with `Result` then connect `height` with `subtracted_value`.** | Inputs | Description | | --- | --- | | `int_value` | Subtracted number. | | `subtracted_value` | Subtracted by how much? | | Outputs | Description | | --- | --- | | `Integer` | `Integer` result. | | `String` | Convert result to `String`. | | `subtracted_value` | As is | Example ------ ## Overview - Regional Conditioning Mask with HiRes Fix SDXL without `74 triggers` and `(customized) Ultimate SD Upscale` SDXL ------ ## Latest Change Log #### 2024.07.25 Ver 0.4.3.0 ・Add Text Switcher Two/Three Ways #### 2024.06.07 Ver 0.4.2.1 ・Modify Text Switcher now support `alternative text output` for `regional condition 2 charaters` ・Move old logs to `CHANGELOGS.md`