# ๐จ ComfyUIโMajoorโImageOps **Advanced image processing nodes for ComfyUI** with a centralized live preview module (no queue required), batch-first behavior, and comprehensive interop adapters. --- ## โจ Features - **๐ฆ Batch-First Architecture**: `IMAGE` inputs/outputs are treated as batches (frames friendly) - perfect for video and animation workflows - **๐ก๏ธ Fail-Soft Interop**: Unsupported upstream nodes don't break the graph or preview - graceful degradation - **๐๏ธ Live Preview Widget**: Real-time preview on ImageOps nodes without queuing (single frontend module) - **๐๏ธ Preview Pro UI** (only on `ImageOpsPreview`): - ๐ Histogram analysis - ๐ Waveform (luma/RGB) - ๐ฏ Vectorscope - ๐ฆ Zebra/False-color overlays - โ๏ธ A/B freeze + wipe comparison - **๐ Optional Bypass**: All processing nodes expose `bypass` (boolean) - when enabled, the node returns input unchanged and live preview skips applying the operation --- ## ๐ฅ Installation 1. **Clone/Place** this folder in `ComfyUI/custom_nodes/ComfyUI-Majoor-ImageOps` 2. **Restart** ComfyUI 3. **Hard refresh** the browser: `Ctrl+F5` (or `Cmd+Shift+R` on macOS) --- ## ๐งฉ Nodes (`image/imageops`) ### ๐ง Processing Nodes | Node | Internal ID | Description | |------|-------------|-------------| | **ImageOps Color Correct** | `ImageOpsColorAjust` | Professional color correction with temperature, hue, brightness, contrast, saturation, and gamma controls | | **ImageOps Blur** | `ImageOpsBlur` | Gaussian blur with radius/sigma control and mask support | | **ImageOps Channels** | `ImageOpsChannel` | Extract and manipulate individual RGB/Alpha channels | | **ImageOps Mask Convert** | `ImageOpsMaskConvert` | Convert images and masks with selectable matte extraction, levels, and antialiasing | | **ImageOps Resize/Crop** | `ImageOpsCrop` | Interactive crop and resize with aspect ratio presets | | **ImageOps Distort** | `ImageOpsDistort` | iDistort-style displacement warp driven by source channels, external maps, masks, or internal procedural noise | | **ImageOps Transform** | `ImageOpsTransform` | Translate, rotate, scale with filter options (nearest/bilinear/bicubic) | | **ImageOps Corner Pin** | `ImageOpsCornerPin` | Perspective corner pinning with batched homography warp, bicubic filtering, supersampling, and alpha-safe edges | | **ImageOps Pad Out** | `ImageOpsPadOut` | Add per-side borders with constant, edge-extended, reflected, or blurry fill and optional target aspect ratios | | **ImageOps Invert** | `ImageOpsInvert` | Invert colors and/or alpha channel (separate alpha control) | | **ImageOps Spherize** | `ImageOpsSpherize` | Spherical and fisheye lens projections with five modes, strength control, and circle-mask output | | **ImageOps Clamp** | `ImageOpsClamp` | Clamp pixel values to min/max range | | **ImageOps Merge** | `ImageOpsMerge` | Linear-light two-input compositing with production blend modes and foreground fit controls | | **ImageOps Noise** | `ImageOpsNoise` | GPU-backed procedural noise source with Perlin, value, seamless tiling, 3D Z animation, seed stepping, frame length/FPS controls, and color ramp output | | **ImageOps Paint** | `ImageOpsDraw` | Digital painting with brush/eraser tools, cropped overlay payloads, layer JSON support, and pen dynamics | | **ImageOps Comp** | `ImageOpsComp` | Multi-layer compositor with blend modes, positioning, and opacity per layer | ### ๐ค Output Nodes | Node | Description | |------|-------------| | **ImageOps Preview** | `ImageOpsPreview` | Preview bridge node with multiple display modes (images, strip, animated WebP/GIF) | --- ## ๐๏ธ Node Details ### ๐จ ImageOps Color Correct  Professional color grading with reference-based correction. **Inputs:** - `image` (IMAGE/VIDEO): Source media - `mask` (MASK, optional): Effect mask **Parameters:** - `temperature` (-100 to 100): Color temperature adjustment - `hue` (-180 to 180): Hue rotation in degrees - `brightness` (-100 to 100): Brightness adjustment - `contrast` (-100 to 100): Contrast adjustment - `saturation` (-100 to 100): Saturation adjustment - `gamma` (0.2 to 2.2): Gamma correction - `invert_mask`: Invert mask effect - `bypass`: Skip processing **Outputs:** `IMAGE`, `MASK` --- ### ๐ซ๏ธ ImageOps Blur  Gaussian blur with optional mask support. **Inputs:** - `image` (IMAGE/VIDEO): Source media - `mask` (MASK, optional): Effect mask **Parameters:** - `radius` (0 to 128): Blur support radius in pixels; when set to `0`, support is derived from `sigma` - `sigma` (0.01 to 64.0): Gaussian sigma value controlling blur spread - `invert_mask`: Invert mask effect - `bypass`: Skip processing **Outputs:** `IMAGE`, `MASK` --- ### ๐ด ImageOps Channels  Extract and isolate individual color channels. **Inputs:** - `image` (IMAGE/VIDEO): Source media - `mask` (MASK, optional): Effect mask **Parameters:** - `channel`: Red, Green, Blue, or Alpha - `invert_mask`: Invert mask effect - `bypass`: Skip processing **Outputs:** `IMAGE`, `MASK` --- ### ๐๏ธ ImageOps Mask Convert  Convert images to masks and masks to previewable images. **Inputs:** - `image` (IMAGE/VIDEO, optional): Source media when `reverse` is enabled - `mask` (MASK, optional): Source mask when `reverse` is disabled **Parameters:** - `reverse`: image -> mask when enabled, mask -> image when disabled - `mask_source`: auto, luma, max_rgb, saturation, red, green, blue, or alpha - `black_point` / `white_point`: Remap the extracted matte to harden or soften the mask - `antialias_radius`: Small blur radius before levels to smooth jagged matte edges **Outputs:** `IMAGE`, `MASK` --- ### โ๏ธ ImageOps Resize/Crop  Interactive crop and resize with aspect ratio control. **Inputs:** - `image` (IMAGE/VIDEO): Source media - `mask` (MASK, optional): Effect mask **Parameters:** - `aspect_ratio`: Preset ratios (1:1, 3:4, 4:3, 16:9, 9:16, custom) - `width` (1 to 8192): Output width - `height` (1 to 8192): Output height - `sync_dimensions`: Link width/height changes - `crop_center_x` (0.0 to 1.0): Horizontal crop position - `crop_center_y` (0.0 to 1.0): Vertical crop position - `crop_scale` (0.05 to 1.0): Crop zoom level - Crop outputs include `imageops_crop_bbox` metadata in source-image coordinates for UI overlays/extensions - `invert_mask`: Invert mask effect - `bypass`: Skip processing **Outputs:** `IMAGE`, `MASK` --- ### ๐ ImageOps Distort  Channel-driven displacement warp inspired by iDistort-style workflows. **Inputs:** - `image` (IMAGE/VIDEO): Source media to deform - `displacement` (IMAGE/VIDEO, optional): External displacement plate when `map_source` is `displacement_channel` - `mask` (MASK, optional): Used as the distortion map in `mask` mode, otherwise acts as an effect mask **Parameters:** - `map_source`: source_channel, displacement_channel, mask, or noise - `x_channel`, `y_channel`: Choose independent channels for horizontal and vertical deformation - `strength_x`, `strength_y`: Warp amplitude in pixels - `centered_map`: Treat mid-gray as neutral displacement - `invert_map`: Invert the driving map before warping - `filter`: nearest, bilinear, bicubic - `edge_mode`: border, reflection, zeros - Internal noise controls: basis, fractal mode, scale, octaves, lacunarity, gain, seed, and offsets - `invert_mask`: Invert the effect mask when the mask input is acting as an effect mask **Outputs:** `IMAGE`, `MASK` --- ### ๐ ImageOps Transform  Geometric transformations with quality filters. **Inputs:** - `image` (IMAGE/VIDEO): Source media - `mask` (MASK, optional): Effect mask **Parameters:** - `translate_x` (-4096 to 4096): Horizontal offset - `translate_y` (-4096 to 4096): Vertical offset - `rotate_deg` (-180 to 180): Rotation angle (clockwise positive) - `scale` (0.01 to 8.0): Scale factor - `filter`: Nearest, Bilinear, or Bicubic - `expand`: Compatibility option; the GPU affine path keeps the output size fixed - `invert_mask`: Invert mask effect - `bypass`: Skip processing **Outputs:** `IMAGE`, `MASK` --- ### ๐ ImageOps Corner Pin  Perspective corner pinning for screen replacement, planar warps, and compositing. **Inputs:** - `image` (IMAGE/VIDEO): Source media **Parameters:** - `tl_x`, `tl_y`: Top-left destination corner in normalized image coordinates - `tr_x`, `tr_y`: Top-right destination corner in normalized image coordinates - `bl_x`, `bl_y`: Bottom-left destination corner in normalized image coordinates - `br_x`, `br_y`: Bottom-right destination corner in normalized image coordinates - `filter`: Nearest, Bilinear, or Bicubic - `supersample`: 1x to 4x multisampling before downsampling - `edge_mode`: border, reflection, or zeros - `invert_mask`: Invert the warped transparency mask - `bypass`: Skip processing The warp uses batched PyTorch homographies with `grid_sample`; RGBA input is premultiplied before warping so transparent edges stay clean. **Outputs:** `IMAGE`, `MASK` --- ### ๐งฑ ImageOps Pad Out  Add borders around an image without scaling the source. **Inputs:** - `image` (IMAGE/VIDEO): Source media **Parameters:** - `pad_left`, `pad_top`, `pad_right`, `pad_bottom`: Per-side padding in pixels - `target_format`: custom, 1:1, 16:9, 9:16, 4:3, or 3:4 - `fill_mode`: constant, edge_extend, reflect, or blurry - `fill_color`: Solid color for constant padding - `blur_radius`: Background blur radius for blurry padding - `invert_mask`: Invert the padding mask - `bypass`: Skip processing The `target_format` option adds only the extra padding needed to reach the selected ratio, so manual side padding can still decenter the source. **Outputs:** `IMAGE`, `MASK`, `INT` (width), `INT` (height) --- > **Note:** A dedicated *ImageOps PadOut Stitch* node (to restore the original into the padded area after outpainting) is planned for a future release. ### ๐ญ ImageOps Invert  Invert colors and/or the alpha channel independently. **Inputs:** - `image` (IMAGE/VIDEO): Source media - `mask` (MASK, optional): Effect mask **Parameters:** - `invert_alpha`: Also invert the alpha channel (only applies to RGBA images with 4 channels) - `invert_mask`: Invert the output mask - `bypass`: Skip processing **Outputs:** `IMAGE`, `MASK` --- ### ๐ฎ ImageOps Spherize  Spherical, fisheye, and equirectangular lens-projection distortions. **Inputs:** - `image` (IMAGE/VIDEO): Source media - `mask` (MASK, optional): Mask to multiply against the circle boundary **Parameters:** - `mode`: `spherize` (barrel/pincushion), `fisheye` (equidistant projection), `defisheye` (flatten fisheye), `latlong` (equirectangular โ rectilinear), `unlatlong` (rectilinear โ equirectangular) - `strength` (0.0 to 2.0): Effect intensity; 1.0 = full projection, values > 1 push beyond the normal range - `invert`: Swap the forward and inverse mapping directions (e.g. barrel โ pincushion, latlong โ unlatlong) - `filter`: `bilinear`, `bicubic`, or `nearest` โ resampling quality - `edge_mode`: `border`, `reflection`, or `zeros` โ behavior at the image boundary - `size_mode`: `from_input` (use input dimensions) or `custom` (resize to `width` ร `height` before applying) - `width` / `height`: Target dimensions when `size_mode` is `custom` - `bypass`: Skip processing The output mask is a unit-circle alpha (1 inside the sphere, 0 outside), multiplied by the optional input mask. **Outputs:** `IMAGE`, `MASK` --- ### ๐ ImageOps Clamp  Clamp pixel values to specified range. **Inputs:** - `image` (IMAGE/VIDEO): Source media - `mask` (MASK, optional): Effect mask **Parameters:** - `min_v` (-1.0 to 1.0): Minimum value - `max_v` (0.0 to 2.0): Maximum value - `invert_mask`: Invert mask effect - `bypass`: Skip processing **Outputs:** `IMAGE`, `MASK` --- ### ๐ ImageOps Merge  Blend two images with linear-light or sRGB blend modes. **Inputs:** - `A` (IMAGE/VIDEO): Background layer - `B` (IMAGE/VIDEO): Foreground layer - `mask` (MASK, optional): Effect mask **Parameters:** - `mode`: over, add, subtract, multiply, screen, overlay, soft_light, difference, max, min, lighten, darken, color_dodge, color_burn, exclusion, vivid_light, pin_light, hard_mix - `mix` (0.0 to 1.0): Blend opacity - `foreground_fit`: stretch, contain, cover, or none for adapting foreground B to background A - `blend_space`: linear or srgb; linear performs RGB blend math in gamma 1.0 then converts back to sRGB - `invert_mask`: Invert mask effect - `bypass`: Skip processing **Outputs:** `IMAGE`, `MASK` --- ### ๐ซ๏ธ ImageOps Noise  Procedural texture generator for masks and grayscale or color noise plates. **Parameters:** - `width` / `height`: Output resolution (64 to 8192) - `frame_length`: Number of frames to generate (1 to 256) - `fps`: Preview playback speed - `seed`: Deterministic noise seed - `basis`: `perlin`, `value`, or `white` - `fractal_mode`: `none`, `fbm`, `turbulence`, or `ridged` - `scale`: Primary feature size - `octaves` (1 to 12), `gain` (0.0 to 1.0): Fractal shaping controls - `offset_z`: Static Z offset into the 3D noise field - `animation_speed`: Z offset added per frame โ higher = faster animation, 0 = still image - `seamless`: Tileable X/Y noise for repeating textures - `contrast`, `invert`: Output tonal shaping - `low_color`, `high_color`: Color ramp applied to the grayscale output **Outputs:** `IMAGE`, `MASK` --- ### ๐๏ธ ImageOps Paint  Digital painting and drawing tool. **Inputs:** - `image` (IMAGE/VIDEO, optional): Base media (creates blank canvas if not provided) **Parameters:** - `width` (64 to 4096): Canvas width - `height` (64 to 4096): Canvas height - `sync_dimensions`: Link width/height changes - `bg_color`: Background color (hex) - `tool`: Brush or Eraser - `brush_color`: Brush color (hex) - `brush_opacity` (0.0 to 1.0): Brush transparency - `brush_size` (1 to 256): Brush diameter - `brush_pressure_size`: Pen pressure modulates brush diameter - `brush_pressure_opacity`: Pen pressure modulates brush opacity - `brush_tilt_size`: Pen tilt can widen the brush footprint - `overlay_format`: WebP or PNG payload encoding - `overlay_data`: Encoded overlay payload; the preview stores cropped visible bounds to reduce transfer size - `overlay_layers`: Optional JSON layer list for composing multiple overlay payloads - `invert_mask`: Invert mask effect - `bypass`: Skip processing The node still accepts older full-frame Base64 PNG `overlay_data` values. New preview payloads are cropped to the visible painted bounds and can use WebP when the browser supports it; `overlay_layers` accepts `{"layers":[{"data":"...","opacity":1,"enabled":true}]}` for non-destructive multi-layer overlays. **Outputs:** `IMAGE`, `MASK` --- ### ๐ฌ ImageOps Comp  Multi-layer compositor with professional controls. **Inputs:** - `image_1`, `image_2`, ... (IMAGE/VIDEO): Layer inputs - `mask_1`, `mask_2`, ... (MASK): Per-layer masks - Dynamic slot system with auto-expansion **Parameters:** - `bypass`: Skip processing - `use_first_layer_size`: Use first layer as canvas size - `auto_layering`: Use the largest connected layer dimensions as canvas size - `width` (1 to 8192): Custom canvas width - `height` (1 to 8192): Custom canvas height - `background_color`: Canvas background (hex) - `layers_json`: Layer configuration (auto-managed by UI) - `invert_mask`: Invert output mask **Interactive UI Features:** - โ Add layer button - ๐ Reset layer button - ๐จ Blend mode selector per layer - ๐๏ธ Opacity slider per layer - ๐ฑ๏ธ Drag-to-position layers on preview **Outputs:** `IMAGE`, `MASK` --- ### ๐๏ธ ImageOps Preview Preview output node with advanced visualization modes. **Inputs:** - `image` (IMAGE/VIDEO): Source media - `mask` (MASK, optional): Mask to preview **Parameters:** - `preview_target`: auto, image, or mask - `mode`: - `images`: Individual frames - `strip`: Horizontal strip for batch inspection - `animated_webp`: Animated WebP preview - `animated_gif`: Animated GIF preview **Outputs:** `IMAGE`, `MASK` --- ## ๐ง Bypass Mode All processing nodes expose a **`bypass`** parameter (boolean). When enabled: - โ Node returns input unchanged - โ Live preview skips applying the operation - โ Useful for A/B comparison and workflow debugging --- ## ๐ฅ๏ธ Live Preview (Frontend) ### Architecture | File | Purpose | |------|---------| | `js/preview/host.js` | Widget injection, video loop, Preview Pro UI (scopes/overlays/AโB) | | `js/preview/renderer.js` | Recursive render with caching (recursion limit: 64) | | `js/preview/registry.js` | Adapter selection (core/WAS/VHS/generic/ImageOps) | | `js/preview/ops.js` | Preview ops implementation (single source for preview behavior) | ### Preview Pro UI Features (ImageOpsPreview only) - ๐ **Histogram**: Luminance distribution - ๐ **Waveform**: Luma or RGB waveform monitor - ๐ฏ **Vectorscope**: Color vector analysis - ๐ฆ **Zebra/False Color**: Exposure visualization - โ๏ธ **A/B Compare**: Freeze and wipe comparison ### Interop Support | Source | Adapters | |--------|----------| | **Core** | Basic invert/sharpen/blend (best effort) | | **WAS** | Heuristics for common nodes | | **VHS** | Video frame sources | | **Generic** | Fallback adapter | > โ ๏ธ **Fail-Soft**: Unsupported nodes don't break the graph - they simply bypass preview processing. --- ## โ๏ธ Configuration ### Preview Canvas Size ```javascript localStorage["imageops.preview.canvasSize"] = 512; // Default: 512px ``` ### Large Image Warning Threshold ```bash # Environment variable (in MB) IMAGEOPS_LARGE_IMAGE_WARN_MB=2048 # Default: 2048 MB ``` --- ## ๐ Notes & Troubleshooting ### โ ๏ธ Deprecation Warnings If ComfyUI logs `[DEPRECATION WARNING]`, another extension is using legacy frontend APIs. This doesn't affect ImageOps functionality. ### ๐ฅ Video/Frame Sources Some packs expose video via custom types. Best results when upstream provides frames as `IMAGE` batches. ### ๐ Input Types - **IMAGE**: Standard ComfyUI image batches `[B, H, W, C]` - **VIDEO**: Frame sources from video nodes (VHS, etc.) - **MASK**: Single-channel masks `[B, H, W]` ### ๐จ Blend Modes Reference | Mode | Description | |------|-------------| | `over` | Standard alpha compositing | | `add` | Additive blending (brightens) | | `subtract` | Subtractive blending (darkens) | | `multiply` | Multiply colors (darkens) | | `screen` | Screen blend (brightens) | | `difference` | Absolute difference | | `max` | Maximum of each channel | | `min` | Minimum of each channel | ### ๐๏ธ Compositor Blend Modes | Mode | Canvas Operation | |------|------------------| | `over` | source-over | | `add` | lighter | | `multiply` | multiply | | `screen` | screen | | `overlay` | overlay | | `soft_light` | soft-light | | `difference` | difference | | `lighten` | lighten | | `darken` | darken | | `color_dodge` | color-dodge | | `color_burn` | color-burn | | `exclusion` | exclusion | --- ## ๐๏ธ Technical Details ### Batch Processing All nodes process batches natively: - Single images: `[1, H, W, C]` - Image sequences: `[B, H, W, C]` - Video frames: `[B, H, W, C]` ### Mask Handling - Masks are automatically prepared and matched to reference dimensions - `invert_mask` affects both processing and output mask - Alpha channel extracted as mask when available ### Color Space - All processing in linear float32 `[0.0, 1.0]` - Luma weights: `[0.2126, 0.7152, 0.0722]` (Rec. 709) - Gamma safe range: `0.2` to `5.0` ### Performance - Live preview uses optimized canvas rendering - Recursive render cache limit: 64 nodes - Large image warning threshold: 2048 MB (configurable) --- ## ๐ License *Check the repository for license information.* --- ## ๐ Credits **Author**: Majoor **Category**: `image/imageops` **Version**: 0.1.4 --- ## ๐ Changelog ### Recent changes - **ImageOps Spherize** โ new node with five projection modes (spherize, fisheye, defisheye, latlong, unlatlong), bicubic/bilinear/nearest filter, edge modes, custom output size, and circle-mask output - **ImageOps Corner Pin** โ bicubic interpolation option added - **ImageOps Color Correct** โ enhanced color correction capabilities - **ImageOps Preview** โ improved noise node performance and zoom/pan interactions - **ImageOps Invert** โ `invert_alpha` is now a proper UI checkbox (previously in the signature but not exposed); RGBA images can invert color and alpha independently - **ImageOps Noise** โ incremental CPU transfer during frame generation reduces peak VRAM usage on large batches; deprecated legacy parameters (`seed_step`, `compute_device`, `offset_x/y`, `frame_offset_x/y/z`, `lacunarity`) removed from UI (still accepted in saved workflows for backwards compatibility) ---