WebP Export Settings — When Quality 80 Looks Worse Than JPEG

(Updated: July 16, 2026 ) WebP images performance

Shipped WebP because Lighthouse said so. Hero image looks mushy on retina. Designer says “just use PNG.” You re-export at quality 100 and file size is bigger than the original JPEG. r/webdev argument ensues — nobody measured at actual display dimensions or picked the right lossy vs lossless mode.

  • Same quality number across codecs — WebP Q80 ≠ JPEG Q80. Compare visually or by file size at fixed SSIM, not slider position.
  • Lossy WebP for UI screenshots — Text and flat colors ring and blur; lossless WebP or PNG wins.
  • Converting JPEG → WebP → JPEG — Generation loss stacks. Keep master in lossless format.
  • Ignoring alpha — WebP alpha is lossy in lossy mode; halos around icons are a codec + export setting issue.

Lossy vs lossless decision

Content typeRecommended
Photos, gradientsLossy WebP ~75–85
Icons, logos, text UILossless WebP or SVG
Photos with transparencyLossy WebP + check alpha edges
AnimationWebP lossy animation vs video (AV1/WebM) tradeoff

Quality slider starting points

These are starting points — always A/B at 1× and 2× display width:

Use caseLossy qualityNotes
Blog hero 1200w80–85Check skin tones and sky banding
Product grid thumbs75–80Smaller display forgives more
Full-bleed photo bg82–88Banding in gradients shows first
OG / social card85–90Text overlay needs sharp base

cwebp CLI example:

cwebp -q 82 photo.jpg -o photo.webp
cwebp -lossless icon.png -o icon.webp

Why it “looks worse”

  1. Viewing at wrong size — 4000px export displayed at 400px hides artifacts; opposite also true — upscaling soft WebP looks terrible.
  2. Sharpening in JPEG source — WebP recompression eats artificial sharpening halos.
  3. 4:2:0 chroma subsampling — Same as JPEG; red text on blue background bleeds.
  4. Near-lossless misunderstood-near_lossless in cwebp is not magic; still inspect edges.

AVIF vs WebP in 2026

AVIF often beats WebP size at same quality on photos; encode CPU cost is higher. Practical stack:

  • <picture> with AVIF → WebP → JPEG/PNG fallback
  • Generate derivatives at display widths (640, 960, 1280), not one 4000px master for all

Workflow with compress tool

  1. Export master from design tool (avoid double JPEG).
  2. Resize to max deployed width before compress.
  3. Try lossy WebP at 80 — compare side-by-side with original at 100% display zoom.
  4. If edges matter, switch lossless or keep PNG for that asset only.
  5. Run image compress tool locally — batch compare sizes.

Lighthouse vs aesthetics

LCP wants bytes down; brand wants crisp hero. Negotiate: maybe hero is slightly larger WebP, thumbnails aggressive. One global Q60 policy fails both metrics and design review.

CDN and cache invalidation

After re-exporting WebP at higher quality, CDN cache may serve old blurry derivatives for days. Purge by URL or version query (hero.webp?v=2) when comparing before/after — otherwise design review argues against a fix users never receive.

Animated WebP gotcha

Animated WebP uses lossy frames independently — banding in gradients animates visibly. For subtle loop backgrounds, test on OLED at low brightness; compression artifacts that pass on LCD posterize on dark UI themes.

Tool: compress and compare

The image-compress tool converts and compresses in-browser — quick before/after without uploading client assets to unknown servers.

Try the image-compress tool

TL;DR

WebP quality numbers aren’t portable across formats. Photos → lossy ~80; UI/text → lossless or PNG. Resize to deployed width, compare at real display size, use <picture> fallbacks.