Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

A dynamic image is an image whose URL, crop, format, dimensions, or pixels are chosen or produced at runtime. In web development, the term usually describes two different techniques: responsive delivery, where the browser selects the most suitable file from prepared alternatives, and dynamic generation, where JavaScript or a server creates or modifies pixels.

Use srcset and sizes when the picture is the same but needs different resolutions. Use <picture> when you need a different crop or format. Use Canvas (or a server-side image service) when code must draw, combine, annotate, or export new pixels.

Dynamic image meaning: two related ideas

Dynamic delivery (responsive images)

With responsive delivery, you prepare several image files and let the browser choose one at runtime. The choice can depend on the image slot’s width, the device’s pixel density, viewport conditions, zoom, orientation, and network circumstances. No new pixels are generated in the browser; it selects an existing URL.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The usual tools are srcset and sizes on <img>, plus <picture> and <source> for explicit format or art-direction choices. This can avoid downloading a 2,000-pixel image for a 320-pixel slot and can give a narrow layout a crop that keeps the subject visible.

Dynamic generation or manipulation

Here, a runtime process creates or changes pixels. Browser JavaScript can draw an image on a Canvas, scale it, composite layers, add labels, or export a data URL or blob. A server or image-processing service can perform equivalent work and return a generated image URL. Examples include personalized badges, chart snapshots, user-edited photos, game sprites, and social-card images.

How responsive image selection works in HTML

Use srcset and sizes for resolution switching

srcset lists candidate files. A width descriptor such as 480w says that the file is intended to represent 480 intrinsic pixels. A density descriptor such as 2x describes a device-pixel-ratio variant. When width descriptors are used, sizes tells the browser how wide the image will render under each media condition.

<img
  src="photo-800.jpg"
  srcset="photo-480.jpg 480w, photo-800.jpg 800w, photo-1600.jpg 1600w"
  sizes="(width <= 600px) 480px, 800px"
  width="800" height="450"
  alt="A sample landscape"
>

In this example, the browser evaluates the sizes list, computes the slot width, and chooses a suitable candidate while considering pixel density and other conditions. The plain src remains a fallback. The width and height attributes communicate the aspect ratio early, allowing space to be reserved and reducing layout shift.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Why an apparently wrong file can be correct

The browser is not required to choose the numerically closest filename. It uses the computed slot, device-pixel ratio, zoom, orientation, cache state, and network information. A high-density screen may receive a wider candidate than the CSS slot, while a constrained connection may favor a smaller one. Inspect the rendered image and its network request rather than assuming the largest file should always load.

Use <picture> for art direction or formats

<picture> lets the user agent evaluate ordered <source> elements by their media, type, and srcset. The nested <img> is still the semantic image, supplies the fallback, and should carry the meaningful alt text.

Rank #2
Sale
HTML and CSS: Design and Build Websites
  • HTML CSS Design and Build Web Sites
  • Comes with secure packaging
  • It can be a gift option
<picture>
  <source media="(width < 800px)" srcset="portrait-crop.jpg">
  <source type="image/avif" srcset="photo.avif">
  <img src="photo.jpg" alt="The subject of the photograph">
</picture>

This pattern can serve a portrait crop to a narrow layout while offering AVIF where supported and falling back to the JPEG. Put the most specific applicable source first. Do not omit the fallback <img>: it provides semantics, accessibility, and behavior when no source is usable.

Dynamic image versus static image

Aspect Static image Dynamic image approach
Pixels and URL One predetermined file and URL Browser selects among files, or code generates new pixels and a URL
Typical HTML Simple src srcset/sizes, <picture>, or a script and Canvas
Best use Small, fixed illustrations or icons Responsive layouts, art direction, personalization, editing, charts, and exports
Bandwidth May download more pixels than the slot needs Can select an appropriately sized or formatted resource
Caching One highly stable cache key Each variant or generated result needs a cache strategy
Security concerns Normal image loading rules Canvas pixel reads and export can be blocked by cross-origin restrictions

Generating or editing a dynamic image with Canvas

Canvas is appropriate when JavaScript must manipulate pixels in the browser. Set the canvas dimensions, wait for the image to load, draw it, and then export the result. The canvas’s internal dimensions are independent of its CSS display size; set both deliberately when you need a crisp result on high-density displays.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
<canvas id="preview" width="800" height="450"></canvas>
<script>
const canvas = document.querySelector('#preview');
const context = canvas.getContext('2d');
const image = new Image();

image.onload = () => {
  context.clearRect(0, 0, canvas.width, canvas.height);
  context.drawImage(image, 0, 0, canvas.width, canvas.height);
  // For a downloadable file:
  canvas.toBlob(blob => {
    if (!blob) return;
    const downloadUrl = URL.createObjectURL(blob);
    // Assign downloadUrl to an anchor's href, then revoke it after use.
  }, 'image/webp', 0.85);
};

image.src = '/assets/input.jpg';
</script>

For a crop, use the nine-argument form of drawImage: source x, y, width, and height followed by destination x, y, width, and height. For overlays, draw the base image first, then shapes or text. Use toBlob() for a file upload or download; toDataURL() is convenient for small inline results but creates a potentially large string.

The Canvas cross-origin rule

If an image comes from another origin, the browser may mark the canvas as tainted. Reading pixels with getImageData() or exporting with toBlob()/toDataURL() then throws a security exception. Set image.crossOrigin = 'anonymous' before assigning src, and configure the image server to return an appropriate CORS header. Without permission from that server, client-side code cannot bypass the restriction.

