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

〽️ Image Ops Distort

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

By MajoorWaldi·Created 8 months ago·Updated 8 days ago· 11
〽️ 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_channel3 options: source_channel, displacement_channel, mask
x_channelCOMBORed5 options: Red, Green, Blue, Alpha, Luma
y_channelCOMBOGreen5 options: Red, Green, Blue, Alpha, Luma
strength_xFLOAT40.0-2048–2048
strength_yFLOAT40.0-2048–2048
blur_mapFLOAT0.00–200Gaussian blur radius (in pixels) applied to the distortion map(s) before warping. 0 = no blur.
centered_mapBOOLEANtrue
invert_mapBOOLEANfalse
filterCOMBObilinear3 options: nearest, bilinear, bicubic
edge_modeCOMBOborder3 options: border, reflection, zeros
invert_maskBOOLEANfalse
imageoptIMAGE,VIDEOSource image/video to distort.
displacementoptIMAGE,VIDEOOptional displacement image/video when map_source is displacement_channel.
maskoptMASKUsed as the distortion map when map_source is mask, otherwise acts as an effect mask.

Outputs (2)

NameTypeDescription
imageIMAGE
maskMASK