ComfyUI Node

Offset Image

The 2-second way to check if your texture is actually seamless

By spinagon·Created 3 years ago·Updated 6 months ago· 290
Offset Image
  • pixels
  • IMAGE
x_percent50
y_percent50

The whole problem with a seamless texture is that you can't see the seam until you tile it. OffsetImage exists to fix that preview problem, and it's the sneakiest useful node in this pack - it doesn't generate anything, it just shows you whether what you generated is any good.

What it does

It takes your IMAGE and rolls it - wraps it around horizontally and vertically by a percentage of the image's size. At the default of 50% X and 50% Y, the four edges of the image all get dragged into the center, meeting in a cross right in the middle of the frame. If your image isn't truly seamless, that cross is where you'll see every seam, all at once, dead center where your eye lands first. If it is seamless, you'll see... nothing. A clean middle. That's the test passing.

The mechanism is one line of torch: pixels.roll(). It's not a crop or a shift - it genuinely wraps, which is exactly what a tile does, so the boundary it exposes is the real one.

The two inputs you actually care about:

  • pixels - your decoded IMAGE, straight from a VAE Decode or Preview.
  • x_percent / y_percent - how far to roll, 0–100, default 50. 50/50 is the "find every seam" check. You can also nudge one axis to inspect a specific edge, or set one to 0 to check horizontal-only tiling (handy when you used x_only on the model).

It outputs an IMAGE, which in practice you just preview.

Why it's worth having

There's a version of this you can do with any image editor - offset the canvas by half and tile it. The value here is that it's in the graph. You can wire it up permanently as a preview alongside your real output, and it updates every run with zero extra steps. When you're tuning tiling settings, "run → glance at the cross → adjust" is a much tighter feedback loop than "run → export → open in another app → tile → squint."

The common beginner move is leaving it in the workflow and wondering why their saved output is offset. It's a diagnostic, not part of the final pipeline - use it to check, then disable it (or wire the raw output to your Save node instead) before you render the tile you're actually going to ship. At 25 impressions this isn't the flashiest page in the pack, but it's the node that stops you from shipping a texture that only looks seamless at a glance.

Categoryimage

Inputs (3)

NameTypeDefaultDescription
pixelsIMAGE
x_percentFLOAT500–100
y_percentFLOAT500–100

Outputs (1)

NameTypeDescription
IMAGEIMAGE