小さなサイトの手帖A FIELD GUIDE FOR YOUR SMALL WEBSITE
直す・整える

画像を軽くして、スマホでの表示を速くする|形式・大きさ・読み込みの指定を実測で比べる

ページが重い原因は、画像であることが多くあります。1枚の写真を3つの大きさと4つの形式で保存し直してファイルサイズを測りました。形式を選ぶ前に、表示する大きさに縮めるだけで、サイズは大きく変わります。

この記事の外部リンクは公式サイトへの通常リンクです。この記事に広告リンクはありません。

1. 軽くする順番は、まず大きさ、次に形式

測定には、macOSに付属する風景写真1枚(3840×2160px、JPEG、約5.4MB)を使いました。同じ写真を、幅1600px、800px、400pxに縮め、形式を変えて保存し、ファイルサイズを比べました。

大きさJPEG(品質85)JPEG(品質70)WebP(品質80)AVIF(品質60)PNG
1600×900219KB145KB137KB106KB1,836KB
800×45063KB41KB42KB31KB473KB
400×22518KB12KB12KB9KB123KB

元の写真(約5.4MB)を幅1600pxのJPEGにするだけで約219KB、幅800pxなら約63KBです。形式を変える前に、画面で表示する大きさまで縮めるのが、いちばん効果の大きい作業でした。

測定の条件:Python(Pillow 12.3)で保存した値で、1枚の写真での結果です。「品質」の数値は形式ごとに意味が違うため、同じ数値でも同じ見た目になるとは限りません。ここではファイルサイズだけを測り、見た目の比較はしていません。

2. 形式の選び方

MDNの画像形式の解説を、用途別に整理します。

形式向くもの特徴
JPEG写真非可逆の圧縮。透明は使えない
PNGスクリーンショット、図、線画可逆の圧縮。透明が使える。写真には大きくなる
WebP写真・図の両方、動く画像非可逆・可逆の両方、透明も使える。対応は最新のブラウザで広い
AVIF写真・図の両方、動く画像高性能。MDNは、対応が広がっている途中のため、代わりの画像(フォールバック)を用意するよう書いている
SVGアイコン、図ベクター形式。大きさが変わっても、正確に描ける

測定でも、同じ写真のPNGは、同じ大きさのJPEGの約8倍でした(1600px幅で1,836KBと219KB)。写真にPNGは向きません。

図や文字の入った画像

1200×630pxの図(文字と線が中心の画像)も測りました。PNGが66KB、JPEG(品質85)が55KB、WebP(品質80)が25KB、AVIF(品質60)が18KBでした。ここでもファイルサイズだけで、見た目の比較はしていません。MDNは、図やスクリーンショットには、正確に再現できるPNGが向くとしています。形式を変えたら、文字の周りがにじんでいないかを、拡大して自分の目で確かめます。

3. HTMLの指定:width・height、loading、srcset

widthとheight

MDNは、すべての画像にwidthとheightを付けるよう勧めています。ブラウザが読み込む前に縦横の比率を知り、場所を確保できるため、画像が出た瞬間にページがずれる(レイアウトのずれ)ことを防げます。

loading="lazy"

画面の外にある画像の読み込みを、近づくまで遅らせる指定です。MDNによると、遅らせるのはJavaScriptが有効なときだけです。画面の最初の部分に見える画像に付けるべきかは、MDNのこのページでは触れられていません。この記事では、最初の画面に見える画像には付けず、スクロールした先の画像にだけ付ける方針にします。

srcsetとsizes

大きさの違う画像を複数用意して、ブラウザに選ばせる書き方です。srcsetに画像と幅(400wなど)を並べ、sizesに、その画像を表示する幅を書きます。

<img src="photo-800.jpg"
     srcset="photo-400.jpg 400w, photo-800.jpg 800w, photo-1600.jpg 1600w"
     sizes="(width <= 600px) 100vw, 800px"
     width="1600" height="900" loading="lazy" alt="写真の内容の説明">

実際にブラウザが選ぶ画像を測りました。ブラウザの画面の濃さ(devicePixelRatio)は2です。

画面の幅画像を表示する幅選ばれた画像
375px375px(画面いっぱい)800w
800px800px1600w
1200px800px(上限)1600w

画面の濃さが2のため、375pxで表示するには750pxぶんの画素が必要で、その次に大きい800wが選ばれました。小さな画面で小さな画像が使われるので、スマホで受け取るデータが減ります。この結果はChrome 152(macOS)での測定です。ブラウザは、画像を選ぶ方法を決める自由があり、通信の状況なども考慮できるとMDNは書いています。

4. 作業の手順

  1. 元の写真を、保存用として別の場所に残す。
  2. 表示する最大の幅を決める(本文の幅が800pxなら、1600pxまで)。
  3. 幅400px・800px・1600pxの3つを作る。
  4. HTMLに、width、height、alt、必要ならsrcsetとloading="lazy"を書く。
  5. 公開したら、開発者ツールの「Network」で、画像の転送サイズを見る。
from PIL import Image

im = Image.open("元の写真.jpg").convert("RGB")
for w in (400, 800, 1600):
    h = round(im.height * w / im.width)
    im.resize((w, h), Image.LANCZOS).save(f"photo-{w}.jpg", quality=85, optimize=True)

1ページに載せた画像の合計サイズを記録して、更新のたびに増えていないかを見ます。一緒に、画像が画面からはみ出さない指定(max-width:100%;height:auto)も入れます。公開できるファイルの大きさの上限は、HTMLの公開手順に書いています。

参照した公式資料

2026年10月10日に確認したMDNの資料と、同日にPython(Pillow 12.3)とChrome 152(macOS)で測った結果に基づきます。測定は1枚の写真と1枚の図での結果で、ファイルサイズだけを比べています。見た目の比較や、他のブラウザ・実機での測定は行っていません。この記事に広告はなく、外部リンクは公式資料への通常リンクです。

次に読む料金表・比較表をスマホで読みやすくする|3つの方法を幅375pxで実測