mirror of
https://github.com/Theodor-Springmann-Stiftung/kgpz_web.git
synced 2025-10-28 16:45:32 +00:00
4.0 KiB
4.0 KiB
Image Compression System
This system provides automatic dual image loading for optimal performance:
- Layout views: Compressed WebP images for fast browsing
- Single page viewer: Full-quality JPEG images for detailed reading
File Structure
pictures/
├── 1771-42-166.jpg # Original high-quality image
├── 1771-42-166-preview.webp # Compressed preview for layouts
├── 1771-42-167.jpg # Original high-quality image
├── 1771-42-167-preview.webp # Compressed preview for layouts
└── ...
How It Works
Backend (Go)
ImageFilestruct includes bothPath(original) andPreviewPath(compressed)- Image registry automatically detects
-preview.webpfiles during initialization - Templates receive both paths for each image
Frontend (Templates)
- Layout views use
<picture>elements with WebP source and JPEG fallback - Single page viewer uses
data-full-imageattribute to load full-quality images - Automatic fallback to original image if preview doesn't exist
Performance Benefits
- 60-80% smaller file sizes for layout browsing
- Additional 75% size reduction from 50% resize for preview images
- Faster page loads with compressed and resized images
- Full quality maintained for detailed viewing
- Progressive enhancement with WebP support detection
Generating WebP Previews
Automatic Generation
Run the provided script to convert all existing images:
./scripts/generate_webp_previews.sh
Manual Generation
For individual files:
# The script automatically calculates 50% dimensions
cwebp -q 75 -m 6 -resize 1200 800 pictures/1771-42-166.jpg -o pictures/1771-42-166-preview.webp
Quality Settings
- Quality: 75% (good balance for text-heavy images)
- Compression: Level 6 (maximum compression)
- Resize: 50% (reduces file size by ~75% additionally)
- Format: WebP (excellent text preservation)
Browser Support
WebP Support
- Chrome/Edge: ✅ Full support
- Firefox: ✅ Full support
- Safari: ✅ Full support (14+)
- Fallback: Automatic JPEG fallback for older browsers
Picture Element
- Modern browsers: ✅ Optimal WebP loading
- Older browsers: ✅ Automatic JPEG fallback
- No JavaScript required
File Size Comparison
Typical compression results for newspaper images:
| Image Type | Original JPEG | WebP Preview (50% + compression) | Total Savings |
|---|---|---|---|
| Text page | 800 KB | 80 KB | 90% |
| Mixed page | 1.2 MB | 120 KB | 90% |
| Image page | 1.5 MB | 190 KB | 87% |
Development Notes
Template Usage
<picture>
{{- if ne $page.PreviewPath "" -}}
<source srcset="{{ $page.PreviewPath }}" type="image/webp">
{{- end -}}
<img src="{{ if ne $page.PreviewPath "" }}{{ $page.PreviewPath }}{{ else }}{{ $page.ImagePath }}{{ end }}"
data-full-image="{{ $page.ImagePath }}"
alt="Page {{ $page.PageNumber }}" />
</picture>
JavaScript Integration
// Single page viewer automatically uses full-quality image
const fullImageSrc = imgElement.getAttribute('data-full-image') || imgElement.src;
viewer.show(fullImageSrc, ...);
Fallback Strategy
- Missing preview: Uses original JPEG
- WebP unsupported: Browser loads JPEG fallback
- File not found: Standard error handling
Monitoring
Check Compression Status
# Count preview files
find pictures -name "*-preview.webp" | wc -l
# Compare total sizes
find pictures -name "*.jpg" -exec du -ch {} + | tail -1
find pictures -name "*-preview.webp" -exec du -ch {} + | tail -1
Regenerate Previews
# Regenerate all previews
./scripts/generate_webp_previews.sh
# Force regeneration (remove existing previews first)
find pictures -name "*-preview.webp" -delete
./scripts/generate_webp_previews.sh