「画像を2倍サイズで用意してください」とデザイナーや先輩から言われて、なぜ?と思ったことはありませんか。スマホやMacのディスプレイで写真がぼやけてしまう原因と、それを防ぐための画像の扱い方をわかりやすく解説します。
まず「ピクセル」の話から
画面の映像は無数の小さな点の集まりで表示されています。この点1つひとつをピクセル(px)と呼びます。
CSSで width: 300px と書いたとき、この「300px」は実は画面上の物理的なドット数ではありません。ブラウザが計算に使う「CSS上の仮想的なピクセル」です。これを論理ピクセル(CSS px)といいます。
一方、ディスプレイに実際に並んでいるドットの数を物理ピクセル(デバイスピクセル)といいます。
昔のディスプレイはこの2つが1:1で対応していました。しかしスマートフォンや高解像度のPCが普及した現在、この比率が変わってきました。
Retinaディスプレイとは何か
Appleが「Retina(レティーナ)ディスプレイ」と呼ぶ高解像度画面では、論理ピクセル1pxの領域に物理ピクセルが縦横2つずつ、合計4つ敷き詰められています。
論理ピクセルに対して物理ピクセルが何倍あるかを表す数値です。
・通常のディスプレイ:DPR = 1
・Retina / 高解像度スマホ:DPR = 2(機種によっては3)
JavaScriptでは
window.devicePixelRatio で確認できます。この仕組みによって文字や図形は非常に滑らかに見えます。ところが画像ファイルにはこの恩恵が自動では届きません。
よく使われるデバイスのDPRと画面サイズ
「自分のスマホはDPRがいくつなのか」を知っておくと、画像サイズを決めるときの判断がしやすくなります。代表的なデバイスの論理解像度・物理解像度・DPRをまとめました。
iPhone(iOS)
| 機種の目安 | 論理解像度(CSS px) | 物理解像度 | DPR |
|---|---|---|---|
| iPhone SE(第3世代) | 375 × 667px | 750 × 1334px | 2 |
| iPhone 14 / 15 | 390 × 844px | 1170 × 2532px | 3 |
| iPhone 14 Plus / 15 Plus | 428 × 926px | 1284 × 2778px | 3 |
| iPhone 14 Pro / 15 Pro | 393 × 852px | 1179 × 2556px | 3 |
| iPhone 14 Pro Max / 15 Pro Max | 430 × 932px | 1290 × 2796px | 3 |
iPhoneは機種によってDPR 2または3が混在しています。現行の多くのiPhoneはDPR=3です。Web制作では安全側として2倍(2x)画像を用意するのが一般的で、3倍対応は必要に応じて検討します。
Android スマートフォン
| 機種の目安 | 論理解像度(CSS px) | 物理解像度 | DPR |
|---|---|---|---|
| Pixel 7 | 412 × 915px | 1080 × 2400px | 約2.6 |
| Pixel 8 | 412 × 915px | 1080 × 2400px | 約2.6 |
| Galaxy S24 | 360 × 780px | 1080 × 2340px | 3 |
| Galaxy S24 Ultra | 384 × 824px | 1440 × 3088px | 約3.75 |
| ミドルレンジ機全般 | 360 × 800px 前後 | 720 × 1600px 前後 | 2 |
Androidは各メーカーが独自のディスプレイを搭載するため、DPRは1.5〜4近くまで幅があります。ハイエンド機ではDPR 3以上も珍しくありません。ただし実務では2x対応を基準にしておけば、ほとんどの機種で十分きれいに表示されます。
タブレット
| 機種の目安 | 論理解像度(CSS px) | 物理解像度 | DPR |
|---|---|---|---|
| iPad(第10世代) | 810 × 1080px | 1620 × 2160px | 2 |
| iPad Air(M2) | 820 × 1180px | 1640 × 2360px | 2 |
| iPad Pro 11インチ(M4) | 834 × 1194px | 2388 × 1668px | 2 |
| iPad Pro 13インチ(M4) | 1024 × 1366px | 2048 × 2732px | 2 |
| Galaxy Tab S9 | 753 × 1085px | 1600 × 2560px | 約2.1 |
PC・Mac
| 環境 | DPR | 備考 |
|---|---|---|
| 一般的なWindowsノートPC / デスクトップ | 1 | フルHD(1920×1080)クラス。DPR=1が多い |
| Windows高解像度ディスプレイ(4K等) | 1.5〜2 | スケーリング設定によって変わる |
| MacBook Air / Pro(Retina) | 2 | 全モデルRetinaディスプレイ搭載 |
| iMac(Retina 5K) | 2 | Retina搭載 |
デバイス別まとめ:DPRの傾向
| カテゴリ | 主なDPR | 制作上の目安 |
|---|---|---|
| iPhone(現行機) | 2〜3 | 2x画像で対応。重要なビジュアルは3x検討 |
| Androidスマホ | 2〜3(機種による) | 2x画像を基準にする |
| iPad / Androidタブレット | 2前後 | 2x画像で基本的に対応できる |
| MacBook / iMac | 2 | 2x画像で対応 |
| 一般WindowsPC | 1(4Kは1.5〜2) | 1x画像でOK。4K環境が多いなら2x検討 |
現在のWebサイト訪問者の多くはスマートフォンからのアクセスです。2x対応を基本として画像を準備しておけば、ほぼすべての主要デバイスで画像のぼやけを防げます。
なぜ画像だけぼやけるのか
論理ピクセル 300px 幅の領域に、実際には 600 物理ピクセルが存在しています。ここに 300×300px の画像ファイルを表示しようとすると、ブラウザは1つの画像ピクセルを4つの物理ピクセルに拡大して描画します。この「引き伸ばし」がぼやけの正体です。
| 状況 | 画像ファイルのサイズ | 表示領域(論理px) | 結果 |
|---|---|---|---|
| 通常ディスプレイ(DPR=1) | 300×300px | 300×300px | きれいに表示 |
| Retinaディスプレイ(DPR=2) | 300×300px | 300×300px | 引き伸ばされてぼやける |
| Retinaディスプレイ(DPR=2) | 600×600px | 300×300px | きれいに表示 |
つまり「2倍サイズの画像を用意する」理由は、Retinaディスプレイの600物理ピクセルに対して画像側も600px分の情報を持たせるためです。
2倍画像を使う基本的な書き方(srcset)
HTMLには srcset(ソースセット)という属性があり、ディスプレイの解像度に応じて最適な画像を自動で切り替えられます。
<img
src="image.jpg"
srcset="image.jpg 1x, image@2x.jpg 2x"
alt="サンプル画像"
width="300"
height="200"
>
上記のように書くと、DPR=1の環境では image.jpg、DPR=2以上の環境では image@2x.jpg が自動的に選択されます。ファイル名に @2x を付けるのは慣習的な命名ルールで、技術的な制約ではありません。
<img> タグに複数の画像候補を指定できる属性です。ブラウザが画面解像度・画面サイズ・通信速度などを考慮して最適な1枚を自動選択します。画面サイズによって画像を切り替える(sizes との組み合わせ)
Retinaへの対応(解像度の違い)に加えて、PCとスマホで表示サイズ自体が異なるケースもあります。たとえばPCでは画像を600px幅で表示し、スマホでは画面幅いっぱいに表示したい場合です。
そのときは sizes 属性と srcset の w(幅)記法を組み合わせます。
<img
src="image-600.jpg"
srcset="image-300.jpg 300w,
image-600.jpg 600w,
image-1200.jpg 1200w"
sizes="(max-width: 768px) 100vw, 600px"
alt="サンプル画像"
>
| 記述 | 意味 |
|---|---|
300w |
この画像ファイルは横300pxのもの |
sizes="(max-width: 768px) 100vw, 600px" |
768px以下の画面では画面幅いっぱい(100vw)、それ以外は600pxで表示する |
ブラウザはこの情報をもとに「画面サイズ × DPR」を計算し、srcset の中から最適な画像を選びます。通信量の節約にもつながります。
PCとスマホで画像ファイルを丸ごと切り替える(picture タグ)
横長のバナー画像をスマホでは縦長に切り替えたい、というようにトリミングや構図ごと変えたい場合は <picture> タグを使います。
<picture>
<source media="(max-width: 767px)" srcset="image-sp.jpg">
<img src="image-pc.jpg" alt="サンプル画像">
</picture>
<source> タグの条件(media属性)に一致した場合はそちらの画像が使われ、どの条件にも一致しない場合は <img> のsrcがフォールバックとして使われます。
主な手段が使えなかったときの代替手段のことです。
<picture> タグに対応していない古いブラウザでは、<img> タグのsrcが読み込まれます。CSS背景画像のRetina対応
CSSの background-image で画像を使う場合は、メディアクエリで対応します。
/* 通常ディスプレイ用 */
.hero {
background-image: url("hero.jpg");
}
/* Retina対応(DPR 1.5以上に適用) */
@media (-webkit-min-device-pixel-ratio: 1.5),
(min-resolution: 144dpi) {
.hero {
background-image: url("hero@2x.jpg");
background-size: cover;
}
}
background-size: cover を忘れずに指定しましょう。2倍サイズの画像をそのままの大きさで表示してしまうと意図しない表示になります。
まとめ:Retina対応 実装の選び方
| やりたいこと | 使う手法 |
|---|---|
| 解像度に応じて同じ構図の画像を切り替える | <img srcset="... 1x, ... 2x"> |
| 画面サイズと解像度に応じて最適な画像を自動選択 | <img srcset="... w" sizes="..."> |
| PCとスマホで構図・トリミングを変える | <picture><source media="..."><img></picture> |
| CSS背景画像のRetina対応 | メディアクエリ min-resolution で2x画像を切り替え |
最初のうちは srcset="image.jpg 1x, image@2x.jpg 2x" の書き方を覚えるだけで十分です。レスポンシブ全体の仕組みと組み合わせて理解を深めたい方は、レスポンシブWebデザインの基本の記事もあわせてご覧ください。
よくある疑問Q&A
- Q. 全部の画像を2倍で用意しないといけませんか?
- ロゴ・アイコン・目立つバナーなど、ぼやけが気になりやすい画像から優先的に対応しましょう。写真ならぼやけが比較的目立ちにくいこともあります。SVGで作れるアイコンやロゴは解像度に依存しないのでベストな選択です。
- Q. 2倍画像にするとページが重くなりませんか?
- ファイルサイズは大きくなります。srcsetを正しく使えばDPR=1の環境では軽い画像が読み込まれるため、すべてのユーザーに重い画像を送ることにはなりません。また WebP(ウェブピー)フォーマットを使うとJPGより大幅にファイルサイズを削減できます。
- Q. SVGってどんな画像ですか?
- SVG(Scalable Vector Graphics)はドットではなく「線の数式」で画像を表現するファイル形式です。どれだけ拡大してもぼやけません。ロゴ・アイコン・シンプルなイラストに最適です。写真のような複雑な画像には使えません。