Skip to content

Format Conversion ​

imgx makes it easy to convert images between different formats, helping you adopt modern formats like WebP and AVIF for better web performance.

Supported Conversions ​

imgx supports conversion between all major image formats:

  • JPEG/JPG → WebP, AVIF, PNG
  • PNG → WebP, AVIF, JPEG
  • WebP → JPEG, PNG, AVIF
  • AVIF → WebP, JPEG, PNG
  • GIF → WebP (animated), APNG, MP4

Benefits of Modern Formats ​

FormatBenefitsBrowser Support
WebP25-35% smaller than JPEG/PNG with similar qualityChrome, Firefox, Edge, Safari 14+
AVIF50%+ smaller than JPEG with better qualityChrome, Firefox 92+, Edge
JPEG XL60%+ smaller with superior qualityLimited (experimental)

Basic Usage ​

CLI ​

bash
# Convert a single image to WebP
imgx convert image.jpg --format webp

# Convert an image to AVIF with specific quality
imgx convert image.jpg --format avif --quality 75

# Convert and specify output path
imgx convert image.jpg --format webp --output images/image.webp

# Convert multiple images using glob pattern
imgx convert "images/*.jpg" --format webp --output-dir converted/

JavaScript/TypeScript API ​

ts
import { convert } from '@stacksjs/imgx'

// Basic conversion
await convert('path/to/image.jpg', {
  format: 'webp',
})

// With custom options
await convert('path/to/image.jpg', {
  format: 'avif',
  quality: 75,
  output: 'path/to/output.avif',
  lossless: false,
  effort: 7,
})

Format-Specific Options ​

WebP Options ​

ts
await convert('image.jpg', {
  format: 'webp',
  quality: 80, // 0-100
  lossless: false, // true for lossless compression
  effort: 5, // 0-6, higher = better compression but slower
  smartSubsample: true, // Reduces color artifacts
})

AVIF Options ​

ts
await convert('image.jpg', {
  format: 'avif',
  quality: 65, // 0-100, typically lower values work well for AVIF
  lossless: false,
  effort: 7, // 0-10, higher = better compression but slower
})

JPEG Options ​

ts
await convert('image.png', {
  format: 'jpeg',
  quality: 85,
  progressive: true, // Enable progressive loading
  optimizeCoding: true, // Optimize Huffman tables
  mozjpeg: true, // Use mozjpeg for better compression
  chromaSubsampling: '4:2:0', // Chroma subsampling level
})

PNG Options ​

ts
await convert('image.jpg', {
  format: 'png',
  compressionLevel: 9, // 0-9, higher = better compression but slower
  palette: true, // Convert to palette-based PNG if possible
  adaptiveFiltering: true, // Optimize PNG filtering
})

Batch Conversion ​

You can convert multiple images at once with the batch command:

bash
# Convert all JPGs in a directory to WebP
imgx batch ./images --formats webp --quality 80

# Convert to multiple formats with custom quality per format
imgx batch ./images --formats webp,avif --quality.webp 80 --quality.avif 65

Or programmatically:

ts
import { batchProcess } from '@stacksjs/imgx'

await batchProcess('./images/**/*.{jpg,png}', {
  formats: ['webp', 'avif'],
  quality: {
    webp: 80,
    avif: 65,
  },
  outputDir: './optimized',
})

Advanced Usage ​

Custom Filenames ​

You can customize how the converted filenames are generated:

bash
# Add a suffix to the filename
imgx convert image.jpg --format webp --filename-suffix '-optimized'

# Add a prefix to the filename
imgx convert image.jpg --format webp --filename-prefix 'web-'

Or using the API:

ts
await convert('image.jpg', {
  format: 'webp',
  filenamePrefix: 'web-',
  filenameSuffix: '-optimized',
})

Preserving Metadata ​

By default, imgx strips metadata during conversion to reduce file size. You can preserve it if needed:

bash
imgx convert image.jpg --format webp --preserve-metadata
ts
await convert('image.jpg', {
  format: 'webp',
  preserveMetadata: true,
})

Converting Animated Images ​

imgx can convert animated GIFs to animated WebP or APNG:

bash
# Convert animated GIF to animated WebP
imgx convert animation.gif --format webp

# Convert animated GIF to APNG
imgx convert animation.gif --format png

Fallbacks for Browser Compatibility ​

When using modern formats like WebP or AVIF, you might need fallbacks for older browsers. imgx can help generate HTML with the appropriate <picture> element:

bash
imgx convert image.jpg --format webp,avif --generate-html

This will produce HTML similar to:

html
<picture>
  <source type="image/avif" srcset="image.avif">
  <source type="image/webp" srcset="image.webp">
  <img src="image.jpg" alt="Image description" width="800" height="600">
</picture>

Configuration ​

You can set default conversion options in your imgx.config.ts file:

ts
// imgx.config.ts
export default {
  conversion: {
    quality: 80,
    lossless: false,
    progressive: true,
    filenamePrefix: '',
    filenameSuffix: '',
    preserveMetadata: false,
    optimizationLevel: 6,
    effort: 6,
    chromaSubsampling: '4:2:0',
    smartSubsample: true,
  },
}

Released under the MIT License.