Base64 图片的使用场景

Base64 编码图片的适用场景和使用方法

问题

什么是 Base64 图片?在什么场景下应该使用 Base64 编码的图片?

解答

Base64 是一种将二进制数据编码为 ASCII 字符串的方式。图片经过 Base64 编码后,可以直接嵌入到 HTML、CSS 或 JavaScript 中。

格式

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA...

使用场景

1. 小图标内联到 CSS

/* 适合小于 2KB 的图标 */
.icon-search {
  background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHBhdGggZD0iTTEwIDJhOCA4IDAgMTA1LjI5IDEzLjcxbDQuNyA0LjdhMSAxIDAgMDEtMS40MiAxLjQybC00LjctNC43QTggOCAwIDAxMTAgMnptMCAyYTYgNiAwIDEwMCAxMiA2IDYgMCAwMDAtMTJ6Ii8+PC9zdmc+');
  width: 24px;
  height: 24px;
}

2. HTML 中直接嵌入

<!-- 减少一次 HTTP 请求 -->
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" alt="pixel">

3. Canvas 导出图片

const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');

// 绘制内容
ctx.fillStyle = 'red';
ctx.fillRect(0, 0, 100, 100);

// 导出为 Base64
const base64Image = canvas.toDataURL('image/png');
console.log(base64Image);

// 可以直接用于下载或上传
const link = document.createElement('a');
link.download = 'image.png';
link.href = base64Image;
link.click();

4. 文件上传预览

const input = document.getElementById('fileInput');
const preview = document.getElementById('preview');

input.addEventListener('change', (e) => {
  const file = e.target.files[0];
  const reader = new FileReader();
  
  reader.onload = (event) => {
    // 获取 Base64 字符串
    const base64 = event.target.result;
    preview.src = base64;
  };
  
  // 读取文件为 Base64
  reader.readAsDataURL(file);
});

5. 避免跨域问题

// 将跨域图片转为 Base64 后可以在 Canvas 中使用
async function imageToBase64(url) {
  const response = await fetch(url);
  const blob = await response.blob();
  
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.onloadend = () => resolve(reader.result);
    reader.readAsDataURL(blob);
  });
}

不适合使用的场景

// ❌ 大图片不适合用 Base64
// Base64 编码后体积增加约 33%
// 无法利用浏览器缓存
// 会阻塞 HTML/CSS 解析

// ✅ 大图片应该使用普通 URL
<img src="/images/large-photo.jpg" alt="photo">

关键点

  • 适合小图片:一般建议 2KB 以下的图片使用 Base64
  • 减少请求:内联到代码中可以减少 HTTP 请求数
  • 体积增大:Base64 编码后体积增加约 33%
  • 无法缓存:内联的 Base64 图片无法被浏览器单独缓存
  • 常见场景:小图标、Canvas 导出、文件预览、邮件嵌入图片