π Rennart Offset Image
Shift an image with wrap-around β seamless tiling, done cheap
- pixels
- IMAGE
Rennart Offset Image shifts an image horizontally and/or vertically by a percentage of its own size, with the edges wrapping around instead of falling off. Shift 50% left and the right half of the image lands on the left; nothing gets cropped, nothing gets filled with black. That wrap behavior is the whole personality of this node, and it's exactly what you want for a specific set of jobs: making seamless tiles, checking if a texture or pattern tiles cleanly, or creating an offset version of an image to blend back with the original (a classic trick for reducing visible seams in tiled outputs).
It's from the ComfyUI-Rennart pack, under Rennart/Image, and it's a one-trick node - but the trick is well aimed.
How it works
The implementation is a single torch.roll call. It converts your x_percent and y_percent into pixel shifts (percentage of the image's width and height, respectively), then rolls the tensor along its spatial axes. torch.roll is the wrapping shift - elements pushed past one edge reappear on the opposite edge. That's why there's no fill color and no edge handling anywhere in the node: by design, there's nothing to fill.
The corollary you should absorb before using it: this is not a translate-with-canvas node. If you expected a shifted image with black bars where the content moved away from, this node will surprise you, because it produces a torus-wrapped result instead. For seamless-tile inspection that's the feature. For "move the subject to the left edge" it's the wrong tool.
The inputs that matter
pixels- an IMAGE tensor.x_percent- horizontal shift as a percentage of width, 0β100, default 50. 0 does nothing; 50 splits the image in half and swaps the halves.y_percent- same idea vertically.
Output is a single wrapped IMAGE. There are no dimension or metadata outputs - it's a pure transform, one tensor in, one tensor out.
Install and gotchas
Same pack, same routine:
# ComfyUI Manager: search "ComfyUI-Rennart", or:
cd ComfyUI/custom_nodes
git clone https://github.com/Rennart2025/ComfyUI-Rennart
Restart ComfyUI and find it under Rennart/Image. No models, no extra deps.
Two things to keep in mind. First, the percentages are relative to each dimension, not absolute pixels - shifting by 50 in X and 25 in Y moves content by half the width and a quarter of the height, so a small image and a large image behave differently at the same settings. Second, because the shift is a wrap, a 50% offset in both axes gives you the same image in a different phase - handy for checking tiling, and also why feeding the output back through an offset+blend chain is the classic way to even out edge artifacts in textures. If you're generating patterns for tiled backgrounds, this is worth having around even though you'll only reach for it occasionally.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| pixels | IMAGE | β | |
| x_percent | FLOAT | 500β100 | β |
| y_percent | FLOAT | 500β100 | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | β |