- README rewritten: banner, highlights with real outputs, install incl. ONNX Runtime and extra_model_paths keys, quick start, full catalog, licence summary, PDF guide links - docs/en and docs/vi: guide home + 13 pages covering all 69 nodes (card, inputs/outputs from the live definitions, behaviour, recipes, tips) - docs/assets: 69 node cards generated from INPUT_TYPES, 14 example images and a banner rendered from real node outputs on public-domain/CC0 photos - docs/_tools: card, example, spec and PDF builders (reportlab) so the docs can be regenerated from the code
22 KiB
Batch & Lists (lô ảnh và danh sách)
Các node làm việc với nhóm phần tử. Bạn có thể chọn hoặc ghép ảnh trong một batch (lô ảnh), đếm số lần đã queue workflow, và tạo, lọc, lấy phần tử từ danh sách văn bản. Một node nữa tách bất kỳ danh sách ComfyUI nào thành các đầu ra riêng. Bạn tìm chúng trong menu node tại NH-Nodes → Batch.
Lỗi hay gặp nhất với các node này là lẫn lộn giữa đếm từ 0 và đếm từ 1, nên hãy đọc Quy tắc đếm trước.
Nội dung trang
| Node | Dùng để |
|---|---|
| Batch Index (NH) | Lấy một ảnh, hoặc một đoạn ảnh, từ batch |
| Batch Merge (NH) | Ghép tối đa ba batch thành một |
| Counter (NH) | Tạo một con số tăng dần sau mỗi lần queue |
| List Create (NH) | Biến văn bản thành danh sách |
| List Index (NH) | Lấy một phần tử từ danh sách |
| List Filter (NH) | Chia danh sách thành phần khớp và phần không khớp |
| Any List Split (NH) | Tách danh sách ComfyUI bất kỳ thành các đầu ra riêng |
Trong các bảng, * nghĩa là kiểu dữ liệu bất kỳ.
Quy tắc đếm
Có node đếm từ 0, có node đếm từ 1. Hãy xem bảng này khi bạn nối một con số từ node này sang node khác.
| Vị trí | Phần tử đầu tiên là |
|---|---|
Batch Index (NH) — index, end_index |
0 |
List Index (NH) — index |
0 |
Any List Split (NH) — các đầu ra |
index 1 |
Counter (NH) — current |
giá trị start của bạn (mặc định 0) |
Các loader theo index — index (xem Loaders) |
1 |
Để điều khiển một loader bằng Counter, hãy đặt start của Counter là 1.
Batch Index (NH)
Chọn một ảnh, hoặc một đoạn ảnh, từ batch ảnh và cho bạn biết batch gốc có bao nhiêu ảnh.
Dùng khi bạn cần một ảnh duy nhất từ batch vừa tạo (ví dụ ảnh thứ ba trong bốn ảnh), khung hình cuối của một chuỗi, hoặc chỉ một phần của batch.
| Đầu vào | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
batch |
IMAGE |
— | Batch ảnh cần chọn. |
index |
INT |
0 |
Vị trí của ảnh đầu tiên cần lấy, tính từ 0. Số âm đếm từ cuối (-1 là ảnh cuối). Giá trị vượt quá cuối batch sẽ lấy ảnh cuối. Phạm vi từ -100 đến 1000. |
end_index |
INT |
-1 |
Tùy chọn. -1 chỉ lấy đúng ảnh tại index. Giá trị khác sẽ lấy một đoạn ảnh (xem bên dưới). Phạm vi từ -100 đến 1000. |
step |
INT |
1 |
Tùy chọn. Lấy cách đều mỗi n ảnh trong đoạn. Chỉ có tác dụng khi lấy đoạn. Phạm vi từ 1 đến 10. |
| Đầu ra | Kiểu | Mô tả |
|---|---|---|
result |
IMAGE |
Ảnh (hoặc các ảnh) đã chọn. |
original_count |
INT |
Số ảnh của batch đầu vào. |
Cách hoạt động
- Một ảnh (mặc định): khi
end_indexlà-1, bạn nhận ảnh tạiindex. - Một đoạn:
end_indexdương không bao gồm ảnh tại vị trí đó, giống cách slice một danh sách.index2 vàend_index5 trả về ảnh 2, 3 và 4.end_indexâm đếm từ cuối và bao gồm ảnh đó:-2dừng ở ảnh áp chót, nên chỉ ảnh cuối bị bỏ lại.-1được dành riêng cho chế độ một ảnh. - Đoạn rỗng: nếu
end_indexkhông nằm sauindex, node in cảnh báo trong console và trả về ảnh đầu tiên của batch. end_indexlớn hơn kích thước batch chỉ đơn giản nghĩa là "đến hết batch".
Kết quả với batch 10 ảnh, đánh số từ 0 đến 9:
index |
end_index |
step |
Kết quả |
|---|---|---|---|
3 |
-1 |
— | ảnh 3 |
-1 |
-1 |
— | ảnh 9 (ảnh cuối) |
2 |
5 |
1 |
ảnh 2, 3, 4 |
2 |
5 |
2 |
ảnh 2, 4 |
0 |
-2 |
1 |
ảnh 0 đến 8 (tất cả trừ ảnh cuối) |
-3 |
1000 |
1 |
ảnh 7, 8, 9 (ba ảnh cuối) |
0 |
1000 |
3 |
ảnh 0, 3, 6, 9 |
Ví dụ — giữ lại ảnh thứ ba của batch
KSampler (batch 4 ảnh) → VAE Decode → Batch Index (NH) → Save Image
Đặt index là 2. Node trả về ảnh thứ ba, còn original_count hiển thị 4. Dùng index là -1 để luôn lấy ảnh cuối, bất kể batch dài bao nhiêu.
Mẹo: Nối một
Counter (NH)vàoindexđể duyệt qua batch, mỗi lần queue một ảnh. Đặtmax_valuecủa Counter bằng số ảnh của batch trừ đi một.
Batch Merge (NH)
Ghép tối đa ba batch ảnh thành một batch dài hơn, tự đổi kích thước các batch phụ cho khớp với batch đầu tiên.
Dùng khi bạn muốn ảnh từ các nhánh khác nhau nằm chung một batch (để xem trước, lưu hoặc chuyển tiếp cùng nhau), hoặc khi các batch cần ghép có kích thước khác nhau.
| Đầu vào | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
batch_a |
IMAGE |
— | Batch đầu tiên. Chiều rộng, chiều cao và số kênh (RGB hoặc RGBA) của nó quyết định định dạng của kết quả. Batch này không bao giờ bị đổi kích thước. |
batch_b |
IMAGE |
— | Tùy chọn. Batch thứ hai, được nối sau batch_a. |
batch_c |
IMAGE |
— | Tùy chọn. Batch thứ ba, được nối sau cùng. |
resize_mode |
COMBO |
stretch |
Tùy chọn. Cách đưa ảnh của batch_b và batch_c về kích thước của batch_a: stretch, crop hoặc pad. Ảnh đã đúng kích thước thì giữ nguyên. |
| Đầu ra | Kiểu | Mô tả |
|---|---|---|
result |
IMAGE |
Toàn bộ ảnh theo thứ tự: batch_a, rồi batch_b, rồi batch_c. |
count |
INT |
Số ảnh trong result. |
Các chế độ đổi kích thước
| Chế độ | Việc nó làm | Tỉ lệ khung hình | Đánh đổi |
|---|---|---|---|
stretch |
Co giãn ảnh về đúng kích thước đích. | Không giữ — ảnh có thể bị méo. | Không mất gì. |
crop |
Phóng ảnh đến khi phủ kín kích thước đích, rồi cắt (crop) phần thừa đều từ giữa. | Giữ nguyên. | Phần rìa bị cắt mất. |
pad |
Thu phóng ảnh sao cho lọt vừa toàn bộ, đặt vào giữa và lấp phần còn lại bằng viền đệm (padding). | Giữ nguyên. | Thêm viền: đen với kết quả RGB, trong suốt với kết quả RGBA. |
RGB và RGBA
Kết quả có số kênh của batch_a. Mọi batch còn lại được chuyển cho khớp trước khi ghép.
batch_a |
Batch còn lại | Kết quả |
|---|---|---|
| RGB | RGB | RGB |
| RGBA | RGBA | RGBA |
| RGB | RGBA | RGB — batch còn lại bị bỏ kênh alpha. |
| RGBA | RGB | RGBA — batch còn lại được thêm kênh alpha hoàn toàn đục. Với pad, phần viền trong suốt. |
Batch có số kênh khác (ví dụ một kênh) không thể ghép với batch khác số kênh. Node dừng lại và báo lỗi nêu rõ hai số kênh đó.
Ví dụ — ghép hai ảnh khác kích thước
Load Image A + Load Image B → Batch Merge (NH) → Preview Image
Đặt resize_mode là pad. Ảnh B giữ nguyên tỉ lệ và nằm giữa khung có kích thước của ảnh A. count hiển thị 2.
Mẹo: Nối ảnh có kích thước bạn muốn giữ vào
batch_a. Để ghép hơn ba batch, hãy nối hai node liên tiếp: đưaresultcủa node thứ nhất vàobatch_acủa node thứ hai.
Counter (NH)
Bộ đếm tăng thêm step mỗi lần bạn queue workflow, và báo khi đã vượt qua max_value.
Dùng khi bạn muốn duyệt qua một tập phần tử, mỗi lần queue một phần tử: thử nhiều LoRA, xoay vòng prompt, hoặc xử lý từng ảnh trong batch.
| Đầu vào | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
start |
INT |
0 |
Giá trị đầu tiên của bộ đếm. |
step |
INT |
1 |
Mỗi lần queue bộ đếm tăng bao nhiêu. Tối thiểu 1. |
max_value |
INT |
9 |
Giá trị cuối cùng cần đếm tới. Tối thiểu 0. |
reset |
BOOLEAN |
false |
Khi bật, mỗi lần queue đều đếm lại từ start. |
| Đầu ra | Kiểu | Mô tả |
|---|---|---|
current |
INT |
Giá trị của lần queue này. Không bao giờ vượt max_value. |
is_done |
BOOLEAN |
true khi bộ đếm đã vượt qua max_value. |
progress |
FLOAT |
current chia cho max_value, từ 0.0 đến 1.0. |
remaining |
INT |
Số giá trị còn lại đến max_value, tính cả current (max_value - current + 1). Không bao giờ nhỏ hơn 0. |
Cách hoạt động
- Chạy ở mọi lần queue. Node không bao giờ dùng kết quả cache của ComfyUI, nên mỗi lần queue bộ đếm đều tiến thêm một bước: mỗi lần nhấn Run, mỗi lượt lặp của batch count, mỗi lượt auto-queue.
- Cách đếm: lần queue đầu trả về
start, lần kế tiếpstart + step, và cứ thế. Khi giá trị kế tiếp sẽ vượtmax_value, bạn nhậnmax_valuecùngis_donebật và bộ đếm dừng. Các lần queue thừa lặp lại kết quả đó. Vớistep2 vàmax_value9, dãy giá trị là 0, 2, 4, 6, 8, rồi 9 vớiis_donebật. reset: bật lên và queue một lần để đếm lại từ đầu. Lần queue đó trả vềstart. Tắtresetđi thì lần queue kế tiếp trả vềstart + step. Chừng nàoresetcòn bật, mọi lần queue đều trả vềstart.- Đổi thiết lập giữa chừng:
stepvàmax_valuecó hiệu lực ngay.startchỉ được đọc khi bắt đầu đếm và sau khi reset. - Bộ đếm được lưu ở đâu: trong bộ nhớ, theo ID của node. Khởi động lại ComfyUI sẽ đếm lại từ đầu, và hai node Counter đếm độc lập nhau. Các workflow có Counter trùng ID node dùng chung một bộ đếm, nên hãy dùng
resetsau khi chuyển qua lại giữa chúng.
Với thiết lập mặc định (start 0, step 1, max_value 9):
| Lần queue | 1 | 2 | … | 10 | 11 | 12 |
|---|---|---|---|---|---|---|
current |
0 | 1 | … | 9 | 9 | 9 |
is_done |
false | false | … | false | true | true |
remaining |
10 | 9 | … | 1 | 0 | 0 |
progress |
0.0 | 0.11 | … | 1.0 | 1.0 | 1.0 |
Ví dụ — thử năm LoRA, mỗi lần queue một LoRA
Counter (NH) → Load LoRA Model Index (NH) → KSampler
| Node | Thiết lập |
|---|---|
Counter (NH) |
start 1, step 1, max_value 5. |
Load LoRA Model Index (NH) |
Nối current vào index. Đặt lora_count là 5 và chọn một LoRA trong lora_1 đến lora_5. |
Đặt batch count là 5 rồi nhấn Run. Mỗi lần queue dùng LoRA kế tiếp, và đầu ra filename cho bạn biết đó là LoRA nào. Counter bắt đầu từ 1 vì các loader đếm từ 1. Xem Loaders để biết đầy đủ về node này.
Mẹo:
is_donelà mộtBOOLEANbình thường. Nối nó vàoIf/Else (NH)hoặcLogic Gate (NH)(xem Logic) để phản ứng khi dãy đã chạy xong. Bậtresettrong một lần queue để chạy lại dãy.
List Create (NH)
Biến văn bản thành danh sách phần tử, mỗi dòng một phần tử hoặc tách theo dấu phân tách bạn chọn.
Dùng khi bạn giữ một bộ prompt, tên style hay từ khóa trong cùng một ô văn bản và muốn chọn, lọc hoặc duyệt qua chúng bằng các node List.
| Đầu vào | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
text |
STRING |
ba dòng: item 1, item 2, item 3 |
Văn bản cần tách. Ô văn bản nhiều dòng. |
delimiter |
STRING |
\n |
Tùy chọn. Dấu phân tách giữa các phần tử. \n là xuống dòng và \t là tab. Ký tự khác được dùng đúng như bạn gõ, ví dụ , hoặc ;. |
| Đầu ra | Kiểu | Mô tả |
|---|---|---|
items |
NH_LIST |
Danh sách. Chỉ List Index (NH) và List Filter (NH) nhận loại này. |
count |
INT |
Số phần tử của danh sách. |
first |
STRING |
Phần tử đầu tiên. Rỗng nếu danh sách rỗng. |
last |
STRING |
Phần tử cuối cùng. Rỗng nếu danh sách rỗng. |
Cách hoạt động
- Mỗi phần tử được cắt bỏ khoảng trắng hai đầu, và phần tử rỗng bị loại, nên dòng trống không tạo ra phần tử.
- Dấu phân tách là văn bản thuần, không phải mẫu (pattern). Nó có thể dài hơn một ký tự, ví dụ
||. - Nếu sau khi cắt không còn gì,
itemslà danh sách rỗng,countbằng 0, cònfirstvàlastrỗng. - Đừng để trống
delimiter. Ô trống làm node dừng với lỗi "empty separator".
Ví dụ — tách một dòng thành ba phần tử
Đặt text là red, green, blue và delimiter là ,. Danh sách chứa red, green và blue; count là 3, first là red và last là blue.
Lưu ý:
NH_LISTlà kiểu danh sách riêng của pack. Nó đi như một giá trị duy nhất, nên không khiến ComfyUI chạy node kế tiếp một lần cho mỗi phần tử. Để mỗi phần tử có một lần chạy, hãy dùngText Split Lines (NH)trong Text cùng với Any List Split (NH).
List Index (NH)
Lấy một phần tử từ danh sách theo vị trí và cho bạn biết đó có phải phần tử đầu hay phần tử cuối không.
Dùng khi bạn muốn chọn một prompt hoặc style theo số thứ tự, hoặc duyệt qua danh sách, mỗi lần queue một phần tử, bằng Counter (NH).
| Đầu vào | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
items |
NH_LIST |
— | Danh sách, lấy từ List Create (NH) hoặc List Filter (NH). |
index |
INT |
0 |
Vị trí của phần tử, tính từ 0. Phạm vi từ -100 đến 1000. |
wrap |
BOOLEAN |
true |
Tùy chọn. Điều gì xảy ra khi index nằm ngoài danh sách (xem bên dưới). |
| Đầu ra | Kiểu | Mô tả |
|---|---|---|
item |
STRING |
Phần tử được chọn. |
is_first |
BOOLEAN |
true nếu phần tử là phần tử đầu của danh sách. |
is_last |
BOOLEAN |
true nếu phần tử là phần tử cuối của danh sách. |
count |
INT |
Số phần tử của danh sách. |
Cách hoạt động
wrapbật: vị trí quay vòng quanh danh sách, nên Counter cứ chạy tiếp và danh sách chỉ đơn giản lặp lại. Giá trị âm đếm lùi từ cuối.wraptắt: vị trí vượt quá cuối danh sách cho ra phần tử cuối. Vị trí âm đếm từ cuối và dừng ở phần tử đầu tiên.- Danh sách rỗng:
itemrỗng,is_firstvàis_lastđều làtrue,countlà0, và console hiện cảnh báo.
Với danh sách 4 phần tử (từ 0 đến 3):
index |
wrap bật |
wrap tắt |
|---|---|---|
0 |
phần tử 0 | phần tử 0 |
3 |
phần tử 3 | phần tử 3 |
4 |
phần tử 0 | phần tử 3 |
5 |
phần tử 1 | phần tử 3 |
-1 |
phần tử 3 | phần tử 3 |
-5 |
phần tử 3 | phần tử 0 |
Ví dụ — xoay vòng các prompt
List Create (NH) → List Index (NH) → CLIP Text Encode
Viết mỗi prompt một dòng trong List Create (NH). Nối current của một Counter (NH) vào index. Với start 0 và max_value đặt bằng count trừ một, mỗi lần queue dùng prompt kế tiếp. Để wrap bật nếu bạn muốn danh sách lặp lại thay vì dừng.
List Filter (NH)
Chia một danh sách làm hai: các phần tử khớp với một điều kiện và các phần tử không khớp.
Dùng khi bạn chỉ muốn giữ các prompt có chứa một từ, loại bỏ phần tử không cần, hoặc chỉ giữ các phần tử ngắn hay dài.
| Đầu vào | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
items |
NH_LIST |
— | Danh sách cần lọc. |
condition |
STRING |
contains:dress |
Phép thử áp dụng cho từng phần tử (xem bên dưới). |
mode |
COMBO |
include |
include: passed chứa các phần tử khớp. exclude: passed chứa các phần tử không khớp. |
| Đầu ra | Kiểu | Mô tả |
|---|---|---|
passed |
NH_LIST |
Các phần tử đạt. |
rejected |
NH_LIST |
Các phần tử không đạt. |
passed_count |
INT |
Số phần tử đạt. |
rejected_count |
INT |
Số phần tử không đạt. |
Điều kiện
| Viết | Một phần tử khớp khi… | Chữ hoa/thường |
|---|---|---|
contains:text |
nó chứa text |
bỏ qua |
startswith:text |
nó bắt đầu bằng text |
phân biệt |
endswith:text |
nó kết thúc bằng text |
phân biệt |
equals:text |
nó đúng bằng text |
bỏ qua |
regex:pattern |
biểu thức chính quy (regex) tìm thấy kết quả khớp ở bất kỳ đâu trong nó | phân biệt (bắt đầu mẫu bằng (?i) để bỏ qua chữ hoa/thường) |
len>5, len>=5, len<5, len<=5, len==5, len!=5 |
độ dài của nó (tính bằng ký tự) thỏa phép so sánh | — |
mọi thứ khác, ví dụ dress |
nó chứa nguyên văn điều kiện | bỏ qua |
Cách hoạt động
- Từ khóa trước dấu hai chấm không phân biệt chữ hoa/thường (
Contains:hatvẫn dùng được), nhưng từlenphải viết thường. Khoảng trắng quanh giá trị và quanh toán tửlenđược bỏ qua. - Điều kiện có từ khóa lạ, như
foo:bar, được coi là văn bản thuần và được tìm nguyên văn. - Regex bị lỗi sẽ không khớp với phần tử nào và in một thông báo trong console.
- Mỗi node chỉ có một điều kiện. Để yêu cầu cả hai điều kiện, hãy nối hai node liên tiếp: đưa
passedcủa node thứ nhất vàoitemscủa node thứ hai. Để chấp nhận một trong hai từ, dùng một regex duy nhất nhưregex:red|blue.
Ví dụ — chỉ giữ các prompt nhắc đến dress
List Create (NH) → List Filter (NH) → List Index (NH)
Với các phần tử Red Dress, blue jeans, dress shirt và Hat, điều kiện contains:dress cùng include cho passed = Red Dress, dress shirt (passed_count là 2) và rejected = blue jeans, Hat (rejected_count là 2). Với exclude, hai danh sách đổi chỗ cho nhau.
Any List Split (NH)
Tách một danh sách ComfyUI bất kỳ thành một đầu ra chứa toàn bộ danh sách (All) và tối đa mười đầu ra riêng, mỗi đầu ra một phần tử.
Dùng khi một node trả về một danh sách (ví dụ lines của Text Split Lines (NH), hoặc một batch ảnh) và bạn muốn gửi phần tử thứ nhất, thứ hai, thứ ba đến những nơi khác nhau.
| Đầu vào | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
items |
* |
— | Danh sách hoặc batch cần tách. Nhận mọi kiểu dữ liệu. |
index_count |
INT |
4 |
Số đầu ra index mà node hiển thị và sử dụng. Phạm vi từ 0 đến 10. All luôn có sẵn. |
| Đầu ra | Kiểu | Mô tả |
|---|---|---|
All |
* (danh sách) |
Mọi phần tử dưới dạng danh sách ComfyUI (dấu ≡ trên thẻ node). Các node nối vào đây chạy một lần cho mỗi phần tử. |
index 1 … index 10 |
* |
Mỗi đầu ra một phần tử. index 1 là phần tử đầu tiên. Chỉ index_count đầu ra đầu tiên được hiển thị. |
Cách hoạt động
- Số đầu ra theo
index_count. Khi bạn đổi giá trị này, hoặc nhấn nútupdate outputs, node thêm hoặc bớt đầu ra cho khớp. Giảm số này sẽ ngắt kết nối của các đầu ra biến mất. Thẻ node ở trên hiển thị cả mười đầu ra; trên canvas bạn thấyindex_countđầu ra. - Batch ảnh được tách thành từng ảnh. Một batch 3 ảnh nối với một batch 2 ảnh cho ra 5 phần tử. Giá trị khác được giữ nguyên, còn mục rỗng bị bỏ qua.
- Đầu ra bị chặn. Đầu ra
index Nkhông có phần tử tương ứng sẽ bị chặn: danh sách ngắn hơn N, hoặc N lớn hơnindex_count. Các node phía sau đầu ra bị chặn bị bỏ qua âm thầm, không có lỗi. Nếu danh sách đầu vào rỗng,Allcũng bị chặn.
Ví dụ — gửi hai dòng của một ô văn bản đến hai nơi
Text Split Lines (NH) → Any List Split (NH)
Viết positive prompt ở dòng 1 và negative prompt ở dòng 2 của Text Split Lines (NH). Nối lines vào items, đặt index_count là 2, rồi nối index 1 vào positive prompt và index 2 vào negative prompt.
Mẹo: Dùng
Allkhi node kế tiếp cần chạy một lần cho mỗi phần tử, và dùng các đầu raindexkhi bạn cần một phần tử cụ thể.
Xem thêm: Loaders cho các node mà Counter có thể điều khiển, Text cho Text Split Lines (NH), và Logic cho các công tắc và nhánh rẽ.