feat: add ImageGridSlice node

Slices an image into a rows x columns grid (max 16x16), returning all
tiles as a single IMAGE batch in row-major order. Uses uniform floor-
sized cells so tiles stack into one tensor.
This commit is contained in:
shrimbly 2026-06-05 07:00:05 +12:00
parent 4e1f7cb1db
commit 15df9f2148

View File

@ -1240,6 +1240,54 @@ class SaveImageAdvanced(IO.ComfyNode):
return IO.NodeOutput(ui={"images": results})
class ImageGridSlice(IO.ComfyNode):
MAX_ROWS = 16
MAX_COLUMNS = 16
@classmethod
def define_schema(cls):
return IO.Schema(
node_id="ImageGridSlice",
display_name="Image Grid Slice",
category="image/transform",
search_aliases=["grid", "slice image", "split image", "crop grid"],
description="Slices an image into a grid of rows x columns tiles, returned as a single batch (row-major).",
inputs=[
IO.Image.Input("image"),
IO.Int.Input("rows", default=2, min=1, max=cls.MAX_ROWS),
IO.Int.Input("columns", default=2, min=1, max=cls.MAX_COLUMNS),
],
outputs=[
IO.Image.Output(display_name="images"),
],
)
@classmethod
def execute(cls, image, rows, columns) -> IO.NodeOutput:
rows = max(1, min(rows, cls.MAX_ROWS))
columns = max(1, min(columns, cls.MAX_COLUMNS))
_, height, width, _ = image.shape
tile_height = height // rows
tile_width = width // columns
tiles = []
for row in range(rows):
y_start = row * tile_height
for col in range(columns):
x_start = col * tile_width
tiles.append(
image[
:,
y_start:y_start + tile_height,
x_start:x_start + tile_width,
:,
]
)
return IO.NodeOutput(torch.cat(tiles, dim=0))
class ImagesExtension(ComfyExtension):
@override
async def get_node_list(self) -> list[type[IO.ComfyNode]]:
@ -1262,6 +1310,7 @@ class ImagesExtension(ComfyExtension):
ImageScaleToMaxDimension,
SplitImageToTileList,
ImageMergeTileList,
ImageGridSlice,
]