Choosing the right technique

  • Same content, different screen sizes: use srcset with width descriptors and an accurate sizes value.
  • Different composition on mobile or desktop: use <picture> with media-specific crops.
  • Modern format with fallback: use a typed <source> inside <picture> and retain a fallback <img>.
  • User edits, annotations, charts, or composites: use Canvas in the browser, or generate on a server when results must be shareable and cacheable.
  • Personalized or frequently changing images: generate a stable URL containing explicit transformation parameters, then cache it according to its data lifetime.

Performance, caching, and reliability practices

Describe the rendered slot accurately

An incorrect sizes value can make the browser download an unnecessarily large candidate or a blurry one. Match the real CSS layout, including breakpoints, columns, and gutters. If the image is always fixed-width, a density-based srcset can be simpler.

Reserve layout space

Always provide intrinsic width and height, or an equivalent aspect-ratio rule. This lets the browser reserve space before the file arrives. Keep the source variants at the same aspect ratio unless art direction intentionally changes it.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Cache variants deliberately

Responsive files are excellent cache candidates when their URLs are stable and their content is immutable. Generated images should include all inputs that affect pixels in the cache key. Set expiration and revalidation headers appropriate to how often the underlying content changes. Avoid producing an unbounded number of nearly identical transformations.

Control work and memory in Canvas

Large canvases consume significant memory. Resize source images before drawing when possible, release object URLs after downloads, and avoid repeatedly converting a full-resolution image inside animation loops. For server generation, queue expensive work and return a predictable error when an upstream asset cannot be loaded.

Accessibility and fallback

Write useful alt text on the fallback <img>. If a generated image conveys information, provide that information in surrounding text or an accessible data representation. Do not make essential instructions available only as pixels. A failed JavaScript enhancement should leave a meaningful static image or message.

How-to: build a responsive, generated image

  1. Prepare source variants. Export the same photograph at several widths, for example 480, 800, and 1600 pixels, and name them predictably.
  2. Add responsive markup. Put those URLs in srcset, describe the layout slot in sizes, and add intrinsic dimensions and alt.
  3. Add art direction only if needed. Wrap the image in <picture> when the narrow crop must differ or when offering an alternate format.
  4. Generate pixels only for interactive work. Load the source with Canvas, draw the crop or overlay, and export with toBlob(). Configure CORS before loading a cross-origin source.
  5. Test real breakpoints. In browser developer tools, emulate narrow and wide viewports, inspect the selected network request, test zoom and high-density settings, and disable JavaScript to verify the fallback.

Or skip the browser setup

For a finished webpage capture rather than an in-page responsive image, ScreenshotNeo provides a single API request. It accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be disabled. Bot checks, CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing status.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

ScreenshotNeo also offers an MCP server for AI clients such as Claude and Cursor, with take_screenshot, get_page_info, and capture_pdf. Every plan includes features such as full-page capture, CSS-selector elements, device presets, custom CSS and JavaScript, waits, request blocking, cookies and headers, PDF options, caching, signed links, asynchronous jobs, bulk capture, and a usage API.

Rank #4
Sale
Web Design with HTML, CSS, JavaScript and jQuery Set
  • Brand: Wiley
  • Set of 2 Volumes
  • A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers

Use the ScreenshotNeo API documentation for parameter details. A minimal call is:

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

Python:

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Node.js:

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

The Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Troubleshooting dynamic images

The browser always downloads the largest candidate

Check that width descriptors use accurate intrinsic widths and that sizes describes the actual rendered slot. A missing or overly large sizes value makes the browser assume a wider slot. Also inspect device-pixel ratio and zoom before judging the choice.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The image looks blurry on a high-density screen

Provide a sufficiently large candidate, use width descriptors or appropriate density descriptors, and avoid CSS stretching a small source far beyond its intrinsic dimensions.

The mobile crop never appears

Confirm the <source> media condition matches the viewport and that it precedes the fallback <img>. Remember that changing CSS alone does not change the selected URL unless the media conditions or candidate list do.

Canvas export throws a security error

The canvas was likely tainted by a cross-origin image. Set crossOrigin before src and enable CORS on the image server. If you cannot change that server, proxy or process the asset on an origin you control.

The generated image has a blank area or wrong proportions

Wait for onload before drawing, use the source image’s natural dimensions, and calculate the crop explicitly. Set canvas width and height attributes rather than relying only on CSS.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Layout jumps while the image loads

Add width and height attributes or a matching CSS aspect-ratio. Ensure all responsive candidates share the intended ratio unless a deliberate art-directed crop changes it.

Frequently Asked Questions

Can a dynamic image be completely generated on the server?

Yes. A server or image service can resize, crop, composite, or annotate source assets and return a normal URL. The browser then treats the result like any other image; choose stable transformation URLs and cache them according to the source data’s lifetime.

Does using <picture> automatically improve accessibility?

No. Accessibility comes from the nested <img>, its meaningful alt text, and an equivalent text representation when the pixels carry information. <picture> primarily controls source selection.

When should I avoid Canvas for image delivery?

Avoid it when you only need responsive resolution or format selection. HTML responsive-image features are simpler, preserve normal image semantics, and let the browser manage fetching and caching. Use Canvas when code must actually create or edit pixels.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.