mono/packages/media/docs/cli-resize.md
2025-08-11 12:25:45 +02:00

547 lines
12 KiB
Markdown

# Resize CLI Documentation
The `pm-media resize` command allows you to resize images with precise control over dimensions, quality, and performance. This tool supports batch processing and offers extensive options for scaling, cropping, and format conversion.
## Table of Contents
- [Installation](#installation)
- [Basic Usage](#basic-usage)
- [Resize Methods](#resize-methods)
- [Command Line Options](#command-line-options)
- [API Usage](#api-usage)
- [Examples](#examples)
- [Performance Options](#performance-options)
- [Troubleshooting](#troubleshooting)
## Installation
```bash
npm install @polymech/media
```
## Basic Usage
```bash
pm-media resize --src <input> --dst <output> [resize-options]
```
### Required Parameters
- `--src`: Source files (FILE|FOLDER|GLOB pattern)
### Optional Parameters
- `--dst`: Destination path (defaults to source location)
## Resize Methods
### 1. Percentage-based Resizing
Resize images by a percentage of their original size:
```bash
pm-media resize \
--src "photos/*.jpg" \
--dst "thumbnails/" \
--percent 50
```
### 2. Fixed Width/Height
Resize to specific dimensions:
```bash
pm-media resize \
--src "photos/*.jpg" \
--dst "resized/" \
--width 800 \
--height 600
```
### 3. Width-only or Height-only
Maintain aspect ratio with one dimension:
```bash
# Resize to 1920px width, auto height
pm-media resize \
--src "photos/*.jpg" \
--dst "web/" \
--width 1920
# Resize to 1080px height, auto width
pm-media resize \
--src "photos/*.jpg" \
--dst "web/" \
--height 1080
```
## Command Line Options
### Resize Dimensions
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `--width` | number | - | Target width in pixels |
| `--height` | number | - | Target height in pixels |
| `--percent` | number | - | Resize by percentage (1-100) |
### Minimum Size Constraints
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `--minWidth` | number | - | Don't resize if width below this value |
| `--minHeight` | number | - | Don't resize if height below this value |
| `--minSize` | number | - | Don't resize if file size below this (bytes) |
### Sharp-specific Options
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `--fit` | string | 'cover' | How to fit: cover, contain, fill, inside, outside |
| `--position` | string | 'centre' | Position when using fit: top, bottom, left, right, etc |
| `--background` | string | 'white' | Background color for contain/letterbox |
| `--withoutEnlargement` | boolean | false | Don't enlarge smaller images |
| `--withoutReduction` | boolean | false | Don't reduce larger images |
| `--fastShrinkOnLoad` | boolean | true | Use JPEG/WebP shrink-on-load |
### Common Options
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `--src` | string | required | Source files (FILE\|FOLDER\|GLOB) |
| `--dst` | string | - | Destination path |
| `--dry` | boolean | false | Preview mode (no files written) |
| `--verbose` | boolean | false | Show detailed processing info |
| `--debug` | boolean | false | Enable debug messages |
| `--logLevel` | string | "info" | Log level (warn\|info\|debug\|error) |
## API Usage
### Import the Library
```typescript
import {
resize,
resizeFile,
IResizeOptions
} from '@polymech/media';
```
### Single File Resize
```typescript
import { resizeFile } from '@polymech/media';
// Resize by percentage
await resizeFile(
'input.jpg',
'output.jpg',
() => {}, // onNode callback
{
percent: 50,
logLevel: 'info'
}
);
// Resize to specific dimensions
await resizeFile(
'input.jpg',
'thumbnail.jpg',
() => {},
{
width: 300,
height: 300,
fit: 'cover',
withoutEnlargement: true
}
);
```
### Batch Resize API
```typescript
import { resize } from '@polymech/media';
const options: IResizeOptions = {
src: 'photos/*.jpg',
dst: 'resized/',
width: 1920,
height: 1080,
fit: 'inside',
withoutEnlargement: true,
// ... other IOptions
};
const results = await resize(options);
```
### Advanced Resize Options
```typescript
const advancedOptions: IResizeOptions = {
src: 'raw/*.tiff',
dst: 'processed/',
width: 2048,
height: 1536,
fit: 'cover',
position: 'center',
background: { r: 255, g: 255, b: 255, alpha: 1 },
withoutEnlargement: true,
fastShrinkOnLoad: true,
kernel: 'lanczos3'
};
```
## Examples
### Example 1: Create Thumbnails
```bash
# Generate 150px square thumbnails
pm-media resize \
--src "gallery/*.jpg" \
--dst "thumbs/" \
--width 150 \
--height 150 \
--fit cover \
--withoutEnlargement
```
### Example 2: Web Optimization
```bash
# Optimize for web (max 1920px width)
pm-media resize \
--src "photos/*.jpg" \
--dst "web-optimized/" \
--width 1920 \
--minWidth 800 \
--fit inside \
--withoutEnlargement
```
### Example 3: Percentage-based Batch Resize
```bash
# Reduce all images to 75% of original size
pm-media resize \
--src "archive/**/*.{jpg,png}" \
--dst "compressed/" \
--percent 75
```
### Example 4: Social Media Formats
```bash
# Instagram square format (1080x1080)
pm-media resize \
--src "photos/*.jpg" \
--dst "instagram/" \
--width 1080 \
--height 1080 \
--fit cover \
--position center
# Twitter header (1500x500)
pm-media resize \
--src "headers/*.jpg" \
--dst "twitter/" \
--width 1500 \
--height 500 \
--fit cover
```
### Example 5: Preserve Small Images
```bash
# Don't resize images smaller than 500px width
pm-media resize \
--src "mixed/*.jpg" \
--dst "standardized/" \
--width 1200 \
--minWidth 500 \
--withoutEnlargement
```
### Example 6: File Size Based Resize
```bash
# Only resize files larger than 2MB
pm-media resize \
--src "large/*.jpg" \
--dst "optimized/" \
--percent 60 \
--minSize 2097152
```
### Example 7: Format Conversion with Resize
```bash
# Resize and convert to WebP
pm-media resize \
--src "photos/*.jpg" \
--dst "webp/{SRC_NAME}.webp" \
--width 1920 \
--fit inside
```
## Fit Options Explained
### `cover` (default)
- Crop to fill exact dimensions
- Maintains aspect ratio
- May crop parts of the image
```bash
pm-media resize --src input.jpg --dst output.jpg --width 800 --height 600 --fit cover
```
### `contain`
- Letterbox to fit within dimensions
- Maintains aspect ratio
- No cropping, adds background
```bash
pm-media resize --src input.jpg --dst output.jpg --width 800 --height 600 --fit contain --background white
```
### `fill`
- Stretch to exact dimensions
- Does not maintain aspect ratio
- No cropping
```bash
pm-media resize --src input.jpg --dst output.jpg --width 800 --height 600 --fit fill
```
### `inside`
- Resize to fit within dimensions
- Maintains aspect ratio
- May result in smaller dimensions
```bash
pm-media resize --src input.jpg --dst output.jpg --width 800 --height 600 --fit inside
```
### `outside`
- Resize to cover dimensions
- Maintains aspect ratio
- May result in larger dimensions
```bash
pm-media resize --src input.jpg --dst output.jpg --width 800 --height 600 --fit outside
```
## Position Options
When using `fit: cover` or `fit: contain`, control crop/letterbox position:
- `center` (default)
- `top`, `bottom`, `left`, `right`
- `top left`, `top right`, `bottom left`, `bottom right`
- `north`, `south`, `east`, `west`
- `northeast`, `northwest`, `southeast`, `southwest`
```bash
pm-media resize \
--src portrait.jpg \
--dst cropped.jpg \
--width 800 \
--height 600 \
--fit cover \
--position "top center"
```
## File Format Support
### Supported Input Formats
- JPEG (.jpg, .jpeg)
- PNG (.png)
- WebP (.webp)
- TIFF (.tiff, .tif)
- AVIF (.avif)
- SVG (.svg) - rasterized
- GIF (.gif) - first frame
### Supported Output Formats
Output format determined by destination file extension:
- `.jpg`, `.jpeg` → JPEG
- `.png` → PNG
- `.webp` → WebP
- `.tiff`, `.tif` → TIFF
- `.avif` → AVIF
## Performance Tips
### 1. Fast Shrink-on-Load
```bash
# Use JPEG/WebP built-in scaling (faster for large reductions)
pm-media resize \
--src "huge/*.jpg" \
--dst "thumbnails/" \
--width 300 \
--fastShrinkOnLoad
```
### 2. Batch Processing
```bash
# Process multiple files efficiently
pm-media resize --src "batch/*.jpg" --dst "output/" --percent 50
```
### 3. Prevent Unnecessary Enlargement
```bash
# Don't enlarge small images (saves processing time)
pm-media resize \
--src "mixed/*.jpg" \
--dst "standardized/" \
--width 1920 \
--withoutEnlargement
```
### 4. Size-based Processing
```bash
# Only process large files
pm-media resize \
--src "photos/*.jpg" \
--dst "compressed/" \
--percent 70 \
--minSize 1048576 # 1MB minimum
```
## Troubleshooting
### Common Issues
#### Images appear distorted
```bash
# Maintain aspect ratio with 'inside' or 'cover'
pm-media resize --src input.jpg --dst output.jpg --width 800 --height 600 --fit inside
```
#### Small images getting enlarged
```bash
# Prevent enlargement
pm-media resize --src input.jpg --dst output.jpg --width 1920 --withoutEnlargement
```
#### Poor quality on large reductions
```bash
# Use better kernel for quality
pm-media resize --src input.jpg --dst output.jpg --percent 25 --kernel lanczos3
```
#### Memory issues with large files
```bash
# Use fast shrink for initial reduction
pm-media resize --src huge.jpg --dst smaller.jpg --percent 50 --fastShrinkOnLoad
```
### Debug Mode
Enable detailed logging:
```bash
pm-media resize \
--src "input/*" \
--dst "output/" \
--width 800 \
--debug \
--verbose
```
### File Permissions
Ensure you have:
- Read access to source files
- Write access to destination directory
- Sufficient disk space for output files
## Advanced Usage
### Template Variables
Use template variables in destination paths:
```bash
# Use source filename in destination
pm-media resize \
--src "photos/*.jpg" \
--dst "resized/{SRC_NAME}_resized.jpg" \
--width 1200
```
Available variables:
- `{SRC_NAME}`: Source filename without extension
- `{SRC_EXT}`: Source file extension
- `{SRC_DIR}`: Source directory
### Integration Scripts
```bash
#!/bin/bash
# Multi-size generation script
SIZES=(300 600 1200 1920)
INPUT_DIR="$1"
OUTPUT_BASE="$2"
for size in "${SIZES[@]}"; do
pm-media resize \
--src "$INPUT_DIR/*.jpg" \
--dst "$OUTPUT_BASE/${size}px/" \
--width $size \
--withoutEnlargement \
--fit inside
done
```
### Conditional Processing
```bash
#!/bin/bash
# Only resize if source is larger than target
if [ -f "$1" ]; then
pm-media resize \
--src "$1" \
--dst "$2" \
--width 1920 \
--minWidth 1920 \
--withoutEnlargement
fi
```
## TypeScript Definitions
```typescript
interface IResizeOptionsSharp {
width?: number;
height?: number;
fit?: keyof sharp.FitEnum;
position?: number | string;
background?: sharp.Color;
kernel?: keyof sharp.KernelEnum;
withoutEnlargement?: boolean;
withoutReduction?: boolean;
fastShrinkOnLoad?: boolean;
}
interface IResizeOptions extends IOptions, IResizeOptionsSharp {
percent?: number;
minWidth?: number;
minHeight?: number;
minSize?: number;
}
```
## Contributing
For bug reports, feature requests, or contributions, please visit the project repository.
## License
This tool is part of the @polymech/media package. Please refer to the package license for usage terms.