JA EN

Data URI で画像を埋め込む技術と注意点 - Base64 エンコードの仕組みと最適な使いどころ

· 約 9 分で読めます

Data URI スキームとは - 画像をテキストとして埋め込む仕組み

Data URI (Data URL) スキームは、外部ファイルへの参照ではなく、データそのものを URL として直接記述する方式です。RFC 2397 で定義されており、画像、フォント、CSS、JavaScript など任意のデータを HTML や CSS に直接埋め込むことができます。

Data URI の構文:

data:[<mediatype>][;base64],<data>

画像の Data URI 例:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==

構成要素:

Data URI を使用する主な動機は HTTP リクエスト数の削減です。小さなアイコンやプレースホルダー画像を個別のファイルとして配信すると、各画像に対して HTTP リクエストが発生します。Data URI で埋め込めば、HTML や CSS のダウンロード 1 回で画像データも同時に取得でき、追加のリクエストが不要になります。ただし HTTP/2 以降ではリクエストの多重化が可能なため、この利点は大幅に薄れています。

Base64 エンコードの仕組みとサイズへの影響

Base64 は、バイナリデータを ASCII 文字列に変換するエンコード方式です。6 ビットずつ区切って 64 種類の文字 (A-Z, a-z, 0-9, +, /) に変換するため、元データの約 33% サイズが増加します。

Base64 エンコードの仕組み:

コマンドラインでの変換:

base64 -i icon.png -o icon.txt (macOS) / base64 icon.png > icon.txt (Linux)

JavaScript での変換:

const toDataUri = (file) => new Promise((resolve) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.readAsDataURL(file); });

サイズ増加の実際の影響:

さらに、Base64 文字列は gzip 圧縮の効率が悪い (バイナリデータより圧縮率が低い) ため、実質的なサイズ増加は 33% 以上になる場合があります。HTML/CSS ファイル全体の gzip 圧縮率も低下させるため、大きな画像の埋め込みは二重にデメリットがあります。

HTML と CSS での Data URI の使い方

Data URI は HTML の <img> タグと CSS の background-image プロパティの両方で使用できます。それぞれの記述方法と使い分けを解説します。

HTML での使用:

<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSIjY2NjIi8+PC9zdmc+" alt="placeholder" width="16" height="16" />

CSS での使用:

.icon-check { background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/%3E%3C/svg%3E'); }

SVG の場合の最適化:

CSS Sprites との比較: 複数の小さなアイコンを管理する場合、CSS Sprites (1 枚の画像にまとめて background-position で切り出す) と Data URI のどちらが適切かはケースバイケースです。HTTP/2 環境では個別ファイルのままでも問題ないため、保守性を優先して個別 SVG ファイル + <use> 参照が現代のベストプラクティスです。

パフォーマンスへの影響 - Data URI のメリットとデメリット

Data URI のパフォーマンス特性を正確に理解し、適切な場面でのみ使用することが重要です。HTTP/1.1 時代のベストプラクティスが HTTP/2 以降では逆効果になるケースがあります。

メリット:

デメリット:

Core Web Vitals への影響: 大きな Data URI は HTML のダウンロードサイズを増加させ、FCP (First Contentful Paint) を遅延させます。特に LCP 要素に Data URI を使用すると、LCP スコアが悪化します。

適切なユースケースと避けるべきケース

Data URI を使うべき場面と避けるべき場面を明確に整理します。判断基準は「画像サイズ」「再利用頻度」「キャッシュの重要性」の 3 軸です。

Data URI が適切なケース:

Data URI を避けるべきケース:

ビルドツールでの自動化と実装パターン

Data URI の生成をビルドパイプラインに組み込み、手動でのエンコード作業を排除する実装パターンを紹介します。

webpack での自動インライン化:

Vite での自動インライン化:

PostCSS プラグイン:

Next.js での LQIP 生成:

推奨する閾値設定:

CI/CD での検証: ビルド後の HTML/CSS ファイルサイズを監視し、Data URI の過剰な埋め込みによるサイズ膨張を検出するチェックを組み込みます。bundlesize や Lighthouse CI で閾値を設定し、超過時にアラートを発報します。

関連記事

画像プレースホルダー技術の比較 - LQIP, BlurHash, SQIP の実装ガイド

画像読み込み中のユーザー体験を向上させる LQIP、BlurHash、SQIP の仕組みと実装方法を比較解説。各手法のメリット・デメリットと最適な使い分けを紹介します。

画像読み込み戦略の設計 - preload, fetchpriority, decoding を使いこなす

Web ページの画像読み込みを最適化する 3 つの属性を徹底解説。LCP 改善に直結する preload、fetchpriority、decoding の正しい使い方と組み合わせ方を紹介。

favicon の作り方完全ガイド - ICO, SVG, PNG の使い分け

favicon の仕組みから、ICO, SVG, PNG 各フォーマットの特徴、ダークモード対応、各ブラウザの対応状況まで実践的に解説します。

画像変換 API の設計パターン - URL ベース、リクエストボディ、非同期処理の比較

画像変換 API を設計する際のアーキテクチャパターンを解説。URL パラメータ方式、REST API 方式、非同期キュー方式の特性を比較し、スケーラブルな設計指針を提示します。

SVG の基礎と活用法 - ベクター画像の仕組みからアニメーションまで

SVG (Scalable Vector Graphics) の基本構造から実践的な活用法まで解説。パス、図形、テキスト、フィルタ、アニメーションの実装方法と最適化テクニックを紹介します。

HTML イメージマップの作り方と代替手段 - クリッカブルマップの実装ガイド

HTML の map 要素と area 要素を使ったイメージマップの実装方法を解説。レスポンシブ対応の課題と、SVG や CSS を使ったモダンな代替手段を具体的なコード例とともに紹介します。

関連用語