ScreenshotNeo

BlogGuides

Website Image Size Best Practices for Performance

Choose image dimensions from rendered size and device pixel ratio, then use responsive formats, loading hints and compression to reduce bytes.

By the ScreenshotNeo team1 October 20269 min read

There is no single best image size for every website. Set an image’s intrinsic dimensions from the width of its rendered slot and the device pixel ratio (DPR), then provide responsive candidates so the browser can download an appropriate file. An image displayed at 500 CSS pixels may need about 500 intrinsic pixels at DPR 1 or about 1,000 at DPR 2. Sending a much larger file adds bytes without improving visible quality.

For most sites, the practical recipe is:

  1. Measure the image’s rendered width at each layout breakpoint.
  2. Create a few width-based candidates that cover those slots and common DPRs.
  3. Use srcset and an accurate sizes attribute.
  4. Serve WebP or AVIF when they are suitable, with a normal img fallback.
  5. Keep the likely Largest Contentful Paint (LCP) image discoverable and eager; lazy-load distant images.
  6. Set width and height, or an equivalent aspect ratio, so layout space is reserved.

What size should website images be?

Start with the CSS slot, not a fixed device category. If a card is 320 CSS pixels wide on a phone, a 320–640 pixel source usually covers DPR 1 and DPR 2. If the same card grows to 640 CSS pixels on desktop, add a 640–1,280 pixel candidate. The browser chooses among the candidates using the slot width, viewport, DPR and network conditions.

Rendered slot Useful candidate range Typical use
160–240 CSS px 240, 480 px Avatars, small thumbnails
320–480 CSS px 480, 768, 960 px Mobile cards and article images
600–800 CSS px 768, 1,200, 1,600 px Desktop content columns
Full-width hero Viewport-specific widths up to the largest supported layout Landing-page and editorial heroes

These are starting points, not universal rules. Three to five candidates are common, but choose the set that matches your actual layouts, storage and maintenance budget. An oversized 3,000-pixel source for a 300-pixel slot wastes transfer and decoding work.

Intrinsic size, rendered size and DPR

Intrinsic dimensions are the pixel dimensions stored in the file. Rendered dimensions are the CSS dimensions on the page. A DPR-2 screen can display a 500 CSS-pixel image using roughly 1,000 physical pixels for sharper detail. CSS still controls the layout size; intrinsic dimensions control how much detail the downloaded file can contain.

Do not multiply every image by the highest possible DPR. A very large source can cost more bytes while producing no visible improvement after compression or browser scaling. Inspect real slots and test visual quality at the largest important DPR.

Responsive images with srcset and sizes

Width descriptors tell the browser the pixel width of each candidate. sizes describes the slot width before CSS is applied; it does not itself set the rendered width.

<img
  src="/images/article-768.webp"
  srcset="
    /images/article-480.webp 480w,
    /images/article-768.webp 768w,
    /images/article-1200.webp 1200w,
    /images/article-1600.webp 1600w
  "
  sizes="(max-width: 700px) calc(100vw - 32px), 768px"
  width="1600"
  height="1000"
  alt="A mountain trail at sunrise"
>

In this example, the browser expects a 16-pixel margin on narrow screens and a maximum 768-pixel content slot on wider screens. Keep a usable src fallback because some consumers do not interpret responsive attributes.

Use picture for formats or art direction

Use srcset for different resolutions of the same composition. Use picture when you need format selection or a different crop on a breakpoint.

<picture>
  <source type="image/avif" srcset="/images/hero-768.avif 768w, /images/hero-1200.avif 1200w" sizes="100vw">
  <source type="image/webp" srcset="/images/hero-768.webp 768w, /images/hero-1200.webp 1200w" sizes="100vw">
  <img src="/images/hero-1200.jpg" width="1200" height="700" alt="Product team reviewing a design">
</picture>

For art direction, add media-specific sources with intentionally different crops. Preserve the fallback img element and its dimensions.

Formats, compression and quality

