home / skills / einverne / dotfiles / imagemagick

imagemagick skill

/claude/skills/imagemagick

This skill guides you through ImageMagick command line usage for format conversion, resizing, effects, and batch processing to streamline programmatic image

npx playbooks add skill einverne/dotfiles --skill imagemagick

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
14.8 KB
---
name: imagemagick
description: Guide for using ImageMagick command-line tools to perform advanced image processing tasks including format conversion, resizing, cropping, effects, transformations, and batch operations. Use when manipulating images programmatically via shell commands.
license: MIT
version: 1.0.0
---

# ImageMagick Skill

ImageMagick is a comprehensive, free, open-source software suite for creating, editing, converting, and manipulating images in over 250 formats. This skill covers command-line usage of ImageMagick tools for programmatic image processing.

## When to Use This Skill

Use this skill when:
- Converting images between formats (PNG, JPEG, WebP, GIF, etc.)
- Resizing, cropping, or transforming images
- Applying effects, filters, or adjustments to images
- Creating thumbnails or image previews
- Batch processing multiple images
- Compositing or combining images
- Adding watermarks, borders, or text to images
- Optimizing images for web or print

## Core Concepts

### Primary Commands

ImageMagick provides several command-line tools:

- **magick**: Modern unified command for all operations (ImageMagick v7+)
- **convert**: Legacy command for image conversion and manipulation (still widely used)
- **mogrify**: Modify images in-place (batch processing)
- **identify**: Display image metadata and properties
- **montage**: Create image composites and contact sheets
- **composite**: Overlay images

**Note**: In ImageMagick v7+, `magick` is the recommended command. Legacy `convert` syntax: `convert input.png output.jpg` becomes `magick input.png output.jpg`

### Command Structure

Basic syntax:
```bash
magick [input-options] input-file [operations] [output-options] output-file
```

Operations are applied **left to right** in the order specified.

### Geometry Specifications

ImageMagick uses geometry strings for dimensions:

- `100x100` - Resize to fit within 100×100 (maintains aspect ratio)
- `100x100!` - Force exact size (ignores aspect ratio)
- `100x100^` - Fill 100×100 (may crop, maintains aspect ratio)
- `100x` - Resize to width 100 (auto height)
- `x100` - Resize to height 100 (auto width)
- `50%` - Scale to 50% of original
- `100x100+10+20` - 100×100 region at offset (10, 20)

## Installation

**macOS:**
```bash
brew install imagemagick
```

**Ubuntu/Debian:**
```bash
sudo apt-get install imagemagick
```

**Verify installation:**
```bash
magick -version
# or
convert -version
```

## Common Operations

### Format Conversion

Convert between image formats:

```bash
# PNG to JPEG
magick input.png output.jpg

# JPEG to WebP
magick input.jpg output.webp

# Multiple formats
magick input.png output.jpg output.webp output.gif

# Set JPEG quality (0-100)
magick input.png -quality 85 output.jpg

# Convert with compression
magick input.png -quality 90 -strip output.jpg
```

### Resizing

Resize images while maintaining aspect ratio:

```bash
# Resize to fit within 800×600
magick input.jpg -resize 800x600 output.jpg

# Resize to specific width (auto height)
magick input.jpg -resize 800x output.jpg

# Resize to specific height (auto width)
magick input.jpg -resize x600 output.jpg

# Resize to exact dimensions (ignores aspect ratio)
magick input.jpg -resize 800x600! output.jpg

# Scale by percentage
magick input.jpg -resize 50% output.jpg

# Resize only if larger (shrink only)
magick input.jpg -resize 800x600\> output.jpg

# Resize only if smaller (enlarge only)
magick input.jpg -resize 800x600\< output.jpg
```

### Cropping

Extract portions of images:

```bash
# Crop 400×400 pixels starting at (100, 100)
magick input.jpg -crop 400x400+100+100 output.jpg

# Crop from center
magick input.jpg -gravity center -crop 400x400+0+0 output.jpg

# Remove virtual canvas after crop
magick input.jpg -crop 400x400+100+100 +repage output.jpg

# Crop to aspect ratio from center
magick input.jpg -gravity center -crop 16:9 output.jpg
```

### Resize + Crop (Thumbnail Generation)

Common pattern for creating square thumbnails:

```bash
# Resize to fill 100×100, then crop from center
magick input.jpg -resize 100x100^ -gravity center -extent 100x100 output.jpg

# Alternative using crop
magick input.jpg -resize 275x275^ -gravity center -crop 275x275+0+0 +repage output.jpg

# Create thumbnail with specific background
magick input.jpg -resize 100x100 -background white -gravity center -extent 100x100 output.jpg
```

### Effects and Filters

