高DPI画面でのシャープなCanvas描画

Canvasバッファをデバイスピクセル比に合わせてスケーリングし、RetinaおよびHiDPIディスプレイでのぼやけたHTML5 Canvas描画を修正します。ステップバイステップのコード例を含みます。

Practical

詳細な説明

ぼやけたCanvasの問題

デフォルトでは、<canvas>要素の内部ビットマップ解像度はCSSサイズと一致します。DPR 2のディスプレイでは、300×150のCanvasが600×300の物理ピクセルにアップスケールされ、ぼやけます。

修正方法

Canvasバッファをデバイスピクセル比に合わせてスケーリングします:

function setupHiDPICanvas(canvas, width, height) {
  const dpr = window.devicePixelRatio || 1;
  canvas.width = width * dpr;
  canvas.height = height * dpr;
  canvas.style.width = width + 'px';
  canvas.style.height = height + 'px';
  const ctx = canvas.getContext('2d');
  ctx.scale(dpr, dpr);
  return ctx;
}

パフォーマンスのトレードオフ

DPR 3のCanvasはDPR 1と比べて9倍のピクセルを持ちます。アニメーションの多いCanvasでは、DPR 2で上限を設けることを検討してください:

const dpr = Math.min(window.devicePixelRatio || 1, 2);

ユースケース

Canvasベースのアプリケーション(チャート、ゲーム、描画ツール)を構築する開発者は、現代の高DPI画面でぼやけた出力を防ぐためにDPR対応レンダリングが必要です。

試してみる — Screen Info Display

フルツールを開く