A single unoptimized image can weigh more than an entire webpage's HTML, CSS, and JavaScript combined. A 12-megapixel photo straight from a phone camera is 3-8MB as JPG, 15-25MB as PNG, and 36MB as BMP. Multiply that by 10 product images on an e-commerce page and you've got a page that takes 8 seconds to load on a mobile connection.

The good news: most images can be reduced by 50-90% without any visible quality difference. The key is understanding the quality-size curve — it's not linear, and most of the savings come from the first optimization step, not the last.

The Quality-Size Curve Is Not Linear

This is the single most important concept in image optimization. JPG quality 100 does not mean "maximum quality" — it means "minimum compression." The difference between quality 100 and quality 85 is invisible to the human eye but the file size difference is enormous.

Here's a real example with a 4000x3000 photograph:

JPG QualityFile SizeReduction from 100%Visible Difference
100%9.2 MB
95%4.1 MB55% smallerNone visible
90%3.2 MB65% smallerNone visible
85%2.8 MB70% smallerNone visible
80%2.4 MB74% smallerNone visible at normal viewing
60%1.6 MB83% smallerSlight softness on zoom
40%1.1 MB88% smallerVisible artifacts around edges
20%720 KB92% smallerHeavy blocking artifacts

The sweet spot is 80-85% quality. You get 70-74% file size reduction with zero visible quality loss in photographs at normal viewing distances. Going from quality 85 to 60 saves only another 13 percentage points but introduces visible artifacts. The returns diminish rapidly below 80%.

WebP follows a similar curve but starts from a lower baseline — quality 80 WebP is roughly equivalent in visual quality and file size to quality 85 JPG, but 25-30% smaller.

Format Conversion: The Single Biggest Lever

Choosing the right format is worth more than every other optimization technique combined. The math is simple:

ConversionTypical ReductionWhy
PNG (photo) → JPG85-95% smallerLossy compression vs lossless
PNG (photo) → WebP88-96% smallerBetter lossy codec + smaller headers
BMP → JPG92-97% smallerUncompressed vs lossy compression
BMP → WebP94-98% smallerUncompressed vs modern lossy codec
JPG → WebP25-35% smallerVP8 more efficient than DCT at same quality
TIFF → JPG90-97% smallerLossless/uncompressed vs lossy
PNG (graphic) → PNG (indexed)60-80% smallerPalette mode for images with ≤256 colors

If you have photographs stored as PNG, converting to WebP or JPG is the single most impactful thing you can do. A 25MB PNG photograph becomes 2MB as JPG (85%) or 1.5MB as WebP (80%). That's a 92-94% reduction from changing the format alone.

Convert PNG to JPG | Convert PNG to WebP | Convert BMP to JPG | Convert TIFF to JPG

Resolution Reduction: Match the Display Size

A phone camera captures 12-50 megapixels. A typical web display shows images at 600-1200 pixels wide. Serving a 4000-pixel-wide photo in an 800-pixel container is pure waste — the browser downloads 5x more pixels than it renders.

Common target dimensions by use case:

Use CaseRecommended WidthApproximate JPG Size
Email attachment1200px200-400 KB
Blog post inline image800-1200px100-300 KB
Social media post1080-1200px150-350 KB
Product image (e-commerce)1000-1500px100-250 KB
Full-width hero image1920px300-600 KB
Thumbnail / preview300-400px15-40 KB
Profile picture / avatar200-400px10-30 KB

