Web 用画像のファイルサイズ最適化戦略 - 品質を保ちながら軽量化する技術
画像ファイルサイズが Web パフォーマンスに与える影響
HTTP Archive の統計によると、Web ページの総転送量の約 50% を画像が占めています。平均的な Web ページの画像転送量は約 1MB であり、モバイル回線 (4G で実効 10Mbps 程度) では画像だけで 800ms 以上のダウンロード時間が発生します。画像の最適化は、Web パフォーマンス改善において最もインパクトの大きい施策の一つです。
Google の Core Web Vitals において、画像は特に LCP (Largest Contentful Paint) に直接影響します。ファーストビューのヒーロー画像が 500KB の場合と 150KB の場合では、LCP に 500ms 以上の差が生じることがあります。Google は LCP 2.5 秒以内を「良好」と定義しており、画像サイズの最適化だけでこの閾値をクリアできるケースも少なくありません。
ユーザー体験の観点では、画像の読み込み遅延は直帰率に直結します。Google の調査では、ページ読み込み時間が 1 秒から 3 秒に増加すると直帰率が 32% 上昇し、5 秒になると 90% 上昇するとされています。画像最適化は技術的な改善であると同時に、ビジネス指標に直結する施策です。
最適化の目標値として、個々の画像は用途に応じて以下のサイズを目安にします:
- ヒーロー画像: 200KB 以下
- 記事内画像: 100KB 以下
- サムネイル: 30KB 以下
- アイコン・ロゴ: 10KB 以下
フォーマット選択による最適化
画像フォーマットの選択は、ファイルサイズ最適化の最も基本的かつ効果的な手段です。同じ画像でもフォーマットによってファイルサイズが 2〜5 倍異なることがあります。
フォーマット別の特性と推奨用途:
- AVIF: 最も高い圧縮効率。同等品質で JPEG の 50%、WebP の 20% 小さいファイルを生成。ただしエンコード速度が遅く、ブラウザサポートは Chrome 85+、Firefox 93+、Safari 16.4+。写真・グラデーション画像に最適
- WebP: JPEG より 25〜35% 小さいファイルを生成。ロスレス圧縮もサポート。ブラウザサポートは 2024 年時点で 97% 以上。写真・イラスト両方に対応する汎用フォーマット
- JPEG: 最も広いブラウザサポート。mozjpeg エンコーダを使用すると標準 JPEG より 5〜15% 小さくなる。フォールバック用として依然重要
- PNG: ロスレス圧縮。透過が必要な画像、テキストを含む画像、色数が少ないイラストに使用。写真には不向き (ファイルサイズが JPEG の 3〜5 倍)
- SVG: ベクター形式。アイコン、ロゴ、シンプルなイラストに最適。解像度に依存せず、gzip 圧縮で極めて小さいファイルサイズを実現
実装では <picture> 要素を使用して、ブラウザの対応状況に応じたフォーマットの出し分けを行います。AVIF → WebP → JPEG の順にフォールバックする構成が現在のベストプラクティスです。
解像度とリサイズによる最適化
画像のピクセル数はファイルサイズに直接影響します。4,000 × 3,000 ピクセルの画像を 800 × 600 ピクセルで表示する場合、実際に必要なデータ量は 1/25 です。表示サイズに合わせた適切なリサイズは、最も効果的なファイルサイズ削減手法です。
適切な解像度の決定方法:
- 表示幅 × デバイスピクセル比 = 必要な画像幅
- 例: 表示幅 400px × 2x (Retina) = 800px の画像が必要
- 3x デバイス (一部の Android) を考慮しても、表示幅の 2 倍で十分。3x と 2x の差は人間の目では判別困難
リサイズ時のアルゴリズム選択も品質に影響します。sharp ライブラリのデフォルトである Lanczos3 は、シャープネスを保ちながら高品質なダウンスケーリングを実現します。バイリニア補間は高速ですが、テキストやエッジがぼやける傾向があります。
CSS の image-rendering プロパティも考慮すべきです。ピクセルアートやスクリーンショットなど、シャープなエッジを保持したい画像には image-rendering: pixelated (または crisp-edges) を指定することで、ブラウザのアンチエイリアスによるぼやけを防止できます。これにより、低解像度の画像でも鮮明に表示でき、ファイルサイズを抑えられます。
レスポンシブ画像 (srcset) を使用する場合、生成するサイズバリエーションは 3〜5 段階が適切です。バリエーションが多すぎると CDN キャッシュのヒット率が低下し、少なすぎると最適化効果が薄れます。
メタデータ除去とロスレス最適化
画像ファイルには、表示に不要なメタデータが含まれていることがあります。EXIF データ (撮影日時、GPS 座標、カメラ設定)、ICC カラープロファイル、サムネイル画像、コメントフィールドなどが典型的です。これらを除去するだけで、ファイルサイズを 5〜20% 削減できる場合があります。
除去すべきメタデータ:
- EXIF データ: 撮影情報。GPS 座標が含まれる場合はプライバシーリスクもあるため、Web 公開時は必ず除去する
- IPTC/XMP データ: 著作権情報やキャプション。Web 配信では不要
- 埋め込みサムネイル: JPEG ファイルに埋め込まれた小さなプレビュー画像。数 KB〜数十 KB を占める
- ICC プロファイル: sRGB 画像の場合、プロファイルを除去してもブラウザは正しく表示する。約 3KB の削減
ロスレス最適化は、画質を一切劣化させずにファイルサイズを削減する技術です:
- PNG:
oxipngやpngquantでフィルタリングと圧縮を最適化。元の PNG から 20〜70% 削減可能 - JPEG:
jpegtranでハフマンテーブルを最適化。2〜5% の削減。プログレッシブ化も同時に行える - SVG:
svgoで不要な属性、コメント、エディタ固有のメタデータを除去。30〜60% 削減可能
これらのロスレス最適化はビルドパイプラインに組み込むべきです。画像を追加するたびに手動で最適化するのは非現実的であり、自動化によって最適化の適用漏れを防止できます。
CDN と配信レベルの最適化
画像ファイル自体の最適化に加え、配信方法の最適化もファイルサイズの実効的な削減に貢献します。CDN (Content Delivery Network) の機能を活用することで、クライアントの条件に応じた動的な最適化が可能になります。
コンテンツネゴシエーション: HTTP の Accept ヘッダーを利用して、ブラウザが対応するフォーマットを検出し、最適なフォーマットを自動配信する仕組みです。CloudFront + Lambda@Edge や Cloudflare Workers で実装できます。クライアントが Accept: image/avif, image/webp を送信した場合、AVIF を優先的に配信します。
クライアントヒント: Save-Data ヘッダーが有効なクライアントには、より積極的に圧縮した画像を配信します。DPR (Device Pixel Ratio) ヒントを利用すれば、サーバーサイドでデバイスに最適な解像度の画像を選択できます。
HTTP/2 Server Push (または 103 Early Hints): LCP 画像を HTML のパース完了前にプッシュすることで、画像のダウンロード開始を早められます。ただし、キャッシュ済みの画像を不必要にプッシュするリスクがあるため、103 Early Hints の方が安全です。
キャッシュ戦略: 画像は変更頻度が低いため、長期キャッシュ (1 年) を設定し、ファイル名にハッシュを含めるキャッシュバスティング方式が推奨されます。Cache-Control: public, max-age=31536000, immutable を設定することで、ブラウザの再検証リクエストも排除できます。
最適化の自動化と品質管理
画像最適化を持続的に実施するには、自動化と品質管理の仕組みが不可欠です。手動での最適化は属人的になりやすく、チームメンバーの入れ替わりや作業の忙しさで品質が低下するリスクがあります。
ビルドパイプラインへの組み込み:
- 画像の追加・変更を検出し、自動的にリサイズ・フォーマット変換・メタデータ除去を実行する
- 処理前後のファイルサイズを比較し、削減率をログに記録する
- 品質閾値 (SSIM 0.95 以上など) を設定し、過度な圧縮を防止する
品質ゲートの設定:
- 個々の画像ファイルサイズの上限を設定する (例: 300KB 超の画像は警告)
- ページ全体の画像転送量の上限を設定する (例: 1MB 超で CI 失敗)
- Lighthouse のパフォーマンススコアの閾値を設定する (例: 90 点未満で CI 失敗)
モニタリング:
- Real User Monitoring (RUM) で実際のユーザーの画像読み込み時間を計測する
- 画像サイズの推移をダッシュボードで可視化し、肥大化の傾向を早期に検出する
- 新しい画像フォーマット (JPEG XL など) の対応状況を定期的に確認し、採用タイミングを判断する
最適化は一度行えば終わりではなく、コンテンツの追加やブラウザの進化に合わせて継続的に改善していくプロセスです。自動化された仕組みを基盤として、定期的な見直しと改善を行うことで、長期的に高いパフォーマンスを維持できます。