Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
High-performance image processing with libvips. Use for resizing, converting, watermarking, thumbnails, and batch image operations with low memory usage.
High-performance image processing with libvips. Use for resizing, converting, watermarking, thumbnails, and batch image operations with low memory usage.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Fast, memory-efficient image processing using libvips via pyvips. Supports 300+ operations including resize, crop, rotate, convert, watermark, composite, and more. Ideal for batch processing large images.
Resize, crop, or thumbnail images efficiently Convert between formats (JPEG, PNG, WebP, AVIF, HEIC, TIFF, PDF, SVG) Add watermarks or text overlays Batch process multiple images Handle large images with low memory usage Create image pipelines for web optimization
# Recommended: Auto-detect OS and install everything ./scripts/install.sh The install script will: Detect your OS (macOS, Linux, Windows) Install libvips system library Install pyvips via uv (preferred) or pip Verify the installation
macOS (Homebrew): brew install vips uv pip install pyvips # preferred # or: pip install pyvips Ubuntu/Debian: sudo apt-get install libvips-dev uv pip install pyvips # preferred # or: pip install pyvips Fedora/RHEL: sudo dnf install vips-devel uv pip install pyvips Arch Linux: sudo pacman -S libvips uv pip install pyvips Windows (PowerShell, recommended): # One-click install (downloads libvips + installs pyvips) .\scripts\install.ps1 Windows (Manual): # Option 1: winget (if available) winget install libvips.libvips # Option 2: scoop scoop install libvips # Option 3: Manual download # Download from https://github.com/libvips/libvips/releases # Extract to C:\vips or %LOCALAPPDATA%\vips # Add bin\ to PATH # Install pyvips uv pip install pyvips # or: pip install pyvips Install uv (if not installed): # macOS/Linux curl -LsSf https://astral.sh/uv/install.sh | sh # Windows (PowerShell) irm https://astral.sh/uv/install.ps1 | iex
macOS/Linux - Using run.sh wrapper (recommended): ./scripts/run.sh vips_tool.py resize input.jpg output.jpg --width 800 ./scripts/run.sh vips_tool.py convert input.jpg output.webp --quality 85 ./scripts/run.sh vips_tool.py thumbnail input.jpg thumb.jpg --size 200 ./scripts/run.sh vips_batch.py resize ./input ./output --width 800 Windows - Using run.bat wrapper (recommended): .\scripts\run.bat vips_tool.py resize input.jpg output.jpg --width 800 .\scripts\run.bat vips_tool.py convert input.jpg output.webp --quality 85 .\scripts\run.bat vips_tool.py thumbnail input.jpg thumb.jpg --size 200 .\scripts\run.bat vips_batch.py resize .\input .\output --width 800 Cross-platform - Using uv (after uv sync): uv run python scripts/vips_tool.py resize input.jpg output.jpg --width 800 Direct Python (if library paths are configured): python scripts/vips_tool.py resize input.jpg output.jpg --width 800 python scripts/vips_tool.py convert input.jpg output.webp --quality 85 python scripts/vips_tool.py thumbnail input.jpg thumb.jpg --size 200 python scripts/vips_tool.py watermark input.jpg output.jpg --text "Copyright 2024"
FormatReadWriteNotesJPEGYesYesQuality 1-100PNGYesYesCompression 0-9WebPYesYesLossy/losslessAVIFYesYesModern, high compressionHEICYesYesApple formatTIFFYesYesMulti-page supportGIFYesYesAnimated supportPDFYesYesVia popplerSVGYesNoVia librsvgRAWYesNoVia libraw
Resize images with various fit modes. # Resize to exact width, maintain aspect ratio python scripts/vips_tool.py resize input.jpg output.jpg --width 800 # Resize to exact height python scripts/vips_tool.py resize input.jpg output.jpg --height 600 # Resize to fit within bounds python scripts/vips_tool.py resize input.jpg output.jpg --width 800 --height 600 # Resize to cover (fill) dimensions python scripts/vips_tool.py resize input.jpg output.jpg --width 800 --height 600 --mode cover # Force exact dimensions (may distort) python scripts/vips_tool.py resize input.jpg output.jpg --width 800 --height 600 --mode force Resize modes: fit (default): Fit within bounds, maintain aspect ratio cover: Cover bounds, crop excess force: Force exact dimensions
Create optimized thumbnails with smart cropping. # Square thumbnail python scripts/vips_tool.py thumbnail input.jpg thumb.jpg --size 200 # Attention-based smart crop python scripts/vips_tool.py thumbnail input.jpg thumb.jpg --size 200 --crop attention # Center crop python scripts/vips_tool.py thumbnail input.jpg thumb.jpg --size 200 --crop centre Crop strategies: none: No cropping, fit within size centre: Crop from center attention: Smart crop focusing on interesting areas entropy: Crop to maximize entropy
Convert between image formats with quality control. # JPEG to WebP python scripts/vips_tool.py convert input.jpg output.webp --quality 85 # PNG to AVIF (modern format, great compression) python scripts/vips_tool.py convert input.png output.avif --quality 50 # JPEG to PNG (lossless) python scripts/vips_tool.py convert input.jpg output.png # With compression level for PNG python scripts/vips_tool.py convert input.jpg output.png --compression 9
Extract a region from an image. # Crop 400x300 region starting at (100, 50) python scripts/vips_tool.py crop input.jpg output.jpg --left 100 --top 50 --width 400 --height 300 # Smart crop to aspect ratio python scripts/vips_tool.py crop input.jpg output.jpg --width 800 --height 600 --smart
Rotate images by any angle. # Rotate 90 degrees clockwise python scripts/vips_tool.py rotate input.jpg output.jpg --angle 90 # Rotate 45 degrees with background color python scripts/vips_tool.py rotate input.jpg output.jpg --angle 45 --background "255,255,255" # Auto-rotate based on EXIF python scripts/vips_tool.py rotate input.jpg output.jpg --auto
Add text or image watermarks. # Text watermark python scripts/vips_tool.py watermark input.jpg output.jpg --text "Copyright 2024" # Position: top-left, top-right, bottom-left, bottom-right, center python scripts/vips_tool.py watermark input.jpg output.jpg --text "Logo" --position bottom-right # With opacity python scripts/vips_tool.py watermark input.jpg output.jpg --text "Draft" --opacity 0.3 # Image watermark python scripts/vips_tool.py watermark input.jpg output.jpg --image logo.png --position bottom-right --opacity 0.5
Combine multiple images. # Overlay image on background python scripts/vips_tool.py composite background.jpg overlay.png output.jpg # With position offset python scripts/vips_tool.py composite background.jpg overlay.png output.jpg --x 100 --y 50 # With blend mode python scripts/vips_tool.py composite background.jpg overlay.png output.jpg --blend multiply Blend modes: over, multiply, screen, overlay, darken, lighten
Adjust brightness, contrast, saturation. # Increase brightness python scripts/vips_tool.py adjust input.jpg output.jpg --brightness 1.2 # Increase contrast python scripts/vips_tool.py adjust input.jpg output.jpg --contrast 1.3 # Increase saturation python scripts/vips_tool.py adjust input.jpg output.jpg --saturation 1.5 # Combine adjustments python scripts/vips_tool.py adjust input.jpg output.jpg --brightness 1.1 --contrast 1.2 --saturation 1.1
Apply sharpening filter. # Default sharpen python scripts/vips_tool.py sharpen input.jpg output.jpg # Custom sigma (blur radius) python scripts/vips_tool.py sharpen input.jpg output.jpg --sigma 1.5 # Custom parameters python scripts/vips_tool.py sharpen input.jpg output.jpg --sigma 1.5 --x1 2 --m2 3
Apply Gaussian blur. # Default blur python scripts/vips_tool.py blur input.jpg output.jpg # Custom sigma python scripts/vips_tool.py blur input.jpg output.jpg --sigma 5
Flip images horizontally or vertically. # Horizontal flip (mirror) python scripts/vips_tool.py flip input.jpg output.jpg --horizontal # Vertical flip python scripts/vips_tool.py flip input.jpg output.jpg --vertical
Convert to grayscale. python scripts/vips_tool.py grayscale input.jpg output.jpg
Get image metadata. python scripts/vips_tool.py info input.jpg Output: File: input.jpg Format: jpeg Width: 3840 Height: 2160 Bands: 3 Interpretation: srgb Size: 2.4 MB
Process multiple images at once. # Resize all JPEGs in a directory python scripts/vips_batch.py resize ./input ./output --width 800 --pattern "*.jpg" # Convert all images to WebP python scripts/vips_batch.py convert ./input ./output --format webp --quality 85 # Create thumbnails for all images python scripts/vips_batch.py thumbnail ./input ./thumbnails --size 200 # Custom batch with JSON config python scripts/vips_batch.py --config batch_config.json
{ "input_dir": "./input", "output_dir": "./output", "operations": [ {"type": "resize", "width": 1920}, {"type": "sharpen", "sigma": 0.5}, {"type": "convert", "format": "webp", "quality": 85} ], "pattern": "*.{jpg,jpeg,png}", "recursive": true, "workers": 4 }
import pyvips # Load image image = pyvips.Image.new_from_file("input.jpg") # Resize resized = image.resize(0.5) # 50% scale resized = image.thumbnail_image(800) # 800px width # Save resized.write_to_file("output.jpg", Q=85) # JPEG quality 85 resized.write_to_file("output.webp", Q=85) # WebP quality 85
import pyvips # Load, process, save in one pipeline image = pyvips.Image.new_from_file("input.jpg", access="sequential") result = ( image .thumbnail_image(1200) .sharpen(sigma=0.5) .write_to_file("output.webp", Q=85) )
import pyvips image = pyvips.Image.new_from_file("input.jpg") # Create text overlay text = pyvips.Image.text( "Copyright 2024", font="sans 24", rgba=True ) # Composite at bottom-right x = image.width - text.width - 20 y = image.height - text.height - 20 result = image.composite2(text, "over", x=x, y=y) result.write_to_file("output.jpg")
import pyvips from pathlib import Path from concurrent.futures import ThreadPoolExecutor def process_image(input_path, output_dir, width=800): image = pyvips.Image.new_from_file(str(input_path), access="sequential") thumbnail = image.thumbnail_image(width) output_path = output_dir / f"{input_path.stem}.webp" thumbnail.write_to_file(str(output_path), Q=85) return output_path input_dir = Path("./input") output_dir = Path("./output") output_dir.mkdir(exist_ok=True) files = list(input_dir.glob("*.jpg")) with ThreadPoolExecutor(max_workers=4) as executor: results = executor.map(lambda f: process_image(f, output_dir), files)
ParameterDescriptionDefault--widthTarget width in pixels---heightTarget height in pixels---sizeThumbnail size (square)200--qualityOutput quality (1-100)85--compressionPNG compression (0-9)6--modeResize mode: fit, cover, forcefit--cropCrop strategynone--angleRotation angle in degrees0--sigmaBlur/sharpen radius1.0--opacityWatermark opacity (0-1)0.5--positionWatermark positionbottom-right--workersBatch processing threads4--patternFile glob pattern.--recursiveProcess subdirectoriesfalse
TipDescriptionSequential accessUse access="sequential" for streamingPipeline operationsChain operations before writingParallel processingUse ThreadPoolExecutor for batchesFormat selectionWebP/AVIF for web, JPEG for photosQuality settings85 for quality, 75 for sizeThumbnail vs resizethumbnail_image is faster for downscaling
libvips uses a streaming architecture: Only loads pixels when needed Processes images in small chunks Memory usage independent of image size 10-100x less memory than ImageMagick/PIL for large images
IssueSolution"Cannot find libvips"Install via brew/apt, check PATHSlow processingUse sequential access, check disk I/OMemory errorsIncrease cache, reduce workersFormat not supportedInstall optional dependenciesPoor qualityIncrease quality parameterHEIC not workingInstall libheif: brew install libheifSVG not renderingInstall librsvg: brew install librsvg
IssueSolution"cannot load library 'libvips-42.dll'"Add vips bin\ folder to PATHDLL not found after installRestart terminal/PowerShellwinget install failsUse manual download or scoopPermission deniedRun PowerShell as AdministratorPATH not updatedLog out and log back in, or restart Windows PATH Setup (Manual): # Add to current session $env:PATH = "C:\vips\bin;$env:PATH" # Add permanently (run as Admin or for current user) [Environment]::SetEnvironmentVariable("PATH", "C:\vips\bin;$env:PATH", "User")
IssueSolution"cannot load library 'libvips.42.dylib'"Use ./scripts/run.sh wrapperDYLD_LIBRARY_PATH not workingmacOS SIP blocks env vars; use run.shHomebrew Python issuesUse /opt/homebrew/bin/python3 directly macOS Library Path Setup: # Add to ~/.zshrc or ~/.bashrc export DYLD_LIBRARY_PATH="/opt/homebrew/lib:$DYLD_LIBRARY_PATH"
IssueSolutionPackage not foundCheck distro-specific package nameldconfig issuesRun sudo ldconfig after installPermission deniedUse sudo for system packages
Agent frameworks, memory systems, reasoning layers, and model-native orchestration.
Largest current source with strong distribution and engagement signals.