画像からBase64エンコーディング:いつ、どのように使うか
Base64エンコーディングを使うと、画像をテキスト文字列としてHTML、CSS、メールテンプレートに直接埋め込むことができます。外部ファイルを参照する代わりに、画像データがドキュメント自体にインラインで含まれます。これによりHTTPリクエストが1つ削減されますが、ペイロードサイズが約33%増加します。このトレードオフがいつ合理的かを理解することが、Base64画像を効果的に使うための鍵です。
Base64エンコーディングとは?
Base64は、64個の印刷可能なASCII文字(A–Z、a–z、0–9、+、/)を使用してバイナリデータを表現するバイナリからテキストへのエンコーディング方式です。バイナリ入力3バイトごとにBase64出力4文字が生成されるため、エンコードされたデータは常に元のデータより約33%大きくなります。
画像に適用する場合、Base64エンコーディングはPNG、JPEG、SVG、またはGIFファイルの生のピクセルデータを、テキストが受け入れられる場所ならどこにでも埋め込める長いテキスト文字列に変換します。
データURIの構文
Base64エンコードされた画像を埋め込む標準的な方法はデータURIを使用することです:
data:[メディアタイプ][;base64],<エンコードされたデータ>
例えば、小さなPNGアイコン:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="赤い点" />
一般的な画像MIMEタイプ:
| フォーマット | MIMEタイプ |
|---|---|
| PNG | image/png |
| JPEG | image/jpeg |
| GIF | image/gif |
| SVG | image/svg+xml |
| WebP | image/webp |
| ICO | image/x-icon |
画像からBase64変換ツールで任意の画像を即座に変換できます。
Base64画像を使うべき場合
1. HTMLメールテンプレート
メールクライアントはデフォルトで外部画像リクエストをブロックします。Base64エンコードされた画像は、受信者が「画像を読み込む」をクリックしなくても即座に表示されます。これがBase64エンコード画像の最も強力なユースケースです。
<img src="data:image/png;base64,iVBORw0KGgo..." alt="企業ロゴ" width="150" />
一部のメールクライアントにはサイズ制限があることに注意してください(Gmailは約102KB以上のHTMLメッセージを切り捨てます)。Base64画像は小さく保ちましょう。
2. 小さなアイコンとUI要素
2KB未満の小さな画像 — ファビコン、ローディングスピナー、シンプルなアイコン — の場合、Base64エンコーディングは意味のあるサイズのオーバーヘッドなしにHTTPラウンドトリップを排除します。
.icon-check {
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...');
width: 16px;
height: 16px;
}
3. CSS背景画像
小さな装飾画像をスタイルシートに直接埋め込むと、ブラウザが必要とするリクエストの総数を減らせます:
.button-success {
background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0i...');
background-repeat: no-repeat;
background-position: left 8px center;
padding-left: 28px;
}
4. 単一ファイルHTMLドキュメント
自己完結型のHTMLレポート、ダッシュボード、またはドキュメントファイルを配布する必要がある場合、画像をBase64として埋め込むことで、ファイルを移動したり共有したりしても何も壊れません。
5. CORSの問題回避
画像をBase64文字列として埋め込むと、外部リクエストがないためクロスオリジン制限を完全に回避できます。
Base64画像を使うべきでない場合
1. 大きな画像
100KBのJPEGはBase64エンコードすると約133KBになります。500KBの写真はHTMLに埋め込まれた約667KBのテキストになります。これは初回ページロードを肥大化させ、ブラウザが独立してキャッシュすることもできません。
経験則: Webページでは5–10KBを超える画像をBase64エンコードしないでください。
2. HTTP/2およびHTTP/3環境
最新のHTTPプロトコルは単一の接続でリクエストを多重化します。HTTP/1.1時代にBase64を正当化していた「HTTPリクエストを節約する」という議論はほぼ時代遅れです。画像を別ファイルとして提供すれば、ブラウザが独立してキャッシュできます。
3. 複数ページにまたがる繰り返し画像
同じ画像が複数のページに表示される場合、別ファイルとして提供すればブラウザは一度だけダウンロードしてキャッシュします。Base64エンコーディングでは、毎回のページロードでエンコードされたデータを再ダウンロードすることになります。
4. 頻繁に変更される画像
Base64エンコードされた画像が変更されるたびに、HTML全体またはCSSファイルのキャッシュが無効になります。別ファイルを使えば、ドキュメントキャッシュを無効にせずに画像を更新できます。
5. サーバーサイドレンダリングページ
大きなBase64文字列はHTMLドキュメントのサイズを増加させ、Time to First Byte(TTFB)を遅くし、パーサーがページの残りを処理するのをブロックします。
JavaScriptで画像をBase64に変換
FileReader APIはブラウザで画像をBase64に変換する簡単な方法を提供します:
function imageToBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = reject;
reader.readAsDataURL(file);
});
}
// ファイル入力と一緒に使用
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', async (e) => {
const file = e.target.files[0];
const base64String = await imageToBase64(file);
console.log(base64String);
// 出力: data:image/png;base64,iVBORw0KGgo...
});
パフォーマンス比較
| 要素 | 個別ファイル | Base64インライン |
|---|---|---|
| ファイルサイズ | 元のサイズ | 約33%大きい |
| HTTPリクエスト | 画像ごとに1 | 0(埋め込み) |
| ブラウザキャッシュ | はい | いいえ(ドキュメントに紐付き) |
| レンダリングブロック | いいえ(非同期読み込み) | はい(HTMLにインライン) |
| HTTP/2の利点 | 完全な多重化 | なし |
| メール互換性 | デフォルトでブロック | 即座に表示 |
ベストプラクティス
- サイズの閾値を設定する。 Webページでは5KB未満の画像のみBase64エンコードしてください。メールの場合は画像あたり20KB未満に保ちましょう。
- 最初に最適化する。 エンコード前に画像を圧縮しましょう。ソースファイルが小さいほど、Base64文字列も小さくなります。
- 可能ならSVGを使用する。 SVGはBase64エンコーディングなしでXMLとして直接インライン化でき、33%のサイズ増加を完全に回避できます。
- ビルドツールで自動化する。 Webpack、Vite、その他のバンドラーはビルドプロセス中に小さな画像を自動的にBase64としてインライン化できます。
- 合計ページ重量を監視する。 複数のBase64画像は急速に蓄積されます。埋め込み後のドキュメントサイズを追跡しましょう。
よくある質問
Base64エンコーディングは画像品質に影響しますか?
いいえ。Base64は可逆エンコーディングです — 基盤となる画像データを変更せずにバイナリデータをテキストに変換します。デコードされた画像は元の画像とバイト単位で同一です。
どの画像フォーマットでもBase64エンコードできますか?
はい。PNG、JPEG、GIF、SVG、WebP、ICO、その他あらゆるフォーマットをBase64エンコードできます。データURIのMIMEタイプが、ブラウザに画像データのデコード方法を指示します。
なぜBase64出力は33%大きいのですか?
Base64はデータを表現するために1文字あたり6ビットを使用しますが、各文字はテキスト上で8ビット(1バイト)を占めます。つまり、3バイトのバイナリデータが4バイトのBase64テキストになります:33%の増加です。
関連リソース
- 画像からBase64変換ツール — 画像をBase64データURIに即座に変換
- Base64エンコーダー / デコーダー — テキストやファイルのエンコード・デコード
- Base64エンコーディング解説 — Base64の仕組みの詳細ガイド
🛠️ 今すぐ試す: 画像からBase64変換ツール | Base64エンコーダー — 100%無料、すべてブラウザで処理。データのアップロードなし。