Image Compression
Overview
The image compression module automatically optimizes uploaded images before they are stored or printed. This ensures consistent file sizes and faster upload/download times.
Default Settings
| Parameter | Default Value | Description |
|---|---|---|
maxWidth | 800px | Maximum image width |
maxHeight | 800px | Maximum image height |
quality | 0.7 (70%) | JPEG compression quality |
maxSizeBytes | 500KB (512,000 bytes) | Target maximum file size |
API Functions
| Function | Parameters | Returns | Description |
|---|---|---|---|
compressImage(file, options?) | File/Blob, optional CompressOptions | Promise<Blob> | Compress image with options |
fileToDataUrl(file) | File/Blob | Promise<string> | Convert file to base64 data URL |
compressAndConvertToDataUrl(file, options?) | File/Blob, optional CompressOptions | Promise<string> | Compress and return data URL |
resizeDataUrl(dataUrl, maxWidth?, maxHeight?) | dataUrl string, optional dimensions | Promise<string> | Resize existing data URL |
Compression Algorithm
- Load image into memory
- Calculate resize ratio if dimensions exceed maxWidth/maxHeight
- Draw to canvas at target dimensions
- Export as JPEG blob at specified quality
- If result exceeds maxSizeBytes, recursively reduce quality by 0.1
Usage Locations
- Image Upload:
apps/web/routes/image-upload.tsx- compresses before session storage - Gallery Selection: Compresses selected images before storing
- Final Generation: CollageProvider uses for preparing print output
Code Reference
- Library:
apps/web/lib/image-compression.ts - Integration: Used by
providers/collage-provider.tsxfor final image generation
Configuration Options
interface CompressOptions {
maxWidth?: number; // Max width in pixels
maxHeight?: number; // Max height in pixels
quality?: number; // 0.0 to 1.0
maxSizeBytes?: number; // Target max file size
}
Key Implementation Details
- Uses HTML5 Canvas API for resizing
- Recursive quality reduction ensures target size is met (minimum quality: 0.1)
- Supports both File objects (from input) and Blob objects
- Output format is always JPEG for optimal compression