Nerif Image Compression Service
Nerif provides intelligent image compression functionality that automatically compresses images exceeding a specified size (default 1MB) using lossless compression strategies whenever possible.
Features
- Intelligent Compression Algorithms: Selects optimal compression strategy based on image format and content
- Lossless Optimization: Prioritizes lossless compression techniques
- Format Conversion: Intelligently converts image formats when beneficial (e.g., PNG → JPEG)
- Transparency Protection: Automatically detects and preserves transparency in images
- Batch Processing: Supports batch compression of multiple images
- Metadata Preservation: Optionally preserves EXIF and other metadata
- Command Line Tool: Provides an easy-to-use command line interface
Installation
Image compression functionality requires additional dependencies:
pip install nerif[image]
# Or manually install dependencies
pip install Pillow
Quick Start
Basic Usage
from nerif.utils import compress_image_simple
# Simple compression (if image exceeds 1MB)
was_compressed = compress_image_simple("large_photo.jpg")
if was_compressed:
print("Image compressed successfully")
Advanced Usage
from nerif.utils import ImageCompressor
# Create custom compressor
compressor = ImageCompressor(
size_threshold_mb=2.0, # 2MB threshold
jpeg_quality=90, # JPEG quality
png_compress_level=9, # PNG compression level
convert_to_jpeg_threshold=0.7 # Conversion threshold
)
# Compress single image
was_compressed, ratio, message = compressor.compress_image(
"input.png",
"output.jpg"
)
print(f"Compression result: {message}")
print(f"Compression ratio: {ratio:.2f}x")
Compression Strategies
PNG Images
- Lossless Optimization: Uses maximum compression level for lossless compression
- Format Conversion: Converts to JPEG if no transparency and significant size reduction
- Transparency Protection: Automatically detects transparency; PNG format preserved if present
JPEG Images
- Quality Optimization: Adjusts JPEG quality to reduce file size
- Progressive Encoding: Enables progressive JPEG for improved loading experience
- Metadata Optimization: Optionally preserves or removes EXIF data
Other Formats
- Automatically converts to the most suitable format (PNG or JPEG)
- Chooses target format based on transparency presence
Batch Compression
from nerif.utils import ImageCompressor
compressor = ImageCompressor(size_threshold_mb=1.0)
# Batch compression
image_files = ["photo1.jpg", "photo2.png", "diagram.png"]
results = compressor.compress_batch(
image_files,
output_dir="compressed/", # Output directory
preserve_structure=True # Preserve directory structure
)
# View results
for path, was_compressed, ratio, message in results:
print(f"{path}: {message}")
# Get statistics
stats = compressor.get_compression_stats(results)
print(f"Compressed {stats['compressed_files']} files")
print(f"Average compression ratio: {stats['average_compression_ratio']:.2f}x")
Command Line Tool
# Basic usage
python -m nerif.cli.compress_image image.jpg
# Custom threshold
python -m nerif.cli.compress_image *.png --threshold 2.0
# Batch compression to output directory
python -m nerif.cli.compress_image photos/*.jpg -o compressed/
# Adjust compression parameters
python -m nerif.cli.compress_image photo.jpg --jpeg-quality 95 --png-level 9
# Preview mode (no actual compression)
python -m nerif.cli.compress_image images/* --dry-run
# Verbose output
python -m nerif.cli.compress_image images/* --verbose
Command Line Options
-o, --output
: Output path (file or directory)-t, --threshold
: Compression threshold (MB, default 1.0)--jpeg-quality
: JPEG quality (1-100, default 85)--png-level
: PNG compression level (0-9, default 9)--convert-threshold
: PNG to JPEG threshold (default 0.7)--no-preserve-metadata
: Do not preserve metadata--dry-run
: Preview mode-v, --verbose
: Verbose output
Configuration Options
ImageCompressor Parameters
compressor = ImageCompressor(
size_threshold_mb=1.0, # Compression threshold (MB)
jpeg_quality=85, # JPEG quality (1-100)
png_compress_level=9, # PNG compression level (0-9)
convert_to_jpeg_threshold=0.7 # PNG→JPEG conversion threshold
)
- size_threshold_mb: Only compress images exceeding this size
- jpeg_quality: JPEG compression quality; lower values mean smaller files but lower quality
- png_compress_level: PNG compression level; 9 is maximum compression
- convert_to_jpeg_threshold: Convert if PNG→JPEG saves more than this ratio of space
Example Scenarios
Website Image Optimization
from nerif.utils import ImageCompressor
# Optimize images for web
web_compressor = ImageCompressor(
size_threshold_mb=0.5, # 500KB threshold
jpeg_quality=80, # Medium quality
convert_to_jpeg_threshold=0.8 # More aggressive conversion
)
# Process uploaded images
results = web_compressor.compress_batch(
["upload1.png", "upload2.jpg"],
output_dir="optimized/"
)
Archive Image Compression
# Optimize for long-term storage
archive_compressor = ImageCompressor(
size_threshold_mb=2.0, # 2MB threshold
jpeg_quality=95, # High quality preservation
png_compress_level=9 # Maximum lossless compression
)
Mobile Image Optimization
# Optimize for mobile devices
mobile_compressor = ImageCompressor(
size_threshold_mb=0.2, # 200KB threshold
jpeg_quality=75, # Lower quality for smaller files
convert_to_jpeg_threshold=0.9 # Almost always convert to JPEG
)
Best Practices
-
Choose Appropriate Thresholds:
- Website images: 0.5-1MB
- Mobile applications: 0.2-0.5MB
- Archive purposes: 2-5MB
-
JPEG Quality Settings:
- Network transmission: 70-85
- General purpose: 85-90
- High-quality preservation: 90-95
-
Batch Processing:
- Use
preserve_structure=True
to maintain directory structure - Set appropriate output directory to avoid overwriting original files
- Check compression statistics to evaluate effectiveness
- Use
-
Transparency Handling:
- PNG images with transparency are automatically protected
- PNG without transparency may be converted to JPEG
- Use
convert_to_jpeg_threshold
to control conversion strategy
-
Metadata Handling:
- EXIF data is preserved by default
- Consider removing for web publishing to reduce file size
- Use
preserve_metadata=False
to remove metadata
Technical Details
Supported Formats
- Input: JPEG, PNG, BMP, TIFF, WebP, and other PIL-supported formats
- Output: Primarily JPEG and PNG, automatically selected based on content
Compression Algorithms
- PNG: Uses PIL's
optimize=True
and configurablecompress_level
- JPEG: Uses configurable
quality
andprogressive=True
- Format Conversion: Intelligently selects format based on file size comparison
Performance Considerations
- Large image processing may require significant memory
- Batch processing handles images sequentially to avoid memory peaks
- Compression is CPU-intensive and may take time
Error Handling
- Throws exceptions for non-existent or corrupted files
- Single file errors don't affect other files in batch processing
- Provides detailed error messages and compression results
Integration with Nerif Workflow
from nerif.core import nerif
from nerif.utils import compress_image_simple
# Compress image before LLM processing
def process_image_with_llm(image_path):
# First compress the image
compress_image_simple(image_path, size_threshold_mb=1.0)
# Then use LLM processing
if nerif(f"Is the image file {image_path} optimized?"):
print("Image is optimized and ready to use")
return image_path
This image compression service helps you automatically optimize image files, reducing storage space and transmission time while maintaining the best possible image quality.