From 69630377d5508ef15dcd70ebcfdf7b9ee947c4e3 Mon Sep 17 00:00:00 2001 From: aidec Date: Tue, 14 Oct 2025 17:25:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AA=AA=E6=98=8E=E8=88=87?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E7=AF=84=E4=BE=8Bworkflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/image2image自循環範例.json | 1 + 新增節點說明.md | 840 +++++++++++++++++++++++------ 2 files changed, 663 insertions(+), 178 deletions(-) create mode 100644 example/image2image自循環範例.json diff --git a/example/image2image自循環範例.json b/example/image2image自循環範例.json new file mode 100644 index 0000000..13174cd --- /dev/null +++ b/example/image2image自循環範例.json @@ -0,0 +1 @@ +{"id":"7cb6261d-3b03-4171-bbd1-a4b256b42404","revision":0,"last_node_id":42,"last_link_id":45,"nodes":[{"id":7,"type":"CLIPTextEncode","pos":[280,410],"size":[425.27801513671875,180.6060791015625],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"clip","name":"clip","type":"CLIP","link":15},{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":null}],"outputs":[{"localized_name":"CONDITIONING","name":"CONDITIONING","type":"CONDITIONING","slot_index":0,"links":[6]}],"properties":{"Node name for S&R":"CLIPTextEncode","cnr_id":"comfy-core","ver":"0.3.44","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["watermark, text\n"],"color":"#223","bgcolor":"#335"},{"id":16,"type":"MarkdownNote","pos":[-440,160],"size":[314.95745849609375,133.0336456298828],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[],"properties":{"ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["[Tutorials](https://docs.comfy.org/tutorials/basic/image-to-image)|[教程](https://docs.comfy.org/zh-CN/tutorials/basic/image-to-image)\n\nDownload [v1-5-pruned-emaonly-fp16.safetensors](https://huggingface.co/Comfy-Org/stable-diffusion-v1-5-archive/resolve/main/v1-5-pruned-emaonly-fp16.safetensors?download=true) and save it under **ComfyUI/models/checkpoints** "],"color":"#432","bgcolor":"#653"},{"id":3,"type":"KSampler","pos":[740,180],"size":[315,262],"flags":{},"order":24,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"MODEL","link":13},{"localized_name":"positive","name":"positive","type":"CONDITIONING","link":4},{"localized_name":"negative","name":"negative","type":"CONDITIONING","link":6},{"localized_name":"latent_image","name":"latent_image","type":"LATENT","link":11},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"steps","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"sampler_name","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"scheduler","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"denoise","name":"denoise","type":"FLOAT","widget":{"name":"denoise"},"link":null}],"outputs":[{"localized_name":"LATENT","name":"LATENT","type":"LATENT","slot_index":0,"links":[7]}],"properties":{"Node name for S&R":"KSampler","cnr_id":"comfy-core","ver":"0.3.44","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":[327073085206831,"randomize",20,8,"dpmpp_2m","normal",0.8700000000000001]},{"id":9,"type":"SaveImage","pos":[1080,280],"size":[450,430],"flags":{},"order":26,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":9},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null}],"outputs":[],"properties":{"Node name for S&R":"SaveImage","cnr_id":"comfy-core","ver":"0.3.44","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["ComfyUI"]},{"id":12,"type":"VAEEncode","pos":[560,650],"size":[210,46],"flags":{},"order":19,"mode":0,"inputs":[{"localized_name":"pixels","name":"pixels","type":"IMAGE","link":19},{"localized_name":"vae","name":"vae","type":"VAE","link":16}],"outputs":[{"localized_name":"LATENT","name":"LATENT","type":"LATENT","slot_index":0,"links":[11]}],"properties":{"Node name for S&R":"VAEEncode","cnr_id":"comfy-core","ver":"0.3.44","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":[]},{"id":17,"type":"MarkdownNote","pos":[740,490],"size":[310,110],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[],"properties":{"ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["When using the image - to - image workflow, you should remember that the **denoise** value should be less than 1. The closer the value is to 0, the more features of the input image the output image will retain."],"color":"#432","bgcolor":"#653"},{"id":18,"type":"ImageScaleToTotalPixels","pos":[280,650],"size":[260,82],"flags":{},"order":14,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":21},{"localized_name":"upscale_method","name":"upscale_method","type":"COMBO","widget":{"name":"upscale_method"},"link":null},{"localized_name":"megapixels","name":"megapixels","type":"FLOAT","widget":{"name":"megapixels"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[19]}],"properties":{"Node name for S&R":"ImageScaleToTotalPixels","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["nearest-exact",0.25]},{"id":19,"type":"MarkdownNote","pos":[280,780],"size":[270,120],"flags":{},"order":2,"mode":0,"inputs":[],"outputs":[],"title":"About Scale Image to Total Pixels","properties":{"ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["The model this template uses is trained based on a 512*512 image dataset. So if you use an input image that's too large, it might cause some issues. We've added the Scale image to total pixels node to scale images. If you're quite familiar with this model, you can remove it."],"color":"#432","bgcolor":"#653"},{"id":14,"type":"CheckpointLoaderSimple","pos":[-90,200],"size":[315,98],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"ckpt_name","name":"ckpt_name","type":"COMBO","widget":{"name":"ckpt_name"},"link":null}],"outputs":[{"localized_name":"MODEL","name":"MODEL","type":"MODEL","slot_index":0,"links":[13]},{"localized_name":"CLIP","name":"CLIP","type":"CLIP","slot_index":1,"links":[14,15]},{"localized_name":"VAE","name":"VAE","type":"VAE","slot_index":2,"links":[16,17]}],"properties":{"Node name for S&R":"CheckpointLoaderSimple","cnr_id":"comfy-core","ver":"0.3.44","models":[{"name":"v1-5-pruned-emaonly-fp16.safetensors","url":"https://huggingface.co/Comfy-Org/stable-diffusion-v1-5-archive/resolve/main/v1-5-pruned-emaonly-fp16.safetensors?download=true","directory":"checkpoints"}],"ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["turboDiffusionXL_v12.safetensors"],"color":"#322","bgcolor":"#533"},{"id":8,"type":"VAEDecode","pos":[1080,180],"size":[210,46],"flags":{},"order":25,"mode":0,"inputs":[{"localized_name":"samples","name":"samples","type":"LATENT","link":7},{"localized_name":"vae","name":"vae","type":"VAE","link":17}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","slot_index":0,"links":[9,22]}],"properties":{"Node name for S&R":"VAEDecode","cnr_id":"comfy-core","ver":"0.3.44","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":[]},{"id":26,"type":"easy showAnything","pos":[1967.3206787109375,-21.555667877197266],"size":[210,88],"flags":{},"order":30,"mode":0,"inputs":[{"localized_name":"anything","name":"anything","shape":7,"type":"*","link":26}],"outputs":[{"localized_name":"output","name":"output","type":"*","links":null}],"properties":{"Node name for S&R":"easy showAnything","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["7"]},{"id":21,"type":"LoadImagesFromDirBatch","pos":[-1355.48291015625,566.5278930664062],"size":[278.8580017089844,230],"flags":{},"order":4,"mode":4,"inputs":[{"localized_name":"directory","name":"directory","type":"STRING","widget":{"name":"directory"},"link":null},{"localized_name":"image_load_cap","name":"image_load_cap","shape":7,"type":"INT","widget":{"name":"image_load_cap"},"link":null},{"localized_name":"start_index","name":"start_index","shape":7,"type":"INT","widget":{"name":"start_index"},"link":null},{"localized_name":"load_always","name":"load_always","shape":7,"type":"BOOLEAN","widget":{"name":"load_always"},"link":null}],"outputs":[{"localized_name":"image","name":"image","type":"IMAGE","links":null},{"localized_name":"mask","name":"mask","type":"MASK","links":null},{"localized_name":"count","name":"count","type":"INT","links":null},{"localized_name":"filenames","name":"filenames","type":"STRING","links":null},{"localized_name":"full_paths","name":"full_paths","type":"STRING","links":null},{"localized_name":"path_only","name":"path_only","type":"STRING","links":null}],"properties":{"Node name for S&R":"LoadImagesFromDirBatch","ue_properties":{"widget_ue_connectable":{"directory":true,"image_load_cap":true,"start_index":true,"load_always":true},"version":"7.0.1"}},"widgets_values":["",0,0,false]},{"id":35,"type":"DataTmpGet","pos":[-847.7952270507812,-940.165283203125],"size":[400,284],"flags":{},"order":5,"mode":4,"inputs":[{"localized_name":"var_name","name":"var_name","type":"STRING","widget":{"name":"var_name"},"link":null},{"localized_name":"data_type","name":"data_type","type":"COMBO","widget":{"name":"data_type"},"link":null},{"localized_name":"read_mode","name":"read_mode","type":"COMBO","widget":{"name":"read_mode"},"link":null},{"localized_name":"array_index","name":"array_index","shape":7,"type":"INT","widget":{"name":"array_index"},"link":null},{"localized_name":"default_text","name":"default_text","shape":7,"type":"STRING","widget":{"name":"default_text"},"link":null}],"outputs":[{"localized_name":"text","name":"text","type":"STRING","links":null},{"localized_name":"image","name":"image","type":"IMAGE","links":null},{"localized_name":"any","name":"any","type":"*","links":null},{"localized_name":"array_size","name":"array_size","type":"INT","links":null},{"localized_name":"all_elements","name":"all_elements","type":"*","links":null},{"localized_name":"status","name":"status","type":"STRING","links":null}],"properties":{"Node name for S&R":"DataTmpGet","ue_properties":{"widget_ue_connectable":{"var_name":true,"data_type":true,"read_mode":true,"array_index":true,"default_text":true},"version":"7.0.1"}},"widgets_values":["my_var","text","index",0,""]},{"id":36,"type":"DataTempManager","pos":[-434.7142333984375,-942.0402221679688],"size":[270,146],"flags":{},"order":6,"mode":4,"inputs":[{"localized_name":"action","name":"action","type":"COMBO","widget":{"name":"action"},"link":null},{"localized_name":"var_name","name":"var_name","shape":7,"type":"STRING","widget":{"name":"var_name"},"link":null},{"localized_name":"array_index","name":"array_index","shape":7,"type":"INT","widget":{"name":"array_index"},"link":null}],"outputs":[{"localized_name":"variables_list","name":"variables_list","type":"STRING","links":null},{"localized_name":"status","name":"status","type":"STRING","links":null},{"localized_name":"total_vars","name":"total_vars","type":"INT","links":null}],"properties":{"Node name for S&R":"DataTempManager","ue_properties":{"widget_ue_connectable":{"action":true,"var_name":true,"array_index":true},"version":"7.0.1"}},"widgets_values":["list_all","",0]},{"id":6,"type":"CLIPTextEncode","pos":[280,210],"size":[422.84503173828125,164.31304931640625],"flags":{},"order":21,"mode":0,"inputs":[{"localized_name":"clip","name":"clip","type":"CLIP","link":14},{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":36}],"outputs":[{"localized_name":"CONDITIONING","name":"CONDITIONING","type":"CONDITIONING","slot_index":0,"links":[4]}],"properties":{"Node name for S&R":"CLIPTextEncode","cnr_id":"comfy-core","ver":"0.3.44","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["photograph of victorian woman with wings, sky clouds, meadow grass\n"],"color":"#232","bgcolor":"#353"},{"id":31,"type":"easy showAnything","pos":[176.63145446777344,-251.7708740234375],"size":[210,88],"flags":{},"order":22,"mode":0,"inputs":[{"localized_name":"anything","name":"anything","shape":7,"type":"*","link":30}],"outputs":[{"localized_name":"output","name":"output","type":"*","links":null}],"properties":{"Node name for S&R":"easy showAnything","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["7"]},{"id":30,"type":"easy showAnything","pos":[-14.300551414489746,-557.31982421875],"size":[396.7310485839844,173.84214782714844],"flags":{},"order":20,"mode":0,"inputs":[{"localized_name":"anything","name":"anything","shape":7,"type":"*","link":29}],"outputs":[{"localized_name":"output","name":"output","type":"*","links":null}],"properties":{"Node name for S&R":"easy showAnything","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["photograph of victorian woman with wings, sky clouds, meadow grass"]},{"id":37,"type":"easy showAnything","pos":[-619.1890258789062,-10.17772388458252],"size":[210,88],"flags":{},"order":18,"mode":0,"inputs":[{"localized_name":"anything","name":"anything","shape":7,"type":"*","link":37}],"outputs":[{"localized_name":"output","name":"output","type":"*","links":null}],"properties":{"Node name for S&R":"easy showAnything","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["8"]},{"id":23,"type":"easy showAnything","pos":[1947.2503662109375,-351.31378173828125],"size":[365.7895812988281,88],"flags":{},"order":28,"mode":0,"inputs":[{"localized_name":"anything","name":"anything","shape":7,"type":"*","link":23}],"outputs":[{"localized_name":"output","name":"output","type":"*","links":null}],"properties":{"Node name for S&R":"easy showAnything","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["Pushed data to array 'myImages10' at index 6"]},{"id":38,"type":"PreviewImage","pos":[2217.45263671875,-191.38424682617188],"size":[140,246],"flags":{},"order":29,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":38}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":[]},{"id":27,"type":"easy showAnything","pos":[1969.834228515625,133.9298858642578],"size":[210,88],"flags":{},"order":31,"mode":0,"inputs":[{"localized_name":"anything","name":"anything","shape":7,"type":"*","link":27}],"outputs":[{"localized_name":"output","name":"output","type":"*","links":null}],"properties":{"Node name for S&R":"easy showAnything","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["Type: image | Array size: 7"]},{"id":29,"type":"TextArrayIndex","pos":[-574.5689086914062,-346.1485900878906],"size":[270,138],"flags":{},"order":16,"mode":0,"inputs":[{"localized_name":"array_1","name":"array_1","shape":7,"type":"*","link":28},{"localized_name":"array_2","name":"array_2","shape":7,"type":"*","link":null},{"localized_name":"array_3","name":"array_3","shape":7,"type":"*","link":null},{"localized_name":"array_4","name":"array_4","shape":7,"type":"*","link":null},{"localized_name":"array_5","name":"array_5","shape":7,"type":"*","link":null},{"localized_name":"index","name":"index","type":"INT","widget":{"name":"index"},"link":32}],"outputs":[{"localized_name":"text","name":"text","type":"STRING","links":[29,36]},{"localized_name":"total","name":"total","type":"INT","links":[30]},{"localized_name":"status","name":"status","type":"STRING","links":[31]}],"properties":{"Node name for S&R":"TextArrayIndex","ue_properties":{"widget_ue_connectable":{"index":true},"version":"7.0.1"}},"widgets_values":[0]},{"id":39,"type":"easy showAnything","pos":[-604.8746948242188,-127.8592529296875],"size":[210,88],"flags":{},"order":17,"mode":0,"inputs":[{"localized_name":"anything","name":"anything","shape":7,"type":"*","link":39}],"outputs":[{"localized_name":"output","name":"output","type":"*","links":null}],"properties":{"Node name for S&R":"easy showAnything","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["6"]},{"id":42,"type":"PreviewImage","pos":[-655.7320556640625,259.27276611328125],"size":[140,246.00001525878906],"flags":{},"order":15,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":43}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":[]},{"id":32,"type":"easy showAnything","pos":[-102.524169921875,-271.43634033203125],"size":[210,88],"flags":{},"order":23,"mode":0,"inputs":[{"localized_name":"anything","name":"anything","shape":7,"type":"*","link":31}],"outputs":[{"localized_name":"output","name":"output","type":"*","links":null}],"properties":{"Node name for S&R":"easy showAnything","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["Retrieved item 7/7"]},{"id":33,"type":"ttN text","pos":[-1828.8707275390625,-519.887939453125],"size":[400,200],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":null}],"outputs":[{"localized_name":"text","name":"text","type":"STRING","links":[33]}],"properties":{"Node name for S&R":"ttN text","ttNnodeVersion":"1.0.0","ue_properties":{"widget_ue_connectable":{"text":true},"version":"7.0.1"}},"widgets_values":["1girl photograph of victorian woman with wings, sky clouds, meadow grass\n1boy\n1fish\n1man\n1dog\n1cat\n#註解\nphotograph of victorian woman with wings, sky clouds, meadow grass"]},{"id":28,"type":"TextSplitGet","pos":[-1414.1678466796875,-533.754638671875],"size":[400,312],"flags":{},"order":10,"mode":0,"inputs":[{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":33},{"localized_name":"index","name":"index","type":"INT","widget":{"name":"index"},"link":null},{"localized_name":"separator_type","name":"separator_type","type":"COMBO","widget":{"name":"separator_type"},"link":null},{"localized_name":"custom_separator","name":"custom_separator","type":"STRING","widget":{"name":"custom_separator"},"link":null},{"localized_name":"ignore_comment","name":"ignore_comment","type":"BOOLEAN","widget":{"name":"ignore_comment"},"link":null},{"localized_name":"comment_prefix","name":"comment_prefix","type":"STRING","widget":{"name":"comment_prefix"},"link":null},{"localized_name":"trim_whitespace","name":"trim_whitespace","type":"BOOLEAN","widget":{"name":"trim_whitespace"},"link":null}],"outputs":[{"localized_name":"text","name":"text","type":"STRING","links":null},{"localized_name":"current_index","name":"current_index","type":"INT","links":null},{"localized_name":"total","name":"total","type":"INT","links":[34,35]},{"localized_name":"array","name":"array","type":"*","links":[28]},{"localized_name":"status","name":"status","type":"STRING","links":null}],"properties":{"Node name for S&R":"TextSplitGet","ue_properties":{"widget_ue_connectable":{"text":true,"index":true,"separator_type":true,"custom_separator":true,"ignore_comment":true,"comment_prefix":true,"trim_whitespace":true},"version":"7.0.1"}},"widgets_values":["item1\nitem2\nitem3\n# comment",0,"newline","|",true,"#",true]},{"id":34,"type":"easy showAnything","pos":[-922.5120849609375,-498.649658203125],"size":[210,88],"flags":{},"order":12,"mode":0,"inputs":[{"localized_name":"anything","name":"anything","shape":7,"type":"*","link":35}],"outputs":[{"localized_name":"output","name":"output","type":"*","links":null}],"properties":{"Node name for S&R":"easy showAnything","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["7"]},{"id":10,"type":"LoadImage","pos":[-1666.6944580078125,-202.58082580566406],"size":[310,314],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","slot_index":0,"links":[41]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage","cnr_id":"comfy-core","ver":"0.3.44","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":["a_00008.png","image"],"color":"#322","bgcolor":"#533"},{"id":40,"type":"ImageCombine","pos":[-1293.4071044921875,43.768890380859375],"size":[140,46],"flags":{},"order":11,"mode":0,"inputs":[{"localized_name":"image_1","name":"image_1","type":"IMAGE","link":41},{"localized_name":"image_2","name":"image_2","type":"IMAGE","link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[45]}],"properties":{"Node name for S&R":"ImageCombine","ue_properties":{"widget_ue_connectable":{},"version":"7.0.1"}},"widgets_values":[]},{"id":20,"type":"ImageQueueProcessorPlus","pos":[-968.1972045898438,-160.5908660888672],"size":[282.7681579589844,258],"flags":{},"order":13,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":45},{"localized_name":"additional_image","name":"additional_image","shape":7,"type":"IMAGE","link":null},{"localized_name":"start_index","name":"start_index","type":"INT","widget":{"name":"start_index"},"link":null},{"localized_name":"max_index","name":"max_index","type":"INT","widget":{"name":"max_index"},"link":34},{"localized_name":"trigger_next","name":"trigger_next","type":"BOOLEAN","widget":{"name":"trigger_next"},"link":null},{"localized_name":"enable_loop","name":"enable_loop","type":"BOOLEAN","widget":{"name":"enable_loop"},"link":null},{"localized_name":"data_tmp_var","name":"data_tmp_var","shape":7,"type":"STRING","widget":{"name":"data_tmp_var"},"link":null},{"localized_name":"use_data_tmp","name":"use_data_tmp","shape":7,"type":"BOOLEAN","widget":{"name":"use_data_tmp"},"link":null}],"outputs":[{"localized_name":"image","name":"image","type":"IMAGE","links":[21,43]},{"localized_name":"current_index","name":"current_index","type":"INT","links":[32,39]},{"localized_name":"total","name":"total","type":"INT","links":[37]},{"localized_name":"completed","name":"completed","type":"BOOLEAN","links":null},{"localized_name":"status","name":"status","type":"STRING","links":null}],"properties":{"Node name for S&R":"ImageQueueProcessorPlus","ue_properties":{"widget_ue_connectable":{"start_index":true,"max_index":true,"trigger_next":true,"enable_loop":true,"data_tmp_var":true,"use_data_tmp":true},"version":"7.0.1"}},"widgets_values":[6,10,true,true,"myImages10",true]},{"id":22,"type":"DataTmpSet","pos":[1495.415771484375,-48.18394088745117],"size":[400,244],"flags":{},"order":27,"mode":0,"inputs":[{"localized_name":"image_data","name":"image_data","shape":7,"type":"IMAGE","link":22},{"localized_name":"any_data","name":"any_data","shape":7,"type":"*","link":null},{"localized_name":"var_name","name":"var_name","type":"STRING","widget":{"name":"var_name"},"link":null},{"localized_name":"operation","name":"operation","type":"COMBO","widget":{"name":"operation"},"link":null},{"localized_name":"data_type","name":"data_type","type":"COMBO","widget":{"name":"data_type"},"link":null},{"localized_name":"text_data","name":"text_data","shape":7,"type":"STRING","widget":{"name":"text_data"},"link":null},{"localized_name":"array_index","name":"array_index","shape":7,"type":"INT","widget":{"name":"array_index"},"link":null}],"outputs":[{"localized_name":"status","name":"status","type":"STRING","links":[23]},{"localized_name":"preview","name":"preview","type":"IMAGE","links":[38]},{"localized_name":"array_size","name":"array_size","type":"INT","links":[26]},{"localized_name":"info","name":"info","type":"STRING","links":[27]}],"properties":{"Node name for S&R":"DataTmpSet","ue_properties":{"widget_ue_connectable":{"var_name":true,"operation":true,"data_type":true,"text_data":true,"array_index":true},"version":"7.0.1"}},"widgets_values":["myImages10","array_push","image","",0]}],"links":[[4,6,0,3,1,"CONDITIONING"],[6,7,0,3,2,"CONDITIONING"],[7,3,0,8,0,"LATENT"],[9,8,0,9,0,"IMAGE"],[11,12,0,3,3,"LATENT"],[13,14,0,3,0,"MODEL"],[14,14,1,6,0,"CLIP"],[15,14,1,7,0,"CLIP"],[16,14,2,12,1,"VAE"],[17,14,2,8,1,"VAE"],[19,18,0,12,0,"IMAGE"],[21,20,0,18,0,"IMAGE"],[22,8,0,22,0,"IMAGE"],[23,22,0,23,0,"*"],[26,22,2,26,0,"*"],[27,22,3,27,0,"*"],[28,28,3,29,0,"*"],[29,29,0,30,0,"*"],[30,29,1,31,0,"*"],[31,29,2,32,0,"*"],[32,20,1,29,5,"INT"],[33,33,0,28,0,"STRING"],[34,28,2,20,3,"INT"],[35,28,2,34,0,"*"],[36,29,0,6,1,"STRING"],[37,20,2,37,0,"*"],[38,22,1,38,0,"IMAGE"],[39,20,1,39,0,"*"],[41,10,0,40,0,"IMAGE"],[43,20,0,42,0,"IMAGE"],[45,40,0,20,0,"IMAGE"]],"groups":[{"id":1,"title":"Step2 - Upload image","bounding":[-100,330,340,420],"color":"#3f789e","font_size":24,"flags":{}},{"id":2,"title":"Step1 - Load model","bounding":[-100,130,340,180],"color":"#3f789e","font_size":24,"flags":{}},{"id":3,"title":"Step3 - Prompt","bounding":[270,130,450,470],"color":"#3f789e","font_size":24,"flags":{}}],"config":{},"extra":{"ds":{"scale":0.5445000000000003,"offset":[2558.5500734054563,908.7405815955253]},"frontendVersion":"1.24.1","ue_links":[],"links_added_by_ue":[],"node_versions":{"comfy-core":"0.3.62","Comfyui_TextBatch_aidec":"c2c8899c6d4a7c54cc85f8a2320d5283d31eac30","images-grid-comfy-plugin":"852db490ef93702e1c68fe9774bdf65aaa7d3574"}},"version":0.4} \ No newline at end of file diff --git a/新增節點說明.md b/新增節點說明.md index c6bc2b5..ae0a6be 100644 --- a/新增節點說明.md +++ b/新增節點說明.md @@ -1,71 +1,392 @@ # 新增節點說明 -本次更新新增了 幾個實用節點,擴展了 ComfyUI TextBatch 的功能。 -最近看到Qwen Image Edit 搭配Next Sence Lora可以預測下一場景。於是想到若能搭配節點讀取生成後的圖片,作為新來源,讓它自行反覆循環,於是添加以下這些節點。 +本次更新新增了 7 個實用節點,擴展了 ComfyUI TextBatch 的功能。最近看到 Qwen Image Edit 搭配 Next Scene Lora 可以預測下一場景。於是想到若能搭配節點讀取生成後的圖片,作為新來源,讓它自行反覆循環,於是添加以下這些節點。 +--- + +## 目錄 + +1. [ImageQueueProcessorPlus](#1-imagequeueprocessorplus---圖片佇列處理增強版) - 圖片佇列處理增強版 +2. [DataTmpSet](#2-datatmpset---資料暫存器設置) - 資料暫存器設置 +3. [DataTmpGet](#3-datatmpget---資料暫存器讀取) - 資料暫存器讀取 +4. [DataTempManager](#4-datatempmanager---資料暫存器管理) - 資料暫存器管理 +5. [TextSplitGet](#5-textsplitget---文本分割與獲取) - 文本分割與獲取 +6. [TextArrayIndex](#6-textarrayindex---文本陣列索引) - 文本陣列索引 +7. [IFMatchCond](#7-ifmatchcond---數學條件判斷) - 數學條件判斷 + +--- ## 1. ImageQueueProcessorPlus - 圖片佇列處理增強版 ### 功能說明 -這是 `ImageQueueProcessor` 的增強版本,新增了以下功能: -- **雙圖片輸入**:除了主要的 `images` 輸入,還有一個可選的 `additional_image` 輸入(用處不大,本來是想用它來實現循環) -- **變數來源**:可以搭配Data Temp Set 一起使用,將指定變數內的圖片作為來源圖。(可以把Data Temp Set 放在Vae Decode 之後) -- **動態佇列管理**:可以在處理過程中將新生成的圖片添加到佇列中 -- **自動循環控制**:支持設定最大執行索引和循環開關 +這是 `ImageQueueProcessor` 的增強版本,專為迭代式圖片處理設計。核心功能: +- **雙圖片輸入**:主要 `images` 輸入 + 可選的 `additional_image` 輸入(用處不大,本來是用它做為新來源圖) +- **變數來源**:可從 `DataTmpSet` 讀取圖片作為來源(推薦) +- **動態佇列管理**:自動檢測並載入新圖片 +- **自動循環控制**:支持 max_index 和循環開關 +- **智能重置**:images 變化時自動重置,data_tmp_var 變化時自動重新載入 ### 輸入參數 -- `images` (IMAGE) - 初始圖片批次 -- `additional_image` (IMAGE, 可選) - 額外的圖片輸入,會被添加到佇列末尾 -- `start_index` (INT) - 開始處理的索引位置 (預設: 0) -- `max_index` (INT) - 最大執行索引,達到此索引時自動停止 (預設: 10) -- `trigger_next` (BOOLEAN) - 是否觸發下一個處理 (預設: True) -- `enable_loop` (BOOLEAN) - 循環開關,關閉時停止自動觸發 (預設: True) -- `data_tmp_var` (String) - 變數名稱。(對應Data Temp Set 變數名稱) -- `use_data_tmp` (BOOL) - 是否使用變數做為圖片來源。 + +#### 必需參數 +- `images` (IMAGE) - 初始圖片批次(建議使用固定圖片) +- `start_index` (INT) - 開始處理的索引位置(預設: 0) +- `max_index` (INT) - 最大執行索引,達到此索引時自動停止(預設: 10) +- `trigger_next` (BOOLEAN) - 是否觸發下一個處理(預設: True) +- `enable_loop` (BOOLEAN) - 循環開關,關閉時停止自動觸發(預設: True) + +#### 可選參數 +- `additional_image` (IMAGE) - 額外的圖片輸入,會被添加到佇列末尾 +- `data_tmp_var` (STRING) - 變數名稱(對應 DataTmpSet 變數名稱) +- `use_data_tmp` (BOOLEAN) - 是否使用變數作為圖片來源(預設: False) ### 輸出 - `image` (IMAGE) - 當前處理的圖片 - `current_index` (INT) - 當前索引 - `total` (INT) - 佇列中的總圖片數 - `completed` (BOOLEAN) - 是否完成處理 -- `status` (STRING) - 狀態信息 +- `status` (STRING) - 狀態信息(顯示索引、總數、變化等) + +### 工作原理 + +**執行流程:** +1. 檢查 `images` 是否變化 → 變化則重置佇列 +2. 檢查 `data_tmp_var` 是否有新內容 → 有則重新載入 +3. 處理當前索引的圖片 +4. 檢查停止條件(max_index、enable_loop、是否還有圖片) +5. 決定是否繼續到下一輪 + +**停止條件:** +- `next_index >= max_index`(達到最大索引) +- `enable_loop = False`(循環開關關閉) +- `next_index >= total` 且沒有使用 `data_tmp_var`(沒有新圖片了) ### 使用場景 -1. **迭代圖片處理**:首次加載一張圖,處理完畢後生成新圖,搭配Data Temp Set,繼續下一輪處理 -2. **限制處理次數**:設定 `max_index` 來控制最多處理幾輪(避免無限循環) -3. **條件停止**:透過 `enable_loop` 開關來手動控制是否繼續處理 -### 範例工作流程 +#### 場景 1:迭代式圖片生成 ``` -LoadImage → ImageQueueProcessorPlus → 圖片處理節點 → Data Temp Set → 輸出 - ↑ | - └─────Data Temp Set Name─────┘ +LoadImage (1 張固定圖) + ↓ +ImageQueueProcessorPlus +├─ images: [初始圖] +├─ data_tmp_var: "queue" +├─ use_data_tmp: True +├─ max_index: 10 +└─ enable_loop: True + ↓ +圖片處理節點(AI 生成、增強等) + ↓ +DataTmpSet +├─ var_name: "queue" +├─ operation: array_push +└─ image_data: [處理後的圖] + ↓ +循環繼續,直到達到 max_index +``` + +#### 場景 2:批次圖片處理 +``` +LoadImage (多張圖) + ↓ +ImageQueueProcessorPlus +└─ 不使用 data_tmp_var + ↓ +逐張處理每張圖片 +``` + +### 重要提示 + +⚠️ **images 輸入要保持固定** +- 如果 images 變化,整個佇列會重置 +- 建議使用固定的圖片檔案 + +⚠️ **data_tmp_var 變化會重置索引** +- 當 data_tmp_var 內容變化時,佇列會重建 +- 索引會重置到 0,從頭開始處理 + +⚠️ **max_index 的語義** +- `max_index = 7` 表示處理索引 0-6(共 7 次) +- 當 `next_index = 7` 時停止 + +--- + +## 2. DataTmpSet - 資料暫存器設置 + +### 功能說明 +將資料存儲到記憶體中的全局暫存器,支援文本、圖片和任意類型的資料。提供完整的陣列操作功能。 + +### 輸入參數 + +#### 必需參數 +- `var_name` (STRING) - 變數名稱(預設: "my_var") +- `operation` (選項) - 操作類型 + - `set_variable` - 設定為單一變數(覆蓋) + - `array_push` - 添加到陣列末尾 + - `array_set_index` - 設定陣列特定索引 + - `clear_all` - 清除此變數的所有資料 + - `clear_index` - 清除陣列特定索引的資料 +- `data_type` (選項) - 資料類型 + - `text` - 文本 + - `image` - 圖片 + - `any` - 任意類型 + +#### 可選參數 +- `text_data` (STRING) - 文本資料 +- `image_data` (IMAGE) - 圖片資料 +- `any_data` (ANY) - 任意類型資料 +- `array_index` (INT) - 陣列索引(用於 array_set_index 和 clear_index) + +### 輸出 +- `status` (STRING) - 操作狀態信息 +- `preview` (IMAGE) - 預覽輸入的圖片(用於識別) +- `array_size` (INT) - 當前陣列大小 +- `info` (STRING) - 資料信息摘要 + +### 使用範例 + +**範例 1:建立單一變數** +``` +var_name: "my_prompt" +operation: set_variable +data_type: text +text_data: "1girl, beautiful" + +結果:設定變數 "my_prompt" = "1girl, beautiful" +``` + +**範例 2:建立圖片陣列** +``` +# 第一次 +var_name: "image_queue" +operation: array_push +data_type: image +image_data: [圖片1] + +# 第二次 +var_name: "image_queue" +operation: array_push +data_type: image +image_data: [圖片2] + +結果:陣列 "image_queue" = [圖片1, 圖片2] +array_size: 2 +``` + +**範例 3:設定特定索引** +``` +var_name: "image_queue" +operation: array_set_index +data_type: image +image_data: [新圖片] +array_index: 1 + +結果:image_queue[1] = 新圖片 +``` + +**範例 4:清除資料** +``` +# 清除整個變數 +operation: clear_all +var_name: "image_queue" + +# 或只清除特定索引 +operation: clear_index +var_name: "image_queue" +array_index: 1 +``` + +### 配合 ImageQueueProcessorPlus 使用 +``` +VAE Decode + ↓ +DataTmpSet +├─ var_name: "queue" +├─ operation: array_push ← 自動添加到末尾 +├─ data_type: image +└─ image_data: [解碼後的圖] + ↓ +ImageQueueProcessorPlus 會自動檢測並載入 ``` --- -## 2. TextSplitGet - 文本分割與獲取 +## 3. DataTmpGet - 資料暫存器讀取 ### 功能說明 -將文本自動分割成群組,並可指定索引來獲取特定的文本項目。 +從全局暫存器中讀取之前存儲的資料。支援多種讀取模式,可以讀取單一元素、第一個、最後一個或全部元素。 ### 輸入參數 + +#### 必需參數 +- `var_name` (STRING) - 要讀取的變數名稱(預設: "my_var") +- `data_type` (選項) - 資料類型 + - `text` - 文本 + - `image` - 圖片 + - `any` - 任意類型 +- `read_mode` (選項) - 讀取模式 + - `index` - 讀取特定索引(預設) + - `first` - 讀取第一個元素 + - `last` - 讀取最後一個元素 + - `all` - 讀取全部元素 + +#### 可選參數 +- `array_index` (INT) - 陣列索引(用於 read_mode=index) +- `default_text` (STRING) - 找不到資料時的預設文本 + +### 輸出 +- `text` (STRING) - 文本資料 +- `image` (IMAGE) - 圖片資料 +- `any` (ANY) - 任意類型資料 +- `array_size` (INT) - 陣列大小 +- `all_elements` (ANY) - 全部元素(read_mode=all 時使用) +- `status` (STRING) - 操作狀態信息 + +### 使用範例 + +**範例 1:讀取特定索引** +``` +var_name: "image_queue" +data_type: image +read_mode: index +array_index: 2 + +結果:返回 image_queue[2] +``` + +**範例 2:讀取第一個/最後一個** +``` +# 讀取第一個 +read_mode: first +→ 返回陣列的第一個元素 + +# 讀取最後一個 +read_mode: last +→ 返回陣列的最後一個元素 +``` + +**範例 3:讀取全部** +``` +var_name: "image_queue" +data_type: image +read_mode: all + +結果: +- 如果是圖片,all_elements 會合併為一個 batch +- 如果是其他類型,all_elements 返回整個列表 +``` + +**範例 4:提供預設值** +``` +var_name: "nonexistent" +data_type: text +default_text: "預設提示詞" + +結果:變數不存在時返回預設文本 +``` + +--- + +## 4. DataTempManager - 資料暫存器管理 + +### 功能說明 +管理全局暫存器中的所有變數。可以查看、刪除變數,或清除所有資料。提供完整的變數管理功能。 + +### 輸入參數 + +#### 必需參數 +- `action` (選項) - 操作類型 + - `list_all` - 列出所有變數及狀態(預設) + - `delete_var` - 刪除特定變數 + - `delete_index` - 刪除陣列特定索引 + - `clear_all` - 清除所有變數 + +#### 可選參數 +- `var_name` (STRING) - 變數名稱(用於 delete_var 和 delete_index) +- `array_index` (INT) - 陣列索引(用於 delete_index) + +### 輸出 +- `variables_list` (STRING) - 變數列表(詳細信息) +- `status` (STRING) - 操作狀態 +- `total_vars` (INT) - 變數總數 + +### 使用範例 + +**範例 1:查看所有變數** +``` +action: list_all + +結果: +variables_list: + my_prompt: String - '1girl, beautiful...' + image_queue: Array[5] - Types: Tensor + config: String - '{"setting": "value"}' + +total_vars: 3 +``` + +**範例 2:刪除變數** +``` +action: delete_var +var_name: "old_data" + +結果:變數 "old_data" 已刪除 +``` + +**範例 3:刪除陣列元素** +``` +action: delete_index +var_name: "image_queue" +array_index: 2 + +結果:刪除 image_queue[2],陣列大小從 5 變為 4 +``` + +**範例 4:清除所有** +``` +action: clear_all + +結果:清除所有 3 個變數 +``` + +### 變數資訊顯示格式 + +``` +變數名: 類型 - 詳細信息 + +範例: +- my_text: String - 'Hello World' +- my_images: Array[10] - Types: Tensor +- my_number: Tensor(1, 64, 64, 3) +- my_data: dict +``` + +--- + +## 5. TextSplitGet - 文本分割與獲取 + +### 功能說明 +將文本自動分割成群組,並可指定索引來獲取特定的文本項目。支援多種分隔符和註解過濾。 + +### 輸入參數 + +#### 必需參數 - `text` (STRING) - 要分割的文本 -- `index` (INT) - 要獲取的項目索引 (預設: 0) +- `index` (INT) - 要獲取的項目索引(預設: 0) - `separator_type` (選項) - 分隔符類型 - - `newline` - 換行符 (預設) + - `newline` - 換行符(預設) - `comma` - 逗號 - `semicolon` - 分號 - `custom` - 自訂分隔符 -- `custom_separator` (STRING) - 自訂分隔符 (預設: "|") -- `ignore_comment` (BOOLEAN) - 是否忽略註解行 (預設: True) -- `comment_prefix` (STRING) - 註解前綴符號 (預設: "#") -- `trim_whitespace` (BOOLEAN) - 是否去除前後空白 (預設: True) +- `custom_separator` (STRING) - 自訂分隔符(預設: "|") +- `ignore_comment` (BOOLEAN) - 是否忽略註解行(預設: True) +- `comment_prefix` (STRING) - 註解前綴符號(預設: "#") +- `trim_whitespace` (BOOLEAN) - 是否去除前後空白(預設: True) ### 輸出 - `text` (STRING) - 指定索引的文本 - `current_index` (INT) - 當前索引 - `total` (INT) - 分割後的總項目數 +- `array` (ANY) - 完整的分割結果陣列 - `status` (STRING) - 狀態信息 ### 使用範例 @@ -82,30 +403,123 @@ index: 1 separator_type: newline ignore_comment: True -結果:1boy, blue eyes +結果: +- text: "1boy, blue eyes" +- total: 3 +- array: ["1girl, red hair", "1boy, blue eyes", "1cat, fluffy"] ``` **範例 2:逗號分割** ``` 輸入文本: -apple,banana,cherry,# comment,durian +apple,banana,# comment,cherry,durian index: 2 separator_type: comma ignore_comment: True -結果:cherry +結果: +- text: "cherry" +- total: 4 +- array: ["apple", "banana", "cherry", "durian"] +``` + +**範例 3:自訂分隔符** +``` +輸入文本: +prompt1 | prompt2 | prompt3 + +separator_type: custom +custom_separator: "|" +trim_whitespace: True + +結果: +- array: ["prompt1", "prompt2", "prompt3"] +``` + +### 配合 TextArrayIndex 使用 +``` +TextSplitGet +├─ 分割文本為陣列 +└─ array 輸出 + ↓ +TextArrayIndex +├─ 可以合併多個陣列 +└─ 按索引獲取文本 ``` --- -## 3. IFMatchCond - 數學條件判斷 +## 6. TextArrayIndex - 文本陣列索引 + +### 功能說明 +接收多個文本陣列,合併後按索引獲取特定文本。可以處理來自 `TextSplitGet` 的陣列輸出,或任何其他文本陣列。 + +### 輸入參數 + +#### 必需參數 +- `index` (INT) - 要獲取的索引(預設: 0) + +#### 可選參數 +- `array_1` (ANY) - 第一個陣列 +- `array_2` (ANY) - 第二個陣列 +- `array_3` (ANY) - 第三個陣列 +- `array_4` (ANY) - 第四個陣列 +- `array_5` (ANY) - 第五個陣列 + +### 輸出 +- `text` (STRING) - 指定索引的文本 +- `total` (INT) - 合併後的總數 +- `status` (STRING) - 狀態信息 + +### 使用範例 + +**範例 1:合併多個陣列** +``` +array_1: ["A", "B", "C"] # 從 TextSplitGet +array_2: ["D", "E"] # 從另一個 TextSplitGet +array_3: "F" # 單一文本 + +index: 4 + +結果: +- 合併陣列: ["A", "B", "C", "D", "E", "F"] +- text: "E" +- total: 6 +``` + +**範例 2:索引超出範圍** +``` +array_1: ["A", "B"] +index: 5 + +結果: +- text: "B"(返回最後一個) +- status: "Index 5 out of range (total: 2), returning last item" +``` + +**範例 3:動態提示詞選擇** +``` +TextSplitGet (正面提示詞列表) + ↓ array +TextArrayIndex +├─ array_1: [正面提示詞陣列] +├─ array_2: [風格提示詞陣列] +├─ index: 2 +└─ 輸出合併後的第 2 個提示詞 +``` + +--- + +## 7. IFMatchCond - 數學條件判斷 ### 功能說明 根據數學條件比較兩個數值,返回 True 或 False。支援整數和浮點數比較。 ### 輸入參數 -- `value_a` (FLOAT) - 第一個浮點數值 (預設: 0.0) + +#### 必需參數 +- `value_a` (FLOAT) - 第一個浮點數值(預設: 0.0) - `operator` (選項) - 比較運算符 - `==` - 等於 - `!=` - 不等於 @@ -113,16 +527,20 @@ ignore_comment: True - `>=` - 大於等於 - `<` - 小於 - `<=` - 小於等於 -- `value_b` (FLOAT) - 第二個浮點數值 (預設: 0.0) -- `int_a` (INT, 可選) - 第一個整數值 (預設: 0) -- `int_b` (INT, 可選) - 第二個整數值 (預設: 0) -- `use_int` (BOOLEAN, 可選) - 是否使用整數比較 (預設: False) +- `value_b` (FLOAT) - 第二個浮點數值(預設: 0.0) + +#### 可選參數 +- `int_a` (INT) - 第一個整數值(預設: 0) +- `int_b` (INT) - 第二個整數值(預設: 0) +- `use_int` (BOOLEAN) - 是否使用整數比較(預設: False) ### 輸出 - `result` (BOOLEAN) - 比較結果 - `status` (STRING) - 比較的詳細信息 ### 使用範例 + +**範例 1:浮點數比較** ``` value_a: 5.5 operator: > @@ -134,173 +552,239 @@ use_int: False - status: "5.5 > 3.2 = True" ``` -### 應用場景 -- 配合 `ImageQueueProcessorPlus` 的 `current_index` 來判斷是否達到特定輪數 -- 與其他條件節點配合使用,實現複雜的工作流程控制 - ---- - -## 4. DataTmpSet - 資料暫存器設置 - -### 功能說明 -將資料存儲到記憶體中的全局暫存器,支援文本、圖片和任意類型的資料。可以存儲為單一變數或陣列。 - -### 輸入參數 -- `var_name` (STRING) - 變數名稱 (預設: "my_var") -- `storage_mode` (選項) - 存儲模式 - - `variable` - 單一變數 (預設) - - `array` - 陣列模式 -- `data_type` (選項) - 資料類型 - - `text` - 文本 (預設) - - `image` - 圖片 - - `any` - 任意類型 -- `text_data` (STRING, 可選) - 文本資料 -- `image_data` (IMAGE, 可選) - 圖片資料 -- `any_data` (ANY, 可選) - 任意類型資料 -- `array_index` (INT, 可選) - 陣列索引,-1 表示添加到末尾 (預設: -1) - -### 輸出 -- `status` (STRING) - 操作狀態信息 - -### 使用範例 - -**範例 1:存儲文本變數** +**範例 2:整數比較** ``` -var_name: "my_prompt" -storage_mode: variable -data_type: text -text_data: "1girl, beautiful" +int_a: 10 +operator: <= +int_b: 10 +use_int: True -結果:將文本存儲到變數 "my_prompt" +結果: +- result: True +- status: "10 <= 10 = True" ``` -**範例 2:建立圖片陣列** +**範例 3:配合 ImageQueueProcessorPlus** ``` -第一次執行: -var_name: "image_history" -storage_mode: array -data_type: image -image_data: [圖片1] -array_index: -1 - -第二次執行: -var_name: "image_history" -storage_mode: array -data_type: image -image_data: [圖片2] -array_index: -1 - -結果:陣列 "image_history" 包含兩張圖片 -``` - ---- - -## 5. DataTmpGet - 資料暫存器讀取 - -### 功能說明 -從全局暫存器中讀取之前存儲的資料。 - -### 輸入參數 -- `var_name` (STRING) - 要讀取的變數名稱 (預設: "my_var") -- `data_type` (選項) - 資料類型 - - `text` - 文本 (預設) - - `image` - 圖片 - - `any` - 任意類型 -- `array_index` (INT, 可選) - 陣列索引,-1 表示讀取整個變數 (預設: -1) -- `default_text` (STRING, 可選) - 找不到資料時的預設文本 - -### 輸出 -- `text` (STRING) - 文本資料 -- `image` (IMAGE) - 圖片資料 -- `any` (ANY) - 任意類型資料 -- `status` (STRING) - 操作狀態信息 - -### 使用範例 - -**範例 1:讀取文本變數** -``` -var_name: "my_prompt" -data_type: text - -結果:返回之前存儲的文本 -``` - -**範例 2:讀取陣列中的特定圖片** -``` -var_name: "image_history" -data_type: image -array_index: 1 - -結果:返回陣列中索引為 1 的圖片 +ImageQueueProcessorPlus +└─ current_index 輸出 + ↓ +IFMatchCond +├─ int_a: [current_index] +├─ operator: >= +├─ int_b: 5 +└─ use_int: True + ↓ +判斷是否處理了至少 5 輪 ``` --- ## 綜合應用範例 -### 場景:迭代圖片增強工作流程 +### 範例 1:AI 圖片迭代生成工作流程 -1. **初始設定** - - 使用 `LoadImage` 加載初始圖片 - - 設定迭代次數為 5 次 +``` +1. 初始化 + LoadImage (1 張起始圖) + ↓ + DataTmpSet + ├─ var_name: "queue" + └─ operation: clear_all ← 清空舊資料 -2. **圖片處理循環** - ``` - LoadImage → ImageQueueProcessorPlus (max_index=5, enable_loop=True) - ↓ - [當前圖片] - ↓ - 圖片增強節點 (例如:放大、去噪) - ↓ - DataTmpSet (儲存處理結果) - ↓ - 連接回 additional_image - ``` +2. 循環處理 + LoadImage (固定的 1 張圖) + ↓ + ImageQueueProcessorPlus + ├─ images: [固定圖] + ├─ data_tmp_var: "queue" + ├─ use_data_tmp: True + ├─ max_index: 10 + └─ enable_loop: True + ↓ + AI 圖片生成節點(Qwen Image Edit + Next Scene Lora) + ↓ + VAE Decode + ↓ + DataTmpSet + ├─ var_name: "queue" + ├─ operation: array_push ← 新圖片自動加入 + └─ image_data: [生成的圖] + ↓ + 循環繼續... -3. **條件控制** - - 使用 `IFMatchCond` 檢查 `current_index` 是否達到目標 - - 根據條件決定是否繼續處理 +3. 監控與控制 + ImageQueueProcessorPlus → status → Show Any + DataTmpSet → array_size → Show Any + +4. 結果保存 + DataTmpGet + ├─ var_name: "queue" + ├─ read_mode: all + └─ 輸出所有生成的圖片 + ↓ + SaveImage +``` -4. **結果保存** - - 使用 `DataTmpGet` 讀取所有處理過的圖片 - - 使用 `SaveImage` 保存最終結果 +### 範例 2:批次提示詞處理 + +``` +1. 準備提示詞 + 文本輸入: + 1girl, red dress + 1boy, blue shirt + # 註解 + 1cat, white fur + ↓ + TextSplitGet + ├─ separator_type: newline + └─ ignore_comment: True + ↓ array 輸出 + +2. 選擇提示詞 + TextArrayIndex + ├─ array_1: [分割的提示詞] + ├─ index: [動態索引] + └─ 輸出選定的提示詞 + ↓ + 文本處理或 AI 生成節點 +``` + +### 範例 3:條件控制工作流程 + +``` +ImageQueueProcessorPlus +├─ current_index 輸出 + ↓ +IFMatchCond +├─ int_a: [current_index] +├─ operator: >= +├─ int_b: 5 + ↓ +根據結果決定是否: +- 改變處理參數 +- 保存中間結果 +- 觸發其他節點 +``` + +--- + +## 節點協作圖 + +``` +資料流程: + +[輸入] → ImageQueueProcessorPlus → [處理] → DataTmpSet + ↑ | + └──────── data_tmp_var ────────────────┘ + +管理與查詢: + +DataTempManager → 查看/刪除變數 +DataTmpGet → 讀取資料(單一/全部) + +文本處理: + +文本 → TextSplitGet → array → TextArrayIndex → 選定文本 + +條件判斷: + +任何數值 → IFMatchCond → True/False → 控制流程 +``` --- ## 注意事項 -1. **ImageQueueProcessorPlus** - - `additional_image` 會被添加到佇列末尾,不會替換現有圖片 - - 當達到 `max_index` 或 `enable_loop` 為 False 時,循環會停止 - - 狀態文件保存在 `image_queue_processor_plus_state.json` +### 1. ImageQueueProcessorPlus +- ✅ `images` 輸入建議使用固定圖片,變化會觸發重置 +- ✅ `data_tmp_var` 變化會重新載入佇列並重置索引 +- ✅ `max_index=7` 表示處理索引 0-6(共 7 次) +- ✅ 狀態保存在 `image_queue_processor_plus_state.json` +- ⚠️ 使用 `data_tmp_var` 時,確保 `use_data_tmp=True` -2. **TextSplitGet** - - 註解過濾在分割後執行,以 `comment_prefix` 開頭的行會被忽略 - - 空行會被自動過濾掉 +### 2. DataTmpSet / DataTmpGet / DataTempManager +- ✅ 資料存儲在記憶體中,ComfyUI 重啟後會清空 +- ✅ 全局共享,不同工作流程可以存取相同的變數 +- ✅ 使用 `DataTempManager` 定期清理不需要的變數 +- ✅ `array_push` 會自動添加到末尾,無需指定索引 +- ⚠️ 陣列索引超出範圍時,`array_set_index` 會自動擴展陣列 -3. **資料暫存器 (DataTmpSet/DataTmpGet)** - - 資料存儲在記憶體中,ComfyUI 重啟後會清空 - - 全局共享,不同工作流程可以存取相同的變數 - - 陣列索引超出範圍時會自動擴展陣列(填充 None) +### 3. TextSplitGet +- ✅ 註解過濾在分割後執行 +- ✅ 空行會被自動過濾掉 +- ✅ `array` 輸出可以連接到 `TextArrayIndex` +- ✅ `trim_whitespace` 建議保持開啟,避免多餘空白 -4. **IFMatchCond** - - 浮點數比較時要注意精度問題 - - 使用 `use_int=True` 可以進行整數比較,避免浮點數精度誤差 +### 4. TextArrayIndex +- ✅ 可以接收任何類型的輸入,會自動轉換為字串 +- ✅ 索引超出範圍時返回最後一個元素 +- ✅ 最多可以合併 5 個陣列 + +### 5. IFMatchCond +- ✅ 浮點數比較時要注意精度問題 +- ✅ 使用 `use_int=True` 進行整數比較,避免浮點數精度誤差 +- ✅ 可以配合 `current_index` 實現條件控制 + +--- + +## 效能建議 + +### 記憶體管理 +```python +# 定期清理不需要的變數 +DataTempManager +└─ action: clear_all + +# 或清理特定變數 +DataTempManager +├─ action: delete_var +└─ var_name: "old_queue" +``` + +### 循環控制 +```python +# 設定合理的 max_index 避免無限循環 +ImageQueueProcessorPlus +├─ max_index: 20 # 根據需求調整 +└─ enable_loop: True + +# 監控佇列大小 +DataTmpSet +└─ array_size 輸出 → Show Any +``` + +### 錯誤處理 +```python +# 提供預設值避免錯誤 +DataTmpGet +├─ var_name: "may_not_exist" +└─ default_text: "預設值" + +# 檢查陣列大小 +DataTmpGet +└─ array_size 輸出 + ↓ +IFMatchCond +└─ 確認有資料再處理 +``` --- ## 安裝說明 -這些節點已經整合到現有的 `modules/textbatch/nodes.py` 檔案中。 +這些節點已經整合到 `modules/textbatch/nodes.py` 檔案中。 -重新啟動 ComfyUI 後,在節點選單的 **TextBatch** 分類中可以找到以下新節點: -- Image Queue Processor Plus -- Text Split Get -- IF Match Condition -- Data Temp Set -- Data Temp Get +**重新啟動 ComfyUI 後**,在節點選單的 **TextBatch** 分類中可以找到: -## 技術支援 +- ✅ Image Queue Processor Plus +- ✅ Data Temp Set +- ✅ Data Temp Get +- ✅ Data Temp Manager +- ✅ Text Split Get +- ✅ Text Array Index +- ✅ IF Match Condition + +--- -如有問題或建議,請在專案的 GitHub 頁面提出 Issue。