Nodes/ComfyUI-Majoor-ImageOps/〽️ Image Ops Distort
ComfyUI Node

〽️ Image Ops Distort

Ripple, warp, and melt — channel-driven displacement inside ComfyUI

By MajoorWaldi·Created 9 months ago·Updated 11 days ago· 14
〽️ Image Ops Distort
  • image
  • displacement
  • mask
  • image
  • mask
◄bypassfalse►
◄map_sourcesource_channel►
◄x_channelRed►
◄y_channelGreen►
◄strength_x40.0►
◄strength_y40.0►
◄blur_map0.0►
◄centered_maptrue►
◄invert_mapfalse►
◄filterbilinear►
◄edge_modeborder►
◄invert_maskfalse►

ImageOps Distort is the node for people who want their images to behave like liquid. It's a displacement warp in the style of iDistort workflows - you use one image's brightness to push another image's pixels around. Water ripples, heat haze, melting text, a flag flapping in the wind: all of it is just displacement, and this node gives you four different sources to drive it. It's part of the ComfyUI-Majoor-ImageOps pack.

How it works

map_source picks what drives the warp:

  • source_channel - a channel of the image itself (default Red/Green pair). The classic trick: generate a noise plate, feed it into your image's own warp, and get a smooth organic ripple.
  • displacement_channel - an external plate via the optional displacement input. This is the proper VFX approach: a dedicated displacement map (often a depth pass or a procedural texture) that's separate from the image being warped.
  • mask - the optional mask input becomes the warp map itself.
  • noise - the node generates its own internal procedural noise, with controls for basis (Perlin/value/white), fractal mode, scale, octaves, gain, seed, and offsets.

Then x_channel and y_channel pick independent channels for horizontal and vertical deformation, and strength_x / strength_y (in pixels, −2048…2048) set how far things get pushed. centered_map (default on) treats mid-gray as neutral - that's the difference between "the map is an offset field" and "bright areas push one way, dark the other." blur_map smooths the map before warping, which is the difference between a crunchy noise warp and a silky one. invert_map flips the push direction, filter sets resampling quality, and edge_mode (border, reflection, or zeros) decides what shows up at the frame edges.

The workflow that clicks

The combination people actually use: ImageOps Noise → Distort. Generate a Perlin plate with the noise node, wire it into displacement, set x_channel/y_channel to Red/Green, and tune strength plus blur_map. You get an organic, controllable warp with zero image editing skills required - and because both nodes are batch-first and seeded, it animates consistently across a video. That's your water ripple or heat-haze in about four connections.

Outputs are image and mask (the mask doubles as the effect mask when you're not using mask as the warp map).

Install

ComfyUI Manager (search "ComfyUI-Majoor-ImageOps"), or:

cd ComfyUI/custom_nodes
git clone https://github.com/MajoorWaldi/ComfyUI-Majoor-ImageOps

Restart and hard-refresh the browser (Ctrl+F5 / Cmd+Shift+R). No models, no extra deps.

Where it gets fiddly

The trap is centered_map. If you feed it a map that isn't mid-gray centered and leave centered_map on, everything shifts in one direction and it looks broken - turn it off for maps that are meant to be interpreted as raw offsets. Second: huge strength values with zeros edge mode produce black gaps at the frame edge; switch to border or reflection when you're pushing hard. And if your warp looks like static, the map is too noisy - raise blur_map and lower the octaves, don't just keep cranking strength.

Categoryimage/imageops

Inputs (15)

NameTypeDefaultDescription
bypassBOOLEANfalse—
map_sourceCOMBOsource_channelstmap: the map's R/G channels are absolute normalized source coordinates (professional STMap convention), not a relative offset — strength_x/strength_y and centered_map are ignored in this mode.
x_channelCOMBORedChannel used as the U / source-X coordinate. Ignored when map_source is mask.
y_channelCOMBOGreenChannel used as the V / source-Y coordinate. Ignored when map_source is mask.
strength_xFLOAT40.0-2048–2048Displacement strength in pixels. Not used when map_source is stmap.
strength_yFLOAT40.0-2048–2048Displacement strength in pixels. Not used when map_source is stmap.
blur_mapFLOAT0.00–200Gaussian blur radius (in pixels) applied to the distortion map(s) before warping. 0 = no blur. Blurring an stmap can blend across UV island seams.
centered_mapBOOLEANtrueNot used when map_source is stmap.
invert_mapBOOLEANfalse—
filterCOMBObilinear3 options: nearest, bilinear, bicubic
edge_modeCOMBOborder3 options: border, reflection, zeros
invert_maskBOOLEANfalse—
imageoptIMAGE,VIDEOSource image/video to distort.
displacementoptIMAGE,VIDEOOptional displacement/STMap image/video used when map_source is displacement_channel or stmap. Falls back to the source image when not connected.
maskoptMASKUsed as the distortion map when map_source is mask, otherwise acts as an effect mask.

Outputs (2)

NameTypeDescription
imageIMAGE—
maskMASK—