Nodes/Jovimetrix/🌱 Transform (jov)
ComfyUI Node

🌱 Transform (jov)

Move, rotate, and scale an image, the old way

By AmoranoΒ·Created 3 years agoΒ·Updated 12 months agoΒ· 396
🌱 Transform (jov)
  • pixels
  • image
  • mask
β—„offsetX0.00β–Ί
β—„offsetY0.00β–Ί
β—„angle0β–Ί
β—„sizeX1.00β–Ί
β—„sizeY1.00β–Ί
β—„edgeCLIPβ–Ί
β—„width256β–Ί
β—„height256β–Ί
β—„modeNONEβ–Ί

Every composition eventually needs to move something. Shift it left, spin it a few degrees, shrink it into a corner - and decide what happens at the edges when you do. Transform (jov) is the older build of Jovimetrix's geometric workhorse, and its one-line description covers the whole contract: "Translate, Rotate, Scale, Tile and Invert an input. All options allow for CROP or WRAPing of the edges."

The inputs are a straight translation list. pixels is the required image or mask. offsetX and offsetY shift it, expressed as normalized offsets from -1 to 1 (so -1 pushes it fully one way, 1 fully the other - no guesswork about pixels). angle rotates it, -180 to 180 degrees. sizeX and sizeY scale it per axis from 0.01 (nearly gone) to 2 (double size), which lets you squash a 1Γ—1 into a wide 2Γ—0.5 without extra nodes. edge picks what happens at the borders: CLIP (cut off what leaves the frame) or WRAP, WRAPX, WRAPY (wrap content around like a torus, on one or both axes). Then width/height set the output canvas and mode (NONE/FIT/CROP/ASPECT) governs how the transformed result fits it. Outputs are image and mask, so whatever you do to the pixels follows to the mask for free.

The edge options are the part beginners underestimate. CLIP is the obvious default, but WRAP turns a simple shift into a seamless tiling motion - shift a texture by half and it wraps around perfectly, which is the classic way to get a moving background with no visible seam. The pack would later build this exact behavior into the bigger TRANSFORM node, so if you know this node you already understand a quarter of that one.

Where it belonged in a graph: panning a camera over a scene (offsetX + a TICK value), rotating a logo into place, dropping an image into a corner of a composition, or animating a mask alongside its image. Because offsets are normalized rather than pixel-based, driving them with a 0–1 animation value is trivial - which is exactly how Jovimetrix workflows animate motion.

The honest note: this is a legacy node from an older build (the lowercase "(jov)" tells you), and it's not in the current pack source. Its successor is TRANSFORM (JOV) 🏝️, which keeps translate/rotate/scale but adds tiling, mirroring, pivots, perspective projection, and fisheye/polar remaps. If an old workflow says "Transform (jov)" is missing, drop in TRANSFORM - the offset/angle/size/edge concepts carry over almost 1:1.

To run it, install the pack. ComfyUI Manager β†’ "Jovimetrix", or:

cd ComfyUI/custom_nodes
git clone https://github.com/Amorano/Jovimetrix.git
pip install -r Jovimetrix/requirements.txt

then restart. Dependencies are the shared set (numpy, opencv-contrib-python, Pillow, matplotlib, cozy-comfyui helpers), no model downloads. Keep ComfyUI at 0.1.3+ and mind the pack's split history - GLSL and streaming nodes moved to separate Jovi_* packs in v2.0, which is why old workflows reference names the current install doesn't have.

CategoryJOVIMETRIX πŸ”ΊπŸŸ©πŸ”΅

Inputs (10)

NameTypeDefaultDescription
pixels*β€”
offsetXoptFLOAT0.00-1–1β€”
offsetYoptFLOAT0.00-1–1β€”
angleoptFLOAT0-180–180β€”
sizeXoptFLOAT1.000.01–2β€”
sizeYoptFLOAT1.000.01–2β€”
edgeoptCOMBOCLIP4 options: CLIP, WRAP, WRAPX, WRAPY
widthoptINT25632–8192β€”
heightoptINT25632–8192β€”
modeoptCOMBONONE4 options: NONE, FIT, CROP, ASPECT

Outputs (2)

NameTypeDescription
imageIMAGEβ€”
maskMASKβ€”