A comprehensive ComfyUI custom nodes package for selecting, cropping, resizing, and reinserting image regions with full metadata tracking.
In some cases, when the ComfyUI window is too small or zoomed, the selection overlay may appear misaligned with the actual image. A fix is currently in development.
BoxBox provides a complete workflow for working with specific image regions:
- π¦ BoxSelector - Interactive interface to select rectangular regions on images
- βοΈ BoxCrop - Crop selected regions from original images
- π¦ BoxResize - Resize cropped regions with preset aspect ratios for AI generation
- π¨ BoxReinsert - Reinsert generated images back into original positions
Interactive interface to select rectangular regions on images.
image(IMAGE): Source image to select from
image(IMAGE): Original image (passthrough)box_metadata(STRING): JSON with selection coordinates
- π±οΈ Interactive Selection: Click and drag to draw rectangles
- π Side Coordinates: Returns x1, x2, y1, y2 (not x, y, width, height)
- π Clear Button: Reset selection and start over
- π Live Coordinates: Shows selection position in real-time
{
"x1": 100,
"y1": 150,
"x2": 600,
"y2": 450,
"borderWidth": 3,
"borderPosition": "inside",
"displayScaleFactor": 1.0,
"selected": true
}- π Aspect Ratio Locking: Select from preset ratios or draw freely
- Presets: 1:1, 3:4, 5:8, 9:16, 9:21, 4:3, 3:2, 16:9, 21:9
- Custom: Draw freely and get closest standard ratio
- π§ Auto-Scale Large Images: Images > 1024px automatically scaled down for smooth selection
- Scaling factor saved in metadata (
displayScaleFactor) - BoxCrop and BoxReinsert automatically correct coordinates
- Scaling factor saved in metadata (
Crops images according to coordinates provided by BoxSelector.
image(IMAGE): Image to cropbox_metadata(STRING): JSON coordinates from BoxSelector (x1, x2, y1, y2)- Connect directly from BoxSelector output
fallback_mode(COMBO): Behavior when no valid coordinatesuse_full_image: Return entire image (default)return_zero: Return black imageerror: Raise error
cropped_image(IMAGE): Cropped region
- Extracts x1, x2, y1, y2 from metadata
- If
displayScaleFactoris present (from large image auto-scaling):- Divides coordinates by scale factor to convert from preview space to original image space
- Normalizes coordinates (ensures x1 < x2, y1 < y2)
- Clips to image boundaries
- Crops the specified region
When BoxSelector uses auto-scale for large images (> 1024px), BoxCrop automatically:
- Detects the
displayScaleFactorin metadata - Converts preview-space coordinates back to original-image-space
- Ensures crops match the intended selection on the original image
Resizes cropped regions with preset aspect ratios or custom dimensions, with full metadata tracking.
image(IMAGE): Image to resizesize(COMBO): Preset selection or "Custom"1:1 Square 1024x10243:4 Portrait 896x11525:8 Portrait 832x12169:16 Portrait 768x13449:21 Portrait 640x15364:3 Landscape 1152x8963:2 Landscape 1216x83216:9 Landscape 1344x76821:9 Landscape 1536x640Custom(use width/height parameters)
keep_aspect_ratio(BOOLEAN): Maintain original aspect ratio (default: True)interpolation_mode(COMBO): Resize algorithmbilinear(default, faster)bicubic(higher quality)nearest(pixel-perfect)
width(INT): Custom width [64-8192, step 8] (when size = "Custom")height(INT): Custom height [64-8192, step 8] (when size = "Custom")
image(IMAGE): Resized imageresize_metadata(STRING): JSON with resize information
{
"original_width": 500,
"original_height": 300,
"resized_width": 1024,
"resized_height": 1024,
"scale_x": 2.048,
"scale_y": 3.413,
"size_preset": "1:1 Square 1024x1024",
"keep_aspect_ratio": true,
"interpolation_mode": "bilinear"
}Reinserts generated images back into original positions using metadata.
original_image(IMAGE): Original full-size imagegenerated_image(IMAGE): Generated/processed imagebox_metadata(STRING): Selection coordinates from BoxSelectorresize_metadata(STRING): Resize information from BoxResize
image(IMAGE): Final image with generated content reinserted
- Reads box_metadata for original selection position (x1, x2, y1, y2)
- If
displayScaleFactoris present (from large image auto-scaling):- Divides coordinates by scale factor to convert from preview space to original image space
- If resize_metadata is provided:
- Resizes generated_image back to crop dimensions
- Inserts at exact original position
- If resize_metadata is empty:
- Inserts generated_image as-is (bypasses resize reversal)
- Returns full image with processed region in place
When BoxSelector uses auto-scale for large images (> 1024px), BoxReinsert automatically:
- Detects the
displayScaleFactorin metadata - Converts preview-space coordinates back to original-image-space
- Reinserts the generated content at the correct position on the original image
- With Resize: Generated β De-resize β Reinsert
- Without Resize: Generated β Reinsert directly
LoadImage
β
π¦ BoxSelector (select region interactively)
β box_metadata
βοΈ BoxCrop (extract region)
β cropped_image
π¦ BoxResize (prepare for AI, e.g., 1024x1024)
β resize_metadata
[AI Generation Model - SDXL, SD, etc.]
β generated_image
π¨ BoxReinsert (put back in original position)
β
Output: Final image with AI-generated region
LoadImage
β
π¦ BoxSelector (select region)
β box_metadata
βοΈ BoxCrop (extract region)
β cropped_image
[Edit/Filter directly]
β edited_image
π¨ BoxReinsert (reinsert without resize)
β
Output: Final image
The metadata system ensures complete traceability:
-
BoxSelector Output:
{"x1": ..., "y1": ..., "x2": ..., "y2": ..., "displayScaleFactor": ...}- Stores original selection coordinates
- Includes scale factor if image was auto-scaled (for large images > 1024px)
- borderWidth and borderPosition also included
-
BoxResize Output:
{"original_width": ..., "resized_width": ..., "scale_x": ..., ...}- Tracks resize transformation for reversal
-
BoxCrop & BoxReinsert: Automatically handle:
- If
displayScaleFactorpresent: Convert coordinates from preview-space to original-image-space - Use converted coordinates for accurate cropping and reinsertion
- Both nodes work seamlessly with auto-scaled selections
- If
- Border Width: Fixed at 3px (built-in)
- Border Position: Fixed at "inside" (built-in)
All presets optimize for AI generation models:
- Square: 1:1 ratio at 1024x1024
- Portrait: Multiple heights (3:4, 5:8, 9:16, 9:21)
- Landscape: Multiple widths (4:3, 3:2, 16:9, 21:9)
bilinear: Fast, good quality (default)bicubic: Slower, higher qualitynearest: Pixel-perfect, no smoothing
All nodes use side coordinates (x1, x2, y1, y2):
x1: Left edgex2: Right edgey1: Top edgey2: Bottom edge
This allows:
- Easy understanding of selected region
- Automatic validation (x1 < x2, y1 < y2)
- Direct use for cropping and reinsertion
Left Panel (Controls)
- Image name
- Aspect Ratio selector (9 presets + Custom mode)
- Clear Selection button
- Selection coordinates display with live aspect ratio info
- Scale info display (when large image is auto-scaled)
Right Panel (Canvas)
- Interactive image canvas
- Auto-scaled preview (for images > 1024px)
- Click + drag to draw rectangle
- Drag handles to resize
- Drag body to move
- Resize handles with smooth interaction
Features
- π§ Automatic Large Image Handling: Seamlessly scales down for preview while maintaining accuracy
- π Aspect Ratio Locking: Lock to standard ratios or draw freely
- π Live Feedback: Real-time coordinate and ratio display
-
Clone/copy the BoxBox folder to:
ComfyUI/custom_nodes/BoxBox/ -
Restart ComfyUI
-
Nodes will appear in
image/boxcategory
- ComfyUI: Latest version
- Python: 3.8+
- PyTorch: >= 2.0.0
- Pillow (PIL): >= 8.0.0
- NumPy: >= 1.20.0
- torch.nn.functional: For interpolation (included with PyTorch)
torch>=2.0.0
Pillow>=8.0.0
numpy>=1.20.0
- Add LoadImage node
- Add π¦ BoxSelector node, connect image
- Click "π¦ Select Box" button
- Draw rectangle on image, click "β Confirm"
- Add βοΈ BoxCrop, connect BoxSelector output
- Add π¦ BoxResize, select preset (e.g., "1:1 Square 1024x1024")
- Send to AI model or editor
- Add π¨ BoxReinsert:
- Connect original image from step 1
- Connect generated image from step 7
- Connect box_metadata from step 4 output
- Connect resize_metadata from step 6 output
- Execute graph β final image!
- Make sure image is connected to BoxSelector
- Check browser console (F12) for errors
- Try reloading page (Ctrl+Shift+R)
- Ensure you're clicking inside the image area
- Check that cursor shows crosshair
- Try refreshing the page
- Check that
keep_aspect_ratiois set correctly - Verify image dimensions are valid
- Try different
interpolation_mode
- Verify all 4 inputs are connected (original_image, generated_image, box_metadata, resize_metadata)
- Check that metadata JSON is valid
- Ensure original_image and box_metadata match (same image used for selection)
- β Auto-Scale Large Images: Images > 1024px automatically scaled in preview for smooth selection
- β displayScaleFactor Metadata: Scale factor saved in metadata for accurate coordinate conversion
- β Aspect Ratio Locking: 9 preset aspect ratios + custom free drawing mode
- β Smart Coordinate Correction: BoxCrop and BoxReinsert auto-correct coordinates from scaled previews
- β Live Aspect Ratio Display: Shows closest standard ratio when drawing freely
- β BoxSelector with interactive region selection
- β BoxCrop with coordinate-based cropping
- β BoxResize with preset aspect ratios and custom sizes
- β BoxReinsert with flexible resize handling
- β Complete metadata tracking system
- β Optional resize bypass in BoxReinsert
- β Multiple interpolation modes
Select Region 1 β Crop β Resize β AI Generate β Reinsert
Parallel with:
Select Region 2 β Crop β Resize β AI Generate β Reinsert
Use Reroute nodes to process same coordinates on multiple images.
Use BoxResize with "Custom" mode and specify exact width/height.
MIT
For issues, feature requests, or suggestions, please contact the developer.
Created for ComfyUI - Transform your images with precision! π―βοΈπ¦π¨