Apply visual effects:

```bash
# Blur
magick input.jpg -blur 0x8 output.jpg

# Gaussian blur with radius 5, sigma 3
magick input.jpg -gaussian-blur 5x3 output.jpg

# Sharpen
magick input.jpg -sharpen 0x1 output.jpg

# Grayscale
magick input.jpg -colorspace Gray output.jpg

# Sepia tone
magick input.jpg -sepia-tone 80% output.jpg

# Negate (invert colors)
magick input.jpg -negate output.jpg

# Edge detection
magick input.jpg -edge 3 output.jpg

# Emboss
magick input.jpg -emboss 2 output.jpg

# Oil painting effect
magick input.jpg -paint 4 output.jpg

# Charcoal drawing
magick input.jpg -charcoal 2 output.jpg
```

### Adjustments

Modify brightness, contrast, and colors:

```bash
# Adjust brightness (+/- 0-100)
magick input.jpg -brightness-contrast 10x0 output.jpg

# Adjust contrast
magick input.jpg -brightness-contrast 0x20 output.jpg

# Both brightness and contrast
magick input.jpg -brightness-contrast 10x20 output.jpg

# Adjust saturation
magick input.jpg -modulate 100,150,100 output.jpg

# Adjust hue
magick input.jpg -modulate 100,100,120 output.jpg

# Auto level (normalize contrast)
magick input.jpg -auto-level output.jpg

# Auto gamma correction
magick input.jpg -auto-gamma output.jpg

# Normalize (stretch histogram)
magick input.jpg -normalize output.jpg
```

### Rotation and Flipping

Transform image orientation:

```bash
# Rotate 90 degrees clockwise
magick input.jpg -rotate 90 output.jpg

# Rotate 180 degrees
magick input.jpg -rotate 180 output.jpg

# Rotate counter-clockwise
magick input.jpg -rotate -90 output.jpg

# Rotate with background color
magick input.jpg -background white -rotate 45 output.jpg

# Flip vertically
magick input.jpg -flip output.jpg

# Flip horizontally (mirror)
magick input.jpg -flop output.jpg

# Auto-orient based on EXIF
magick input.jpg -auto-orient output.jpg
```

### Borders and Frames

Add borders to images:

```bash
# Add 10px black border
magick input.jpg -border 10x10 output.jpg

# Add border with specific color
magick input.jpg -bordercolor red -border 10x10 output.jpg

# Add frame effect
magick input.jpg -mattecolor gray -frame 10x10+5+5 output.jpg

# Add shadow effect
magick input.jpg \( +clone -background black -shadow 80x3+5+5 \) \
  +swap -background white -layers merge +repage output.jpg
```

### Text and Watermarks

Add text overlays:

```bash
# Add simple text
magick input.jpg -pointsize 30 -fill white -annotate +10+30 "Hello" output.jpg

# Add text with positioning
magick input.jpg -gravity south -pointsize 20 -fill white \
  -annotate +0+10 "Copyright 2025" output.jpg

# Add text with background
magick input.jpg -gravity center -pointsize 40 -fill white \
  -undercolor black -annotate +0+0 "Watermark" output.jpg

# Add semi-transparent watermark
magick input.jpg \( -background none -fill "rgba(255,255,255,0.5)" \
  -pointsize 50 label:"DRAFT" \) -gravity center -compose over -composite output.jpg
```

### Compositing

Combine multiple images:

```bash
# Overlay watermark on image
magick input.jpg watermark.png -gravity southeast -composite output.jpg

# Overlay with transparency
magick input.jpg watermark.png -gravity center \
  -compose over -composite output.jpg

# Tile pattern
magick input.jpg pattern.png -compose over -tile -composite output.jpg

# Side-by-side images
magick input1.jpg input2.jpg +append output.jpg

# Stack images vertically
magick input1.jpg input2.jpg -append output.jpg
```

### Format-Specific Options

Optimize for different formats:

```bash
# JPEG with quality and strip metadata
magick input.png -quality 85 -strip output.jpg

# Progressive JPEG
magick input.png -quality 85 -interlace Plane output.jpg

# PNG with compression level (0-9)
magick input.jpg -quality 95 output.png

# WebP with quality
magick input.jpg -quality 80 output.webp

# WebP lossless
magick input.png -define webp:lossless=true output.webp

# GIF with optimization
magick input.png -colors 256 output.gif

# Transparent background PNG
magick input.jpg -transparent white output.png
```

## Batch Processing

### Using mogrify

Modify multiple files in-place:

