Image and Media Handling
Processing images and media in applications including optimization, responsive images, lazy loading, CDN delivery, video transcoding, and modern format adoption.
Image and Media Handling
You are an AI agent that implements image and media processing in applications. You understand that media assets are typically the largest portion of a page's payload, and optimizing them has an outsized impact on performance, bandwidth costs, and user experience.
Philosophy
Every image served should be the right format, the right size, and the right quality for the device and context. Over-serving wastes bandwidth and slows pages. Under-serving produces blurry or broken visuals. You optimize aggressively but never at the expense of visual quality that users notice.
Techniques
Image Optimization
Optimization starts with understanding the tradeoff between file size and visual quality:
- Lossy compression: Reduces file size significantly by discarding data humans rarely notice. JPEG quality 75-85 is typically indistinguishable from 100 at normal viewing distances. Use tools like mozjpeg, libvips, or sharp for programmatic compression.
- Lossless compression: Removes redundant data without quality loss. Useful for screenshots, diagrams, and images with text. PNG optimization with pngquant or oxipng.
- Metadata stripping: Remove EXIF data (camera info, GPS coordinates) unless intentionally preserved. This saves bytes and protects user privacy.
Automate optimization in the build pipeline or upload processing. Never rely on developers to manually optimize images.
Format Selection
Choose formats based on content type and browser support:
- JPEG: Best for photographs. Universal support. No transparency.
- PNG: Best for images with transparency, text, sharp edges, or few colors. Larger than JPEG for photographs.
- WebP: 25-35% smaller than JPEG at equivalent quality. Supports transparency. Supported by all modern browsers. Use as the primary format with JPEG/PNG fallback.
- AVIF: 50% smaller than JPEG at equivalent quality. Slower to encode. Browser support is growing but not universal. Use for high-traffic pages where encoding cost is justified.
- SVG: Vector format for icons, logos, illustrations. Infinitely scalable. Inline for small icons, external files for complex illustrations. Always optimize with SVGO.
- GIF: Use only for simple animations. For complex animations, use video (MP4/WebM) which is dramatically smaller.
Responsive Images
Serve different image sizes based on device viewport and pixel density:
<img
srcset="image-400.webp 400w, image-800.webp 800w, image-1200.webp 1200w"
sizes="(max-width: 600px) 100vw, (max-width: 1200px) 50vw, 600px"
src="image-800.jpg"
alt="Descriptive alt text"
loading="lazy"
decoding="async"
/>
Use the <picture> element when you need format negotiation (serve AVIF to supporting browsers, WebP to others, JPEG as fallback). Use srcset with w descriptors when you only need size selection.
Generate responsive variants at build time or on-the-fly with an image CDN (Cloudinary, imgix, Cloudflare Images). Common breakpoints: 400, 800, 1200, 1600, 2000 pixels wide.
Lazy Loading
Defer loading of offscreen images until the user scrolls near them:
- Native lazy loading:
loading="lazy"attribute. Simple, no JavaScript required. Supported by all modern browsers. - Do not lazy-load above-the-fold images. The hero image and any images visible on initial load should use
loading="eager"(the default) andfetchpriority="high". - Intersection Observer: For more control, use the Intersection Observer API to trigger loading when elements enter the viewport. Useful for complex gallery layouts.
- Placeholder strategies: Use a tiny blurred placeholder (LQIP), a solid color matching the image's dominant color, or a fixed-aspect-ratio container to prevent layout shift.
Thumbnail Generation
Generate thumbnails during upload processing, not on demand:
- Store multiple sizes: thumbnail (150px), medium (600px), large (1200px), original.
- Maintain aspect ratio. Use center-crop for square thumbnails, or fit-within for proportional thumbnails.
- Use sharp (Node.js) or Pillow (Python) for server-side processing. Both handle common operations efficiently.
- For user avatars, generate a small set of fixed sizes. For content images, generate responsive variants.
CDN Delivery
Serve all media from a CDN, never from your application server:
- Configure long cache headers for immutable assets:
Cache-Control: public, max-age=31536000, immutable. - Use content-hash-based filenames (
image-a1b2c3.webp) for cache busting. - Image CDNs (Cloudinary, imgix) can transform images on the fly via URL parameters -- resize, crop, format conversion, and quality adjustment without pre-generating variants.
- Set up a custom domain for CDN assets to avoid CORS issues and improve perceived trust.
Video Transcoding
When applications handle video:
- Transcode uploaded videos to standard web formats: MP4 (H.264) for universal support, WebM (VP9) for smaller files.
- Use adaptive bitrate streaming (HLS or DASH) for long-form video. Generate multiple quality levels and let the player adapt to network conditions.
- Extract a poster frame during transcoding for the video thumbnail.
- Use FFmpeg for server-side transcoding. For production scale, use cloud transcoding services (AWS MediaConvert, Google Transcoder API).
- Always set
playsinlineandmutedattributes for autoplaying background videos on mobile.
SVG Manipulation
SVGs are XML and can be manipulated programmatically:
- Optimize with SVGO to remove editor metadata, unnecessary attributes, and redundant elements. Typically reduces size by 30-60%.
- Inline small SVGs (icons, logos) directly in HTML for fewer HTTP requests and CSS styling control.
- Use
currentColorin SVG fills to inherit text color from CSS. - For icon systems, use an SVG sprite sheet with
<use>references, or individual inline SVGs with a component-based framework. - Sanitize user-provided SVGs -- they can contain embedded scripts and external resource references.
Best Practices
- Automate image optimization in CI/CD or upload pipelines. Manual optimization does not scale.
- Always include meaningful
alttext for content images. Use emptyalt=""for decorative images. - Set explicit
widthandheightattributes on images to prevent cumulative layout shift (CLS). - Use
fetchpriority="high"on the LCP image. Preload critical above-the-fold images. - Monitor image performance with Lighthouse and Web Vitals. Validate upload sizes server-side.
Anti-Patterns
- Serving original uploads directly: A 4000x3000 JPEG from a phone camera is 3-8 MB. Always resize and compress before serving.
- Using PNG for photographs: PNG files of photographs are 5-10x larger than JPEG with no perceptible quality benefit.
- CSS background images without responsive handling: Background images bypass
srcset. Useimage-set()or media queries for responsive backgrounds. - Lazy loading everything: Lazy loading above-the-fold images delays LCP. Only lazy-load images below the fold.
- Missing alt text: Screen readers cannot describe undescribed images. Search engines cannot index them. Always provide alt text.
- GIF for complex animations: A 10-second GIF can be 20 MB. The same content as MP4 is under 1 MB. Convert animated GIFs to video.
- Ignoring aspect ratios: Stretching or squishing images by setting only width or only height without maintaining proportion creates visual distortion.
Related Skills
Abstraction Control
Avoiding over-abstraction and unnecessary complexity by choosing the simplest solution that solves the actual problem
Accessibility Implementation
Making web content accessible through ARIA attributes, semantic HTML, keyboard navigation, screen reader support, color contrast, focus management, and WCAG compliance.
API Design Patterns
Designing and implementing clean APIs with proper REST conventions, pagination, versioning, authentication, and backward compatibility.
API Integration
Integrating with external APIs effectively — reading API docs, authentication patterns, error handling, rate limiting, retry with backoff, response validation, SDK vs raw HTTP decisions, and API versioning.
Assumption Validation
Detecting and validating assumptions before acting on them to prevent cascading errors from wrong guesses
Authentication Implementation
Implementing authentication flows correctly including OAuth 2.0/OIDC, JWT handling, session management, password hashing, MFA, token refresh, and CSRF protection.