A comprehensive ComfyUI custom nodes package for selecting, cropping, resizing, and reinserting image regions with full metadata tracking.
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! π―βοΈπ¦π¨