⭐ Star Image Shifter
Shift an image around the edges, seamlessly — for panoramas and tileable textures
- image
- IMAGE
Most image shift tools just crop-and-offset, which leaves an ugly empty band where the image moved out of frame. Star Image Shifter does the other thing: it wraps content around the edges, so the pixels that slide off one side reappear on the other. In ComfyUI's world that one trick matters more than you'd think - it's how you center a subject in a panorama frame, how you fix a tileable texture that has a visible seam at the middle, and how you fidget a 360° render into the composition you actually wanted.
How it works
Under the hood it's a simple numpy.roll on each image in the batch: pixels move by x_shift and y_shift, and anything pushed past the edge wraps back around to the opposite side (the source uses modulo arithmetic on width/height, so huge shift values just wrap multiple times - the range goes to ±8192 for a reason). Because nothing is cropped and nothing is discarded, the output is the exact same size as the input, with zero wasted canvas. If your source is already tileable, it stays tileable after any shift - which is the property that makes this node quietly powerful for texture work.
There's one honesty caveat: wrap-around is not the same as a content-aware fill. If you shift a photo of a face by 100px, the far side of the image wraps into the gap and you'll see it - this is a spatial tool, not a generative one. You use it when you're okay with the seam (tileable textures, repeated patterns) or when the wrap hides cleanly (subtle nudges inside a larger composition that will be cropped later).
Inputs and output
image- any IMAGE tensor; batches are processed frame by frame.x_shift(INT, −8192 to 8192) - horizontal offset in pixels. Positive moves content right, negative moves it left.y_shift(INT, −8192 to 8192) - vertical offset.
One output, IMAGE, same shape as the input. It slots into any chain - typically right after Load Image and before whatever node consumes the pixels, or as the final tweak before Save.
Where it fits
- Panorama work: shift a 360° strip so your subject isn't split at the frame edge before you feed it to a viewer or a looping pan node like ⭐ Star Image Loop.
- Tileable textures: nudge a texture so the visible seam lands where you can retouch it, rather than dead center.
- Composition fidgeting: nudge an image a few pixels at a time in an upscale pipeline without re-running generation.
Installing
Part of the StarNodes pack - install Starnodes via ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Starnodes2024/ComfyUI_StarNodes
cd ComfyUI_StarNodes
pip install -r requirements.txt
Restart, then search star on the canvas. No models, no dependencies beyond Pillow and numpy.
Common issues
If your shifted image looks wrong, the usual cause is expecting wrap-around to hide a non-tileable seam - it won't. And a small gotcha: with a single frame, the wrap is invisible unless you pan across it, so preview the result, don't eyeball it at rest. Otherwise this node is about as failure-proof as ComfyUI gets.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| x_shift | INT | 0-8192–8192 | — |
| y_shift | INT | 0-8192–8192 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |