Guides/ Tools
image

Base64 Images: When to Use Data URIs in CSS & HTML

Base64 encoding converts binary image data into ASCII text, allowing images to be embedded directly in HTML, CSS, or JSON. It eliminates an HTTP request — but at a cost. Here's when the trade-off makes sense.

April 2026 · 7 min read

What is Base64 Encoding?

Base64 represents binary data using 64 ASCII characters (A-Z, a-z, 0-9, +, /). Each 3 bytes of binary becomes 4 Base64 characters, meaning Base64 output is approximately 33% larger than the original binary. An image encoded as Base64 is inlined as text in your HTML or CSS.

Data URI Syntax

data:[mediatype][;base64],

/* Examples: */
/* PNG: */
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...

/* SVG (can be URL-encoded instead of Base64): */
data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'...%3E

/* In CSS: */
.icon {
  background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDov...');
}

/* In HTML: */
Icon

SVG: URL Encoding vs Base64

For inline SVG, URL encoding (percent-encoding) produces smaller output than Base64 and is still text-searchable. Prefer URL-encoded SVG over Base64 SVG.

/* Base64 SVG — 33% larger than necessary */
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL...");

/* URL-encoded SVG — smaller, readable */
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2L2 7l10 5 10-5-10-5z'/%3E%3C/svg%3E");

/* Even better: inline SVG in HTML (no encoding overhead at all) */

When to Use Base64 vs External File

ScenarioRecommendationReason
Critical small icon (< 2KB)Base64 in CSSSaves 1 HTTP request, negligible size overhead
Placeholder/LQIP (20×20px blur)Base64 in HTMLLoads instantly, no separate request
Logo (SVG, any size)External file + link preloadSVG is better as separate cacheable file
Photo (JPEG/WebP, any size)External fileBase64 overhead + no browser cache
Email template imagesBase64Many email clients block external images
CSS sprite alternativeBase64 (small icons only)Only if < 2KB each

Generate Base64 in JavaScript

// Browser: File to Base64
function fileToBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = e => resolve(e.target.result);
    reader.onerror = reject;
    reader.readAsDataURL(file); // returns "data:image/png;base64,..."
  });
}

// Usage
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', async e => {
  const dataUri = await fileToBase64(e.target.files[0]);
  document.querySelector('img').src = dataUri;
});

// Node.js: image file to Base64 string
const fs = require('fs');
const base64 = fs.readFileSync('icon.png').toString('base64');
const dataUri = `data:image/png;base64,${base64}`;

Base64 Pitfalls to Avoid

  • Base64-encoding large images — a 100KB photo becomes 133KB as Base64, is embedded in every page load, and is not cached by the browser. Always use external files for images over 2KB.
  • Not using browser cache — external image files are cached by the browser across pages. Base64-inlined images are not — they're downloaded with every HTML/CSS file.
  • Base64 in JavaScript bundles — webpack and other bundlers can inline images as Base64. Check your bundle size; a few images can add significant kilobytes to your JS bundle.
  • Using Base64 in JSON APIs for image transfer — sending images as Base64 in JSON APIs bloats payload by 33% and prevents streaming. Use multipart/form-data or pre-signed URLs instead.

Frequently Asked Questions

How do I convert an image to Base64 in a browser?
Use StudioLimb's Image Compressor or Squoosh to export as Base64, or use the browser's FileReader API (see code example above). For SVG, copy the SVG source code and URL-encode it manually or with an online tool.
Can search engines index Base64 images?
Google can index the content of external image files but cannot index Base64-embedded images (they're opaque text strings to the crawler). If image SEO matters for your content, always serve images as external files with descriptive filenames and alt text.
Is Base64 a form of compression?
No — Base64 is encoding, not compression. It makes the data larger (by ~33%). Gzip/Brotli HTTP compression can partially offset this, but Base64-encoded images in CSS files will still be larger than external image files even after compression.
When does Base64 actually improve performance?
Only for very small images (< 2KB) where the HTTP request round-trip cost (typically 50–100ms) is greater than the size overhead cost. For most images in 2026 with HTTP/2 multiplexing, external files are faster because they're individually cacheable and don't add to HTML/CSS parse time.

Free reference

The 47 Tools Cheat Sheet

One printable page with every tool on this site, what it does, and when to reach for it. Free. It asks for an email so Gumroad can send you the file, unlike the tools themselves.