```bash
# Convert all JPEGs to PNG in current directory
mogrify -format png *.jpg

# Resize all images in directory
mogrify -resize 800x600 *.jpg

# Apply to output directory (preserves originals)
mogrify -path ./output -resize 800x600 *.jpg

# Batch thumbnail generation
mogrify -path ./thumbnails -resize 275x275^ -gravity center \
  -crop 275x275+0+0 +repage *.jpg

# Batch format conversion with quality
mogrify -path ./optimized -format jpg -quality 85 -strip *.png
```

### Using shell loops

For more complex batch operations:

```bash
# Convert with custom naming
for img in *.jpg; do
  magick "$img" -resize 800x600 "resized_$img"
done

# Multi-step processing
for img in *.jpg; do
  magick "$img" -resize 1920x1080^ -gravity center \
    -crop 1920x1080+0+0 +repage -quality 85 "processed_$img"
done

# Different output format
for img in *.png; do
  magick "$img" -quality 90 "${img%.png}.jpg"
done
```

## Image Information

### Using identify

Get image metadata:

```bash
# Basic info
identify image.jpg

# Detailed information
identify -verbose image.jpg

# Format only
identify -format "%f: %wx%h %b\n" image.jpg

# Specific attributes
identify -format "%f: %wx%h, %[colorspace], %[type]\n" image.jpg

# File size
identify -format "%f: %b\n" image.jpg

# Multiple images
identify *.jpg
```

### Common format strings

- `%f` - filename
- `%w` - width
- `%h` - height
- `%b` - file size
- `%[colorspace]` - colorspace
- `%[type]` - image type
- `%[channels]` - number of channels
- `%[depth]` - bit depth

## Advanced Techniques

### Creating Contact Sheets

Use montage:

```bash
# Basic grid
montage *.jpg -geometry 200x200+2+2 contact-sheet.jpg

# With labels
montage *.jpg -geometry 200x200+2+2 -label '%f' contact-sheet.jpg

# Custom layout (3 columns)
montage *.jpg -tile 3x -geometry 200x200+5+5 contact-sheet.jpg
```

### Animated GIFs

Create animations:

```bash
# Create GIF from images
magick -delay 100 -loop 0 frame*.png animated.gif

# Optimize GIF
magick animated.gif -fuzz 5% -layers Optimize optimized.gif

# Extract frames from GIF
magick animated.gif frame_%03d.png
```

### Complex Pipelines

Chain multiple operations:

```bash
# Resize, crop, add border, adjust brightness
magick input.jpg \
  -resize 1000x1000^ \
  -gravity center \
  -crop 1000x1000+0+0 +repage \
  -bordercolor black -border 5x5 \
  -brightness-contrast 5x10 \
  -quality 90 \
  output.jpg

# Create thumbnail with watermark
magick input.jpg \
  -resize 400x400^ \
  -gravity center \
  -extent 400x400 \
  \( watermark.png -resize 100x100 \) \
  -gravity southeast -geometry +10+10 \
  -composite \
  output.jpg
```

## Performance Optimization

### Memory and Speed

```bash
# Limit memory usage (useful for large images)
magick -limit memory 2GB -limit map 4GB input.jpg -resize 50% output.jpg

# Set thread count
magick -limit thread 4 input.jpg -resize 50% output.jpg

# Use streaming for large files
magick -define stream:buffer-size=0 huge.jpg -resize 50% output.jpg
```

### Quality vs Size Trade-offs

```bash
# High quality (larger file)
magick input.jpg -quality 95 output.jpg

# Balanced (recommended for web)
magick input.jpg -quality 85 -strip output.jpg

# Lower quality (smaller file)
magick input.jpg -quality 70 -sampling-factor 4:2:0 -strip output.jpg

# Progressive JPEG (better for web)
magick input.jpg -quality 85 -interlace Plane -strip output.jpg
```

## Common Patterns

### Avatar/Profile Picture Generation

```bash
# Square thumbnail from any aspect ratio
magick input.jpg -resize 200x200^ -gravity center -extent 200x200 avatar.jpg

# Circular avatar (PNG with transparency)
magick input.jpg -resize 200x200^ -gravity center -extent 200x200 \
  \( +clone -threshold -1 -negate -fill white -draw "circle 100,100 100,0" \) \
  -alpha off -compose copy_opacity -composite avatar.png
```

### Responsive Images

```bash
# Generate multiple sizes
for size in 320 640 1024 1920; do
  magick input.jpg -resize ${size}x -quality 85 "output-${size}w.jpg"
done
```

### Watermarking

```bash
# Bottom-right watermark
magick input.jpg watermark.png -gravity southeast \
  -geometry +10+10 -composite output.jpg

# Tiled watermark
magick input.jpg \( watermark.png -alpha set -channel A \
  -evaluate multiply 0.3 +channel \) -tile -composite output.jpg
```

## Error Handling

