547 lines
12 KiB
Markdown
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.
|
|
|