VAE Decode

This works exactly as the builtin one but also supports the sd seamless hack, taken from: FlyingFireCo/tiled_ksampler that is use in the Model Patch Seamless node.

Unsplash Image

Unsplash Image given a keyword and a size

Uncrop

Uncrops an image to a given bounding box The bounding box can be given as a tuple of (x, y, width, height) or as a BBOX type The BBOX input takes precedence over the tuple input

Transform Image

Transform images while maintaining the input tensor shape

To Device

Send a image or mask tensor to the given device.

Text To Image

Turn text into an image with automatic wrapping. You can still control the offset and coverage of the wrap:

text_to_image

Styles Loader

This node uses the same logic as the A111 styles csv.
The first column is the name, the second the positive, the third the negative.
A sample styles.csv gets installed on first run.

Note Some styles can have empty columns, for instance I personally use distinct ones for positive and negatives, so be sure to wire the right output.

Extract Styles

It's sometime useful to be able to directly act on the content of a given style, for that an option was added to the context menu of that node to.. extract the styles to plain text inputs:
extract

String Replace

Basic string replacement.

Stack Images

A simple way to stack images either horizontally or vertically. Stack image uses dynamic inputs.

It outputs RGBA tensors and supports RGB or RGBA as input (normalized to RGBA internally). If the image dimensions don't match they must at least match:

  • in width when stacking vertically.
  • in height when stacking horizontally.

Here is an example workflow using Text To Image (the text was generated using Nous Hermes 2 Vision thanks to the great ComfyUI_VLM_nodes extension. For simplicity's sake, the workflow doesn't contain external nodes:

stack_images

Smart Step

Utils to control the steps start/stop of the KAdvancedSampler in percentage

Sharpen

Sharpens an image using a Gaussian kernel.

Save Tensors

Save torch tensors (image, mask or latent) to disk. useful to debug things outside comfy like in notebooks.

Save Image Sequence

Save an image sequence to a folder. The current frame is used to determine which image to save. This is merely a wrapper around the save_images function with formatting for the output folder and filename.

Save Image Grid

Save all the images in the input batch as a grid of images.

Save GIF

Save the images from the batch as a GIF

Restore Face

Uses GFPGan to restore faces

Read a playlist

QR Code

Basic QR Code generator

Plot FLOATS

Plot FLOATS using matplotlib, each of them are drawn in a different color.

Pick From Batch

Pick a specific number of images from a batch either from the head or the tail.

Model Pruner

Basic output node to prune/downsample a model.

If save_folder is a relative path, it will be relative to comfy's output directory?

This is a bit experimental for now

Model Patch Seamless

This uses this hack to generate seamless image right at the inference stage. Results might vary depending on the model and prompt.

Here is a few output from an extended version of the available example. The main difference is that I use an upscale step before running deep bump.

albedo

Match Dimensions

Match images dimensions along the given axis, preserving aspect ratio.

Mask to Image

Converts a mask (alpha) to an RGB image with a color and background

Load Image Sequence

Load an image sequence from a folder. The current frame is used to determine which image to load.
The UX need improvements but you can use it as follow:

  • If current_frame is -1, it will load all the frames matching the pattern.
  • If the path contains a * it will glob the paths using it.
  • If range is provided (for instance 0-10 to load frame 0 to 10) current_frame is ignored.

Load image from URL

Load an image from the given URL

Load Film Model

Loads a FILM model

Load Face Swap Model

Loads a faceswap model

Load Face Enhance Model

Loads a GFPGan or RestoreFormer model for face enhancement.

Load Face Analysis

Loads a face analysis model

Latent Lerp

Linear interpolation (blend) between two latent vectors

Int to Bool

Basic int to bool conversion, >= 1 is true

Image Tile Offset

Mimics an old photoshop technique to check for seamless textures

Image Resize Factor

Extracted mostly from WAS Node Suite, with a few edits (most notably multiple image support) and less features.

Image Remove Background

Removes the background from the input using Rembg.

Image Premultiply

Premultiply image with mask

Image Compare

Compare two images and return a difference image

Get Batch from History

This experimental node does something really simple, it reads the outputs from the history endpoint of Comfy. Outputs gets populated by... output nodes. There are various ones but for instance in core comfy, Save Image and Preview Image are output nodes. I advice to start simple and have workflows that only generates one output per queue run. Of course once you master it you can use multiple outputs as output order is kept (as long as all outputs are ran).

Another basic use case of batch from history that you can see in the 4th example, the fake deforum effect, basically this flow allows you to feedback an image using the history.

A classic example when showing the feedback concept is the poor man's grey scott diffusion model i.e the "creative" derivative using only a gaussian blur and a sharp at each fed steps.

Here is an example workflow of just that.

this is the output:

and the workflow:

expand here to copy paste this workflow
{"last_node_id":13,"last_link_id":16,"nodes":[{"id":3,"type":"Get Batch From History (mtb)","pos":[401,280],"size":[315,130],"flags":{},"order":4,"mode":0,"inputs":[{"name":"passthrough_image","type":"IMAGE","link":2,"slot_index":0},{"name":"enable","type":"BOOLEAN","link":16,"widget":{"name":"enable"}}],"outputs":[{"name":"images","type":"IMAGE","links":[8],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Get Batch From History (mtb)"},"widgets_values":[false,1,0,357]},{"id":1,"type":"Batch Shape (mtb)","pos":[90,228],"size":[210,310],"flags":{},"order":0,"mode":0,"outputs":[{"name":"IMAGE","type":"IMAGE","links":[2],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Batch Shape (mtb)"},"widgets_values":[1,"Box",512,512,229,"#ffffff","#000000","#000000",0,0]},{"id":10,"type":"Blur (mtb)","pos":[733,282],"size":[315,82],"flags":{},"order":6,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":8}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[14],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Blur (mtb)"},"widgets_values":[8,6]},{"id":13,"type":"Sharpen (mtb)","pos":[1067,280],"size":[315,130],"flags":{},"order":7,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":14}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[15],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Sharpen (mtb)"},"widgets_values":[31,1,1,1]},{"id":2,"type":"PreviewImage","pos":[1404,278],"size":[210,246],"flags":{},"order":8,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":15}],"properties":{"Node name for S&R":"PreviewImage"}},{"id":6,"type":"Int To Bool (mtb)","pos":[153,597],"size":[210,42.27488708496094],"flags":{},"order":2,"mode":0,"inputs":[{"name":"int","type":"INT","link":4,"widget":{"name":"int"}}],"outputs":[{"name":"BOOLEAN","type":"BOOLEAN","links":[16],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Int To Bool (mtb)"},"widgets_values":[0]},{"id":9,"type":"Get Batch From History (mtb)","pos":[181,706],"size":[315,130],"flags":{},"order":3,"mode":0,"inputs":[{"name":"passthrough_image","type":"IMAGE","link":null,"slot_index":0},{"name":"enable","type":"BOOLEAN","link":6,"widget":{"name":"enable"}}],"outputs":[{"name":"images","type":"IMAGE","links":[7],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Get Batch From History (mtb)"},"widgets_values":[true,44,0,357]},{"id":7,"type":"Save Gif (mtb)","pos":[567,703],"size":[210,372],"flags":{},"order":5,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":7}],"properties":{"Node name for S&R":"Save Gif (mtb)"},"widgets_values":[20,1,false,true,"nearest","/view?filename=25d12cbdb5.gif&subfolder=&type=output"]},{"id":4,"type":"Animation Builder (mtb)","pos":[-110,596],"size":[210,318],"flags":{},"order":1,"mode":0,"outputs":[{"name":"frame","type":"INT","links":[4],"shape":3,"slot_index":0},{"name":"0-1 (scaled)","type":"FLOAT","links":null,"shape":3},{"name":"count","type":"INT","links":null,"shape":3},{"name":"loop_ended","type":"BOOLEAN","links":[6],"shape":3,"slot_index":3}],"properties":{"Node name for S&R":"Animation Builder (mtb)"},"widgets_values":[45,1,1,0,0,"Idle","Iteration: Idle","reset","queue"]}],"links":[[2,1,0,3,0,"IMAGE"],[4,4,0,6,0,"INT"],[6,4,3,9,1,"BOOLEAN"],[7,9,0,7,0,"IMAGE"],[8,3,0,10,0,"IMAGE"],[14,10,0,13,0,"IMAGE"],[15,13,0,2,0,"IMAGE"],[16,6,0,3,1,"BOOLEAN"]],"groups":[],"config":{},"extra":{},"version":0.4}

The blue bordered node is the one doing the feedback, on first frame (frame == 0 converted to bool is false) the passthrough image will be used, this example uses the Batch Shape node, only on the first queue item, then the previous queue item is fed to each subsequent queue item. The orange bordered one is fetching all the frames we queued once done to assemble the GIF. All this happens in "one click" thanks to Animation Builder

Inputs

namedescription
passthrough_imageThis is the image that gets sent out when enable is set to false, useful for the init first image in the fake deforum example for instance (04-animation_builder-deforum.json)
enableThis makes the node not fetch the history. For instance when you just initiated the server the history is empty, see Animation Builder for practical examples
countthe number of frames to fetch from the history
Reset Buttonresets the internal counters, although the node is though around using its queue button it should still work fine when using the regular queue button of comfy
Queue ButtonConvenience button to run the queues (total_frames * loop_count)

FLOATS to FLOAT

AD, IPA, Fitz etc have commonly choose to mistype float lists as FLOAT.

This is just a hack to be compatible with these

Filter Z

Filters an image based on a depth map

Film Interpolation

Warning This is part of the optional nodes, if you are on linux or mac you can skip this warning, on windows I would recommend looking into alternative like ComfyUI-Frame-Interpolation

Load Film Model

This node loads and cache a given FILM model

FILM interpolation

Wrapper of the original implementation in tensorflow. You should not use tensorflow CPU as this operation is really slow on CPU and quite fast on GPU

save_gif

Face Swap

Face swap using deepinsight/insightface models

Export with FFmpeg

Quite crude node, VHS is recommended now

Deep Bump

This node uses the deep bump model (GPLv3). The 3 inference modes (color -> normals, normals -> curvature, normals -> depth) are all baked into a single node with a dropdown to select the operation. Some inputs are only used in some context, UX could be better. The inputs are self explanatory, but you should probably experiment a bit with it since inference is quite fast. One thing to be sure is to tick normals_to_height_seamless when the input is seamless, see below for more infos.

This example is available in the base examples list. In the example we also use the Model Patch Seamless node in order to have non repeating, tileable textures

workflowThis is the output textures from the workflow applied to a tessellated mesh in blender

Debug

This node is basically trying to provide informations about any input types supported by Comfy. It uses the dynamic inputs concept used across a few of the mtb nodes. It specifically handles a few types and fallback to string representation for the others.

debug

Curve

WIP A basic FLOAT_CURVE input node.

Crop

Crops an image and an optional mask to a given bounding box

The bounding box can be given as a tuple of (x, y, width, height) or as a BBOX type The BBOX input takes precedence over the tuple input

Concat Images

Add images to batch.

Colored Image

Constant color images of a given size can also be used to mask images.

This example uses VHS Nodes for animation preview batch_shapes

Workflow:

{"last_node_id":41,"last_link_id":65,"nodes":[{"id":13,"type":"Batch Float (mtb)","pos":[-1213,622],"size":[315,154],"flags":{},"order":0,"mode":0,"outputs":[{"name":"FLOATS","type":"FLOATS","links":[30],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Batch Float (mtb)"},"widgets_values":["Steps",12,0.001,5,"Quart In/Out"]},{"id":31,"type":"VHS_VideoCombine","pos":[1080,280],"size":[315,314],"flags":{},"order":16,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":50},{"name":"audio","type":"VHS_AUDIO","link":null},{"name":"batch_manager","type":"VHS_BatchManager","link":null}],"outputs":[{"name":"Filenames","type":"VHS_FILENAMES","links":null,"shape":3}],"properties":{"Node name for S&R":"VHS_VideoCombine"},"widgets_values":{"frame_rate":12,"loop_count":0,"filename_prefix":"AnimateDiff","format":"video/nvenc_hevc-mp4","pix_fmt":"yuv420p","bitrate":10,"megabit":true,"save_metadata":true,"pingpong":false,"save_output":false,"videopreview":{"hidden":false,"paused":false,"params":{"filename":"AnimateDiff_00004.mp4","subfolder":"","type":"temp","format":"video/nvenc_hevc-mp4"}}}},{"id":22,"type":"Batch Float Fill (mtb)","pos":[-884,621],"size":[315,106],"flags":{},"order":4,"mode":0,"inputs":[{"name":"floats","type":"FLOATS","link":30}],"outputs":[{"name":"FLOATS","type":"FLOATS","links":[31],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Batch Float Fill (mtb)"},"widgets_values":["tail",0,20]},{"id":30,"type":"ImageBlend","pos":[680,280],"size":[315,102],"flags":{},"order":14,"mode":0,"inputs":[{"name":"image1","type":"IMAGE","link":65},{"name":"image2","type":"IMAGE","link":48}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[50],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"ImageBlend"},"widgets_values":[1,"screen"]},{"id":15,"type":"Batch Transform (mtb)","pos":[484,561],"size":[210,194],"flags":{},"order":10,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":29,"slot_index":0},{"name":"x","type":"FLOATS","link":null},{"name":"y","type":"FLOATS","link":null},{"name":"zoom","type":"FLOATS","link":33},{"name":"angle","type":"FLOATS","link":null},{"name":"shear","type":"FLOATS","link":null}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[48],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Batch Transform (mtb)"},"widgets_values":["edge","#fa96c0"]},{"id":23,"type":"Batch Float Fill (mtb)","pos":[110,623],"size":[315,106],"flags":{},"order":5,"mode":0,"inputs":[{"name":"floats","type":"FLOATS","link":32}],"outputs":[{"name":"FLOATS","type":"FLOATS","links":[33],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Batch Float Fill (mtb)"},"widgets_values":["head",0,20]},{"id":21,"type":"Batch Float (mtb)","pos":[-246,623],"size":[315,154],"flags":{},"order":1,"mode":0,"outputs":[{"name":"FLOATS","type":"FLOATS","links":[32],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Batch Float (mtb)"},"widgets_values":["Steps",20,0.001,4.5,"Quart In/Out"]},{"id":41,"type":"Reroute","pos":[-91,283],"size":[75,26],"flags":{},"order":12,"mode":0,"inputs":[{"name":"","type":"*","link":64}],"outputs":[{"name":"","type":"IMAGE","links":[65]}],"properties":{"showOutputText":false,"horizontal":false}},{"id":14,"type":"Batch Transform (mtb)","pos":[-517,562],"size":[210,194],"flags":{},"order":9,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":27,"slot_index":0},{"name":"x","type":"FLOATS","link":null},{"name":"y","type":"FLOATS","link":null},{"name":"zoom","type":"FLOATS","link":31},{"name":"angle","type":"FLOATS","link":null},{"name":"shear","type":"FLOATS","link":null}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[37,62,64],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Batch Transform (mtb)"},"widgets_values":["edge","#fa96c0"]},{"id":35,"type":"LoadImage","pos":[-560,920],"size":[315,314],"flags":{},"order":2,"mode":0,"outputs":[{"name":"IMAGE","type":"IMAGE","links":[56],"shape":3,"slot_index":0},{"name":"MASK","type":"MASK","links":null,"shape":3}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["189.png","image"]},{"id":40,"type":"Blur (mtb)","pos":[-217,1000],"size":[315,82],"flags":{},"order":11,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":62,"slot_index":0}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[63],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Blur (mtb)"},"widgets_values":[50,50]},{"id":33,"type":"ImageToMask","pos":[120,997],"size":[210,58],"flags":{},"order":13,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":63,"slot_index":0}],"outputs":[{"name":"MASK","type":"MASK","links":[57],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"ImageToMask"},"widgets_values":["red"]},{"id":37,"type":"Colored Image (mtb)","pos":[350,920],"size":[210,138],"flags":{},"order":15,"mode":0,"inputs":[{"name":"foreground_image","type":"IMAGE","link":56,"slot_index":0},{"name":"foreground_mask","type":"MASK","link":57,"slot_index":1}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[55],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Colored Image (mtb)"},"widgets_values":["#1603fc",512,512]},{"id":36,"type":"VHS_VideoCombine","pos":[584,918],"size":[315,314],"flags":{},"order":17,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":55,"slot_index":0},{"name":"audio","type":"VHS_AUDIO","link":null},{"name":"batch_manager","type":"VHS_BatchManager","link":null}],"outputs":[{"name":"Filenames","type":"VHS_FILENAMES","links":null,"shape":3}],"properties":{"Node name for S&R":"VHS_VideoCombine"},"widgets_values":{"frame_rate":12,"loop_count":0,"filename_prefix":"AnimateDiff","format":"video/nvenc_hevc-mp4","pix_fmt":"yuv420p","bitrate":10,"megabit":true,"save_metadata":true,"pingpong":false,"save_output":false,"videopreview":{"hidden":false,"paused":false,"params":{"filename":"AnimateDiff_00009.mp4","subfolder":"","type":"temp","format":"video/nvenc_hevc-mp4"}}}},{"id":20,"type":"Mask To Image (mtb)","pos":[231,459],"size":[210,106],"flags":{},"order":8,"mode":0,"inputs":[{"name":"mask","type":"MASK","link":28,"slot_index":0}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[29],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Mask To Image (mtb)"},"widgets_values":["#00ff00","#000000"]},{"id":16,"type":"ImageToMask","pos":[-750,191],"size":[210,58],"flags":{},"order":6,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":25}],"outputs":[{"name":"MASK","type":"MASK","links":[26,28],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"ImageToMask"},"widgets_values":["red"]},{"id":19,"type":"Mask To Image (mtb)","pos":[-750,446],"size":[210,106],"flags":{},"order":7,"mode":0,"inputs":[{"name":"mask","type":"MASK","link":26,"slot_index":0}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[27],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Mask To Image (mtb)"},"widgets_values":["#ff0000","#000000"]},{"id":11,"type":"Batch Shape (mtb)","pos":[-1039,192],"size":[210,334],"flags":{},"order":3,"mode":0,"outputs":[{"name":"IMAGE","type":"IMAGE","links":[25],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Batch Shape (mtb)"},"widgets_values":[20,"Tube",1024,1024,512,"#ffffff","#000000","#000000",250,0,0]}],"links":[[25,11,0,16,0,"IMAGE"],[26,16,0,19,0,"MASK"],[27,19,0,14,0,"IMAGE"],[28,16,0,20,0,"MASK"],[29,20,0,15,0,"IMAGE"],[30,13,0,22,0,"FLOATS"],[31,22,0,14,3,"FLOATS"],[32,21,0,23,0,"FLOATS"],[33,23,0,15,3,"FLOATS"],[37,14,0,27,0,"IMAGE"],[48,15,0,30,1,"IMAGE"],[50,30,0,31,0,"IMAGE"],[55,37,0,36,0,"IMAGE"],[56,35,0,37,0,"IMAGE"],[57,33,0,37,1,"MASK"],[62,14,0,40,0,"IMAGE"],[63,40,0,33,0,"IMAGE"],[64,14,0,41,0,"*"],[65,41,0,30,0,"IMAGE"]],"groups":[],"config":{},"extra":{"workspace_info":{"id":"lHUoc3eCvYMplIxkGM68o"}},"version":0.4}

Color Correct

Various color correction methods

Blur

Applies a Gaussian blur to the given image / batch.
It allows a few more things than the core blur node, namely:

  • Higher values (core is limited to 30)
  • Individual X & Y blur
  • FLOATS support for individual batch frame blur

BBox

The bounding box (BBOX) custom type used by other nodes

BBox from Mask

From a mask extract the bounding box

Batch Transform

Transform a batch of images using a batch of keyframes

Batch Nodes

All nodes in the mtb pack should support batch input already as a lot of the less AI related tools of mtb relies on that for animation. Those nodes are meant to be generic enough to build upon yet they are mainly built with animateDiff workflows in mind.

Batch Floats

Batch float (FLOATS type) are basically a series of value, a list of floats. You can think of it as an analogy to image batches but using numbers instead of images. This can be used to manipulate batches with different values based on the batch index

batch_nodes++

Batch Float

Generates a batch of float values with interpolation batch_nodes+

Batch Float Assemble

Assembles multiple batches of floats into a single stream (batch)

Batch Float Fill

Fills a batch float with a single value until it reaches the target length

Plot Batch Float

Visualize values over time

Batch Transforms

Batch transforms are usually paired with Batch values (for now only float exists in mtb)

Batch Shake

Applies a shaking effect to batches of images simulating a camera shaking effect

Batch Transform

This is exactly like the Transform Image node, but it accepts batch values as input

batch transform applied to an OpenPose imagefed to animateDiff
bcb1e1e959AnimateDiff_00041_

Batch Shape

Generates a batch of 2D shapes with optional shading (experimental)

Note This will soon be replaced by a non batch variant, it was an experiment before Batch Make existed

Batch Shape

Generates a batch of 2D shapes with optional shading (experimental)

Batch Shake

Applies a shaking effect to batches of images.

Batch Merge

Merges multiple image batches with different frame counts

Batch Make

Simply duplicates the input frame as a batch

Batch Float

Generates a batch of float values with interpolation

Batch Float Fill

Fills a batch float with a single value until it reaches the target length

Batch Float Assemble

Assembles mutiple batches of floats into a single stream (batch)

Autopan Equilateral

Generate a 360 panning video from an equilateral image.

Apply Text Template

Very basic string interpolation using dynamic inputs.

The var names are var_1, var_2 etc... They are interpolated like this: {var_1}, see the following example for a more concrete idea:

template_string

Any to String

Tries to take any input and convert it to a string.

Animation Builder

This node is built around the idea of values over a queue of frames:

  • This basic example should help to understand the meaning of its inputs and outputs thanks to the debug node.

  • In this other example Animation Builder is used in combination with Batch From History to create a zoom-in animation on a static image

expand here to copy paste this workflow
{"last_node_id":13,"last_link_id":18,"nodes":[{"id":5,"type":"LoadImage","pos":[403,150],"size":[315,314.00000381469727],"flags":{},"order":0,"mode":0,"outputs":[{"name":"IMAGE","type":"IMAGE","links":[10],"shape":3,"slot_index":0},{"name":"MASK","type":"MASK","links":null,"shape":3}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["mtb_demo_00014_.png","image"]},{"id":8,"type":"Fit Number (mtb)","pos":[641,530],"size":[271.7657504751661,178.85995470787861],"flags":{},"order":2,"mode":0,"inputs":[{"name":"value","type":"FLOAT","link":11,"widget":{"name":"value"}}],"outputs":[{"name":"FLOAT","type":"FLOAT","links":[12,13],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Fit Number (mtb)"},"widgets_values":[0,false,0,1,1,2,"Quart In/Out"]},{"id":9,"type":"Debug (mtb)","pos":[967,530],"size":[210,130],"flags":{},"order":5,"mode":0,"inputs":[{"name":"anything_1","type":"FLOAT","link":13},{"name":"anything_2","type":"*","link":null}],"properties":{"Node name for S&R":"Debug (mtb)"},"widgets_values":[false,"2.0"]},{"id":11,"type":"Reroute","pos":[656,799],"size":[75,26],"flags":{},"order":3,"mode":0,"inputs":[{"name":"","type":"*","link":15}],"outputs":[{"name":"","type":"BOOLEAN","links":[16]}],"properties":{"showOutputText":false,"horizontal":false}},{"id":6,"type":"Transform Image (mtb)","pos":[991,151],"size":[210,214],"flags":{},"order":4,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":10},{"name":"zoom","type":"FLOAT","link":12,"widget":{"name":"zoom"}}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[17],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Transform Image (mtb)"},"widgets_values":[0,0,1,0,0,"edge","#000000"]},{"id":12,"type":"SaveImage","pos":[1286,151],"size":[315,270],"flags":{},"order":7,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":17}],"properties":{},"widgets_values":["ComfyUI"]},{"id":10,"type":"Get Batch From History (mtb)","pos":[832,780],"size":[315,130],"flags":{},"order":6,"mode":0,"inputs":[{"name":"passthrough_image","type":"IMAGE","link":null},{"name":"enable","type":"BOOLEAN","link":16,"widget":{"name":"enable"},"slot_index":1}],"outputs":[{"name":"images","type":"IMAGE","links":[18],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"Get Batch From History (mtb)"},"widgets_values":[true,29,0,30]},{"id":7,"type":"Animation Builder (mtb)","pos":[381,512],"size":[210,318],"flags":{},"order":1,"mode":0,"outputs":[{"name":"frame","type":"INT","links":null,"shape":3},{"name":"0-1 (scaled)","type":"FLOAT","links":[11],"shape":3,"slot_index":1},{"name":"count","type":"INT","links":null,"shape":3},{"name":"loop_ended","type":"BOOLEAN","links":[15],"shape":3,"slot_index":3}],"properties":{"Node name for S&R":"Animation Builder (mtb)"},"widgets_values":[30,1,1,30,1,"frame: 0 / 29","Done 😎!","reset","queue"]},{"id":13,"type":"Save Gif (mtb)","pos":[1260,545],"size":[502.75089721679683,415.69302444458015],"flags":{},"order":8,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":18}],"properties":{"Node name for S&R":"Save Gif (mtb)"},"widgets_values":[12,1,false,false,"nearest","/view?filename=7f58602dba.gif&subfolder=&type=output"]}],"links":[[10,5,0,6,0,"IMAGE"],[11,7,1,8,0,"FLOAT"],[12,8,0,6,1,"FLOAT"],[13,8,0,9,0,"*"],[15,7,3,11,0,"*"],[16,11,0,10,1,"BOOLEAN"],[17,6,0,12,0,"IMAGE"],[18,10,0,13,0,"IMAGE"]],"groups":[],"config":{},"extra":{},"version":0.4}

Inputs

namedescription
total_framesThe number of frame to queue (this is multiplied by the loop_count)
scale_floatConvenience input to scale the normalized current value (a float between 0 and 1 lerp over the current queue length)
loop_countThe number of loops to queue
Reset Buttonresets the internal counters, although the node is though around using its queue button it should still work fine when using the regular queue button of comfy
Queue ButtonConvenience button to run the queues (total_frames * loop_count)

Add a video to the playlist