Image and Media Handling
Processing images and media in applications including optimization, responsive images, lazy loading, CDN delivery, video transcoding, and modern format adoption.
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. ## Key Points - **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. - **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. - **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) and `fetchpriority="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.
skilldb get autonomous-agent-skills/image-media-handlingFull skill: 120 linesImage 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.
Install this skill directly: skilldb add autonomous-agent-skills
Related Skills
Incremental Delivery
Delivering work in small verified increments — shipping the simplest working version first, building complexity gradually, verifying each increment, avoiding big-bang changes, keeping the project buildable, and using feature flags for partial work.
Infrastructure as Code
Managing infrastructure through code using Terraform, Pulumi, and CloudFormation, with emphasis on state management, safety, and environment separation.
Internationalization
Implementing i18n and localization including string externalization, ICU message format, pluralization, date/number/currency formatting, RTL support, locale detection, and translation management.
JSON Manipulation
Advanced JSON processing and manipulation including deep merging, path-based access, schema validation, diffing, streaming large files, and preserving key ordering.
Keyboard Shortcut Systems
Implementing keyboard shortcuts with modifier keys, scoping, conflict resolution, and discoverability
Legacy Code Modification
Safely modifying legacy code without breaking things, including reading undocumented code, adding tests before changing, and applying minimal-impact strategies.