WebP and AVIF may compress more efficiently than JPEG or PNG, but the best choice depends on image content, browser support and visual quality. Photographs usually suit lossy formats; screenshots, diagrams and images with transparency may need lossless or near-lossless settings. Compare files at their actual display size rather than judging only at 100% zoom.

  • Strip metadata that is not needed for delivery.
  • Use a consistent quality policy, then inspect text, edges, gradients and faces for artifacts.
  • Keep PNG where exact edges or alpha quality matter, but do not use it automatically for photographs.
  • Generate derivatives during your build or upload pipeline with tools such as ImageMagick or Sharp.

Google’s Image SEO guidance and web.dev’s responsive image guide cover responsive markup and supported formats.

Loading strategy: LCP, lazy loading and layout stability

The first large visible image often becomes LCP. Put it in the initial HTML, do not apply loading="lazy", and consider fetchpriority="high" only for the likely LCP resource. Promoting many images competes for bandwidth.

<img
  src="/images/hero-1200.webp"
  srcset="/images/hero-768.webp 768w, /images/hero-1200.webp 1200w, /images/hero-1600.webp 1600w"
  sizes="100vw"
  width="1600"
  height="900"
  fetchpriority="high"
  alt="Team collaborating around a screen"
>

<img
  src="/images/related-480.webp"
  width="480"
  height="320"
  loading="lazy"
  decoding="async"
  alt="Related article illustration"
>

Lazy-load images well below the initial viewport. Always provide width and height, or set an equivalent CSS aspect-ratio, so the browser can reserve space and reduce Cumulative Layout Shift (CLS). Google lists good-experience targets of LCP within 2.5 seconds, Interaction to Next Paint (INP) below 200 milliseconds and CLS below 0.1; image changes are only one part of the page-level result. See the Core Web Vitals documentation.

A complete responsive image example

<figure class="article-media">
  <picture>
    <source
      type="image/avif"
      srcset="/media/report-480.avif 480w, /media/report-768.avif 768w, /media/report-1200.avif 1200w"
      sizes="(max-width: 700px) calc(100vw - 32px), 768px"
    >
    <source
      type="image/webp"
      srcset="/media/report-480.webp 480w, /media/report-768.webp 768w, /media/report-1200.webp 1200w"
      sizes="(max-width: 700px) calc(100vw - 32px), 768px"
    >
    <img
      src="/media/report-768.jpg"
      srcset="/media/report-480.jpg 480w, /media/report-768.jpg 768w, /media/report-1200.jpg 1200w"
      sizes="(max-width: 700px) calc(100vw - 32px), 768px"
      width="1200"
      height="800"
      loading="lazy"
      decoding="async"
      alt="Analytics report on a laptop"
    >
  </picture>
  <figcaption>Responsive candidates let the browser select a suitable source.</figcaption>
</figure>

How to choose candidate widths

  1. Record the slot width at each breakpoint with browser developer tools.
  2. Include the largest common DPR for important slots, but avoid extreme outliers that add substantial bytes.
  3. Round to a manageable set of widths shared across templates, such as 480, 768, 1200 and 1600.
  4. Generate every format from the same source crop so candidates do not change composition accidentally.
  5. Inspect the network panel to confirm the browser selected the expected candidate.

Common implementation mistakes

Problem Why it happens Fix
Every device downloads the largest file No srcset, or inaccurate sizes Add width candidates and describe the real slot.
Images look blurry on retina screens Only a 1x source is available Add a higher-resolution candidate for important slots.
Layout jumps while images load No intrinsic dimensions or aspect ratio Set width/height or CSS aspect-ratio.
Hero image appears late It is lazy-loaded or hidden behind client-side discovery Keep it in initial HTML, remove lazy loading and selectively use high fetch priority.
Modern format fails for some users No fallback or incorrect MIME configuration Use picture with a working img fallback and correct server types.
Images consume excessive memory Huge decoded bitmaps, even when displayed small Resize derivatives to realistic slot sizes and avoid giant originals in page markup.