Common issues and solutions:

**File not found:**
```bash
# Check file exists
[ -f input.jpg ] && magick input.jpg output.png || echo "File not found"
```

**Invalid geometry:**
```bash
# Validate dimensions first
identify -format "%wx%h" input.jpg
```

**Memory errors:**
```bash
# Limit resources
magick -limit memory 1GB -limit map 2GB input.jpg output.png
```

## Best Practices

1. **Always use `-strip`** to remove metadata (reduces file size)
2. **Set appropriate quality** (85 for JPEG is good balance)
3. **Use `+repage`** after crop to reset virtual canvas
4. **Quote file paths** with spaces: `"my image.jpg"`
5. **Test on sample** before batch processing
6. **Backup originals** when using mogrify
7. **Use `-auto-orient`** to respect EXIF orientation
8. **Progressive JPEGs** for web (use `-interlace Plane`)
9. **Limit memory** for large batches to prevent crashes
10. **Check output** after complex operations

## Troubleshooting

### Policy Restrictions

Some systems restrict ImageMagick operations for security:

```bash
# Check policy
identify -list policy

# Edit policy file (if needed)
sudo nano /etc/ImageMagick-6/policy.xml
# or
sudo nano /etc/ImageMagick-7/policy.xml
```

### Common Errors

**"convert: not authorized"**
- ImageMagick security policy blocking operation
- Edit policy.xml to allow specific formats/operations

**"convert: no decode delegate"**
- Missing format support library
- Install additional libraries (libjpeg, libpng, libwebp, etc.)

**"convert: memory allocation failed"**
- Image too large or insufficient memory
- Use `-limit` flags or process in smaller chunks

## Resources

- Official Documentation: https://imagemagick.org/
- Command-line Options: https://imagemagick.org/script/command-line-options.php
- Examples: https://imagemagick.org/Usage/
- Format Support: https://imagemagick.org/script/formats.php

## Command Reference Quick Guide

**Format Conversion:**
```bash
magick input.ext output.ext
```

**Resize:**
```bash
magick input.jpg -resize WIDTHxHEIGHT output.jpg
```

**Crop:**
```bash
magick input.jpg -crop WIDTHxHEIGHT+X+Y output.jpg
```

**Thumbnail:**
```bash
magick input.jpg -resize 100x100^ -gravity center -extent 100x100 thumb.jpg
```

**Effects:**
```bash
magick input.jpg -blur 0x8 output.jpg
```

**Batch:**
```bash
mogrify -resize 800x600 *.jpg
```

**Info:**
```bash
identify -verbose image.jpg
```

Overview

This skill teaches practical, command-line usage of ImageMagick for advanced, scriptable image processing tasks. It focuses on magick/mogrify/identify workflows to convert formats, resize/crop, apply effects, composite images, and run efficient batch jobs. Examples and patterns emphasize safe, repeatable commands suitable for automation and dotfiles-based tooling.

How this skill works

Commands are built around the magick unified entrypoint (ImageMagick v7+) and legacy tools like mogrify and identify. Operations are applied left-to-right; inputs, operations, and output options compose a single command. Use mogrify for in-place batch changes, magick for multi-step pipelines, and identify to inspect metadata and validate images before processing.

When to use it

  • Converting image formats (PNG, JPEG, WebP, GIF) for web or archives
  • Generating thumbnails, avatars, and responsive image sets
  • Resizing, cropping, rotating, or auto-orienting images in scripts
  • Adding watermarks, text overlays, borders, or shadows
  • Batch processing large photo sets with controlled memory limits
  • Creating contact sheets, animated GIFs, or composite layouts

Best practices

  • Prefer magick (v7+) and quote paths that contain spaces
  • Use -strip and quality ~85 for web-optimized JPEGs
  • Test commands on samples before running batch jobs with mogrify
  • Backup originals or use mogrify -path to preserve inputs
  • Use +repage after crop to reset virtual canvas and -auto-orient for EXIF
  • Limit memory and threads (-limit memory/map/thread) for large batches

Example use cases

  • Generate square avatars: resize to fill and center-crop then extent to exact size
  • Produce responsive images: loop to create 320/640/1024/1920 widths with quality 85
  • Apply semi-transparent watermark across a photo set using a shell loop
  • Create an animated GIF from a sequence of frames and optimize with -layers Optimize
  • Batch convert and optimize PNGs to progressive JPEGs for a static site build

FAQ

Which command should I use for most tasks?

Use magick for new scripts (ImageMagick v7+). Use mogrify for in-place batch changes and identify to inspect files.

How do I avoid out-of-memory errors on large batches?

Set resource limits with -limit memory and -limit map, reduce threads (-limit thread), and process files in smaller chunks.