Halving the dimensions reduces pixel count by 4x (it's width times height). A 4000x3000 image has 12 million pixels. At 2000x1500, it's 3 million — 75% fewer pixels to compress. Combined with format conversion, you can take a 25MB PNG from a camera to a 150KB WebP for web display: that's a 99.4% reduction.

For retina/HiDPI displays, serve images at 2x the CSS display size. If your CSS shows the image at 600px wide, serve a 1200px source. Going beyond 2x provides no visible benefit on any current display technology.

Strip Metadata: Free Savings

Every photo from a digital camera or smartphone carries EXIF metadata: camera model, lens info, ISO, shutter speed, aperture, GPS coordinates, timestamps, thumbnail preview, color profile, and sometimes a full-resolution preview image embedded in the file.

This metadata is typically 10-500KB per image. A single iPhone photo's EXIF data averages 50-80KB. Professional camera photos with embedded previews can hit 500KB+ of metadata alone.

When to strip it:

  • Web delivery (users don't need your camera settings, and GPS data is a privacy risk)
  • Email attachments (saves bandwidth, protects location privacy)
  • Social media uploads (platforms strip metadata anyway on ingest)

When to keep it:

  • Archival storage (camera settings are valuable for future reference)
  • Professional photo delivery (clients may need EXIF for color management)
  • Print workflows (ICC color profiles in metadata affect color accuracy)

Metadata stripping is "free" savings — there's literally zero visual quality change. It's just invisible data riding along in the file. For a page with 20 product images, stripping metadata saves 200KB-1MB of total payload for no effort.

Progressive JPEG: Better Perceived Loading

Progressive JPEGs store image data in multiple scans of increasing quality. The first scan loads a blurry version of the full image, subsequent scans add detail. Baseline JPEGs load top-to-bottom, so users see a partially-loaded image with a hard edge.

File size impact: Progressive JPEGs are typically 2-5% smaller than baseline at the same quality level due to more efficient Huffman tables across the full image. For images over 10KB, progressive is almost always smaller. For tiny images under 10KB, baseline can be smaller because progressive adds overhead.

Perceived performance: The real benefit is UX. Users see a low-quality preview of the full image almost immediately, rather than watching it paint top-to-bottom. Studies show progressive loading reduces perceived wait time even when actual load time is identical.

Most modern image encoders (mozjpeg, libjpeg-turbo, Squoosh, Photoshop) default to progressive for web output. If your images are loading baseline-style (top to bottom), check your encoding settings.

Color Depth Reduction

Most images use 24-bit color (16.7 million colors per pixel). Many images don't need all 16.7 million. If your image has fewer than 256 distinct colors, converting to 8-bit indexed PNG can reduce file size by 60-80%.

Ideal candidates for indexed color:

  • Charts and graphs with solid fill colors
  • Simple icons and logos
  • Diagrams and flowcharts
  • UI screenshots with flat design (limited palette)
  • Pixel art

A pie chart with 5 colors at 1200x800 might be 85KB as 24-bit PNG. The same chart as 8-bit indexed PNG: 18KB. That's 79% smaller with identical visual output because the image truly only uses 5 colors.

Not suitable for: photographs (millions of unique colors from tonal gradients), images with smooth gradients (banding becomes visible at 256 colors), and any image where color accuracy matters. Photographs should use lossy compression (JPG/WebP), not color depth reduction.

Optimization by Scenario

"I need to email this photo"

Most email services limit attachments to 25MB (Gmail) or 10MB (some corporate servers). A single unoptimized phone photo can hit 3-8MB.

  1. Resize to 1200px wide (unless the recipient needs print quality)
  2. Convert to JPG at 85% quality if not already JPG
  3. Strip EXIF metadata (saves 50-500KB, removes GPS)

Result: 200-400KB per photo. You can attach 25-60 photos in a single Gmail message. Convert to JPG here.

"I need to upload this to a website"

Target: under 200KB per image for blog content, under 100KB for thumbnails.

  1. Convert to WebP (if the platform supports it) or JPG
  2. Resize to the actual display width (don't serve 4000px images in 800px containers)
  3. Quality 80-85% for JPG, 75-80% for WebP
  4. Strip metadata

For hero/banner images, target 300-600KB maximum. For product images, 80-150KB. These targets work for fast loading even on 4G mobile connections (10Mbps). Convert JPG to WebP | Convert PNG to WebP.

"I need to print this"

Print is different from screen. Print shops need high resolution (300 DPI) and prefer JPG or TIFF. Don't over-compress.

  1. Keep resolution high — 300 DPI at the print size (an 8x10 print needs a 2400x3000 pixel image minimum)
  2. Use JPG at 95% quality or TIFF with LZW compression
  3. Keep the ICC color profile in the metadata (it affects print color accuracy)
  4. Ask the print shop for their preferred format — most accept JPG, some require TIFF

File size doesn't matter for print delivery. A 15MB TIFF is fine if the print quality is right. Don't sacrifice quality to save a few megabytes when the output is going on paper.

Why This Matters for Web Performance

Google's Core Web Vitals measure three things, and images directly impact two of them:

  • Largest Contentful Paint (LCP): The time until the largest visible content element loads. For most pages, the largest element is an image. Google recommends under 2.5 seconds. Oversized images are the #1 reason pages fail this metric.
  • Cumulative Layout Shift (CLS): If images load without declared dimensions, the page reflows as each image appears, causing layout shift. Always specify width and height attributes.

On a typical 4G connection (10 Mbps), every 100KB of images adds ~80ms to load time. Optimizing 10 product images from 500KB each to 100KB each saves 4MB total, roughly 3.2 seconds of load time on mobile. That's the difference between passing and failing Core Web Vitals.

CDN-level optimization (Cloudflare Polish, AWS CloudFront image optimization, Fastly Image Optimizer) can automate format conversion and quality adjustment at the edge. This is the most effective approach for large sites — the CDN converts to WebP for supported browsers and serves JPG to everyone else, with zero code changes.

Batch Processing Tips

Optimizing one image at a time works for a blog post. For a site with hundreds of images, you need a batch workflow.

  • ChangeThisFile: Drop multiple files at once — each is converted independently in your browser. Works for batches of 10-50 images without needing any software installed. Batch convert PNG to WebP
  • Command-line (for developers): cwebp (Google's WebP encoder) and mozjpeg are the gold standard for batch optimization. A shell one-liner like for f in *.png; do cwebp -q 80 "$f" -o "${f%.png}.webp"; done converts an entire directory
  • CDN auto-optimization: Cloudflare Polish, Imgix, and Cloudinary convert and optimize on-the-fly based on the requesting browser's capabilities. Upload the original, serve the optimized version — zero manual work after setup

For recurring workflows (daily product photo imports, user-uploaded images), CDN-level optimization is the right answer. For one-time batches (migrating a site to WebP, preparing photos for an email campaign), ChangeThisFile or command-line tools are faster to set up.

Image optimization isn't one technique — it's three stacked on top of each other. Format conversion gives you the first 80-95%. Quality reduction gives you another 60-70% of what remains. Resolution matching eliminates the rest of the waste. Applied together, they can take a 25MB camera PNG to a 100KB web-ready WebP — a 99.6% reduction with no visible quality difference.

Start with the biggest lever first. If your images are PNG photographs, convert them to WebP or JPG before touching anything else. If they're already JPG, verify they're not at quality 100 (most cameras and export tools default to 95-100%). If file sizes are still too large, resize to match actual display dimensions.

Every kilobyte you save loads faster for every visitor on every page load. For a site with 10,000 monthly visitors viewing 5 images each, reducing average image size by 200KB saves 10GB of monthly bandwidth and makes every page load a third of a second faster on mobile.