Performance and reliability checklist

  • Measure rendered slots in all major templates and breakpoints.
  • Provide three to five practical candidates where that matches the layout.
  • Use truthful sizes values.
  • Compress and compare WebP, AVIF, JPEG and PNG for the actual content.
  • Keep LCP images eager and distant images lazy.
  • Reserve layout space with dimensions or aspect ratio.
  • Check cache headers, CDN behavior and image response MIME types.
  • Review field data as well as Lighthouse or PageSpeed Insights; image optimization cannot compensate for slow scripts, fonts or server response.

Self-hosted pipeline versus an image service

A build-time pipeline gives control over crops, quality, storage and deployment. A managed image service can generate variants on demand and reduce application code, but adds a third-party connection and service dependency. Compare candidate selection, format support, crop control, automation effort, storage complexity and origin connection cost. The web.dev guidance names Sharp, ImageMagick, Thumbor and Cloudinary as examples; it does not establish one universal winner.

Or skip the browser setup

If you need screenshots of pages at their real rendered dimensions, ScreenshotNeo provides a GET endpoint that returns PNG, JPEG, WebP or PDF. It handles the browser capture and can set full-page capture, device presets, viewport, retina scale, waits, custom CSS and JavaScript, headers, cookies, blocking rules, caching and more. Before capture it accepts consent banners and removes more than 60 known consent platforms, newsletter popups and chat widgets. Bot checks, blank pages, timeouts, failed loads and cache hits are not billed, and response headers identify the page verdict and billing status.

curl -G "https://api.screenshotneo.com/v1/shot" \
  -d access_key=YOUR_API_KEY \
  --data-urlencode url=https://stripe.com \
  -o shot.webp
import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"},
    timeout=90,
)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot failed: ${res.status}`);
const buffer = Buffer.from(await res.arrayBuffer());
require('fs').writeFileSync('shot.webp', buffer);

See the ScreenshotNeo API documentation for the option names and response headers. Its MCP server exposes take_screenshot, get_page_info and capture_pdf to Claude, Cursor and other MCP clients. The Free plan includes 1,000 screenshots each month with no card; paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account.

Troubleshooting

The browser chooses an unexpectedly small file

Check that sizes matches the real CSS slot and that width descriptors are correct. A value such as sizes="100vw" is wrong for a centered 768-pixel column because it tells the browser to expect the full viewport.

The image is sharp but still slow

Inspect transferred bytes, not only pixel dimensions. Choose a more efficient format, lower quality slightly, remove metadata and ensure distant images are lazy-loaded. Also check server latency, cache misses and competing requests.

CLS remains high

Find images without dimensions, responsive components whose aspect ratio changes, or CSS that applies late. Add width and height that match the source ratio or reserve space with aspect-ratio.

AVIF or WebP returns an error

Verify that the file exists, the response has the correct Content-Type, and the picture fallback is valid. Test a direct request in a browser and retain JPEG or PNG fallback files.

For self-hosted browser automation, wait for the page, locate the banner, click consent and remove known overlay selectors before capture. With ScreenshotNeo, consent handling and removal of more than 60 known consent, newsletter and chat systems happen before the shot; individual steps can be disabled in configuration.

FAQ

Is 1920×1080 the best website image size?

Only when the image is actually rendered near that width and aspect ratio. Most content images need smaller derivatives, while a full-width hero may need a larger candidate.

Should I resize images before uploading them?

Yes. Keep an original for editing, but generate delivery derivatives that match real slots and DPRs. This prevents every page from decoding and transferring an unnecessarily large bitmap.

How many srcset sizes do I need?

Use enough to cover your real breakpoints and avoid large jumps in downloaded bytes. Three to five is a common starting point; measure and adjust.

Does lazy loading improve LCP?

Usually not for the LCP image. Lazy loading is for images outside the initial viewport; applying it to the hero can delay discovery.

Can CSS alone make an oversized image fast?

No. CSS changes the rendered size, but the browser may still download and decode the full oversized file. Deliver an appropriately sized candidate.