packavif
v1.0.0
Published
Convert images to AVIF format with optimized compression
Maintainers
Readme
Pack AVIF
Convert images to AVIF format with optimized compression while maintaining high quality. This package provides an easy-to-use interface for converting both single images and entire directories of images to the AVIF format.
Features
- High-quality AVIF conversion using Sharp
- Configurable quality and compression settings
- Batch processing for directories
- Detailed conversion statistics
- Support for JPG, JPEG, and PNG input formats
- Promise-based async/await API
- Recursive directory processing
- Progress tracking for batch operations
Installation
npm install packavifUsage
Converting a Single Image
import { AvifConverter } from 'packavif';
// Initialize with default options
const converter = new AvifConverter();
// Convert a single image
try {
const result = await converter.convertImage('input.jpg', 'output.avif');
console.log('Conversion successful:', result);
console.log(`Compression ratio: ${result.compressionRatio.toFixed(2)}%`);
} catch (error) {
console.error('Conversion failed:', error);
}Converting a Directory of Images
// Convert all images in a directory
const results = await converter.convertDirectory(
'input-directory',
'output-directory',
'**/*.{jpg,jpeg,png}' // Optional glob pattern
);
// Print summary
const totalSaved = results.reduce((acc, r) => acc + (r.inputSize - r.outputSize), 0);
console.log(`Total space saved: ${(totalSaved / 1024 / 1024).toFixed(2)} MB`);Custom Configuration
const converter = new AvifConverter({
quality: 80, // 1-100 (default: 80)
speed: 5, // 0-8, lower is slower but better quality (default: 5)
chromaSubsampling: '4:4:4' // '4:4:4' or '4:2:0' (default: '4:4:4')
});API Reference
Class: AvifConverter
Constructor Options
| Option | Type | Default | Description | |--------|------|---------|-------------| | quality | number | 80 | AVIF quality (1-100) | | speed | number | 5 | Encoding speed (0-8) | | chromaSubsampling | string | '4:4:4' | Chroma subsampling ratio |
Methods
convertImage(inputPath: string, outputPath: string): Promise<ConversionResult>
Converts a single image to AVIF format.
Returns an object with:
inputPath: Original image pathoutputPath: Converted image pathinputSize: Original file size in bytesoutputSize: Converted file size in bytescompressionRatio: Percentage of size reductionduration: Processing time in seconds
convertDirectory(inputDir: string, outputDir: string, pattern?: string): Promise<ConversionResult[]>
Converts all matching images in a directory to AVIF format.
Parameters:
inputDir: Source directory pathoutputDir: Destination directory pathpattern: Optional glob pattern (default:**/*.{jpg,jpeg,png})
Returns an array of ConversionResult objects.
Performance Tips
Quality Settings:
- Use quality 80-90 for high-quality images
- Use quality 60-75 for web optimization
- Use quality 40-60 for thumbnail generation
Speed Settings:
- Use speed 0-3 for maximum quality
- Use speed 4-6 for balanced results
- Use speed 7-8 for fastest conversion
Memory Usage:
- Process large batches in smaller chunks
- Monitor memory usage when processing many files
Requirements
- Node.js 14.x or higher
- Sharp dependencies (automatically installed)
Common Issues
Installation Fails:
# If Sharp installation fails, try: npm install --platform=linux --arch=x64 sharpMemory Issues:
// Limit concurrent processing: const converter = new AvifConverter({ maxConcurrency: 4 // Process 4 files at a time });
Contributing
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
