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 given a keyword and a size
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 images while maintaining the input tensor shape
Send a image or mask tensor to the given device.
Turn text into an image with automatic wrapping. You can still control the offset and coverage of the wrap:
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.
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:
Basic string replacement.
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:
width when stacking vertically.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:
Utils to control the steps start/stop of the KAdvancedSampler in percentage
Sharpens an image using a Gaussian kernel.
Save torch tensors (image, mask or latent) to disk. useful to debug things outside comfy like in notebooks.
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 all the images in the input batch as a grid of images.
Save the images from the batch as a GIF
Uses GFPGan to restore faces
Basic QR Code generator
FLOATSPlot FLOATS using matplotlib, each of them are drawn in a different color.
Pick a specific number of images from a batch either from the head or the tail.
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
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 images dimensions along the given axis, preserving aspect ratio.
Converts a mask (alpha) to an RGB image with a color and background
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:
* it will glob the paths using it.0-10 to load frame 0 to 10) current_frame is ignored.Load an image from the given URL
Loads a FILM model
Loads a faceswap model
Loads a GFPGan or RestoreFormer model for face enhancement.
Loads a face analysis model
Linear interpolation (blend) between two latent vectors
Basic int to bool conversion, >= 1 is true
Mimics an old photoshop technique to check for seamless textures
Extracted mostly from WAS Node Suite, with a few edits (most notably multiple image support) and less features.
Removes the background from the input using Rembg.
Premultiply image with mask
Compare two images and return a difference image
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:
{"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
| name | description |
|---|---|
| passthrough_image | This 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) |
| enable | This 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 |
| count | the number of frames to fetch from the history |
| Reset Button | resets 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 Button | Convenience button to run the queues (total_frames * loop_count) |
FLOATS to FLOATAD, IPA, Fitz etc have commonly choose to mistype float lists as FLOAT.
This is just a hack to be compatible with these
Filters an image based on a depth map
Warning This is part of the
optionalnodes, if you are on linux or mac you can skip this warning, on windows I would recommend looking into alternative like ComfyUI-Frame-Interpolation
This node loads and cache a given FILM model
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
Face swap using deepinsight/insightface models
Quite crude node, VHS is recommended now
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
| workflow | This is the output textures from the workflow applied to a tessellated mesh in blender |
|---|---|
![]() | ![]() |
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.
WIP A basic FLOAT_CURVE input node.
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
Add images to batch.
Constant color images of a given size can also be used to mask images.
This example uses VHS Nodes for animation preview
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}
Various color correction methods
Applies a Gaussian blur to the given image / batch.
It allows a few more things than the core blur node, namely:
FLOATS support for individual batch frame blurThe bounding box (BBOX) custom type used by other nodes
From a mask extract the bounding box
Transform a batch of images using a batch of keyframes
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 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
Generates a batch of float values with interpolation
Assembles multiple batches of floats into a single stream (batch)
Fills a batch float with a single value until it reaches the target length
Visualize values over time

Batch transforms are usually paired with Batch values (for now only float exists in mtb)
Applies a shaking effect to batches of images simulating a camera shaking effect
This is exactly like the Transform Image node, but it accepts batch values as input
| batch transform applied to an OpenPose image | fed to animateDiff |
|---|---|
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
Generates a batch of 2D shapes with optional shading (experimental)
Applies a shaking effect to batches of images.
Merges multiple image batches with different frame counts
Simply duplicates the input frame as a batch
Generates a batch of float values with interpolation
Fills a batch float with a single value until it reaches the target length
Assembles mutiple batches of floats into a single stream (batch)
Generate a 360 panning video from an equilateral image.
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:
Tries to take any input and convert it to a string.
This node is built around the idea of values over a queue of frames:
{"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}
| name | description |
|---|---|
| total_frames | The number of frame to queue (this is multiplied by the loop_count) |
| scale_float | Convenience input to scale the normalized current value (a float between 0 and 1 lerp over the current queue length) |
| loop_count | The number of loops to queue |
| Reset Button | resets 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 Button | Convenience button to run the queues (total_frames * loop_count) |
Add a video to the playlist