PR
DPI値の違うディスプレイでの表示。左は144dpiで右は96dpi。文字のドット構成は同じで、左側は1.5倍に拡大されている。文字 を滑らかに見せるアンチエイリアスなどが行われているため、拡大するとボケているように見えてしまう。
DPI値の違うディスプレイでの表示。左は144dpiで右は96dpi。文字のドット構成は同じで、左側は1.5倍に拡大されている。文字 を滑らかに見せるアンチエイリアスなどが行われているため、拡大するとボケているように見えてしまう。
[画像のクリックで拡大表示]

 Windows 8.1でアプリを使っているとき、文字や画像がボケたウインドウが出てくるときがあります。これは、Windowsが持っている「DPI仮想化」という機能が働いているためです。

 Windows Vistaから「High DPI」という仕組みが導入され、高いDPI値を持つディスプレイを有効に利用できるようになりました。DPIとは、「Dot Per Inch」つまり、「1インチ当たりのドット数」という意味で、ディスプレイやプリンターなどドットの集まりで文字や画像を表示する場合の「細かさ」を表す数字です。

 「1インチ」の中に入るドットの数が多いということは、1つのドットが小さいことを意味します。つまり、DPI値は、表示されるドットの「小ささ」を表しているともいえます。

 DPI値が大きい ⇒ 1インチに入るドットの数が多い ⇒ ドットが小さい
 DPI値が小さい ⇒ 1インチに入るドットの数が少ない ⇒ ドットが大きい

 ということになります。現在では、液晶ディスプレイが主流で解像度と画面サイズでdpi値は自動的に決まってきます。dpi値は、カタログなどにも記載されていることがあります。しかし、世の中にあるノートパソコンや液晶ディスプレイを見るとさまざまな解像度で、さまざまな大きさの製品があります。つまり、DPI値はハードウエアごとに違っている可能性が高いのです。

 ところが、プログラムは、同じように動作しなければなりません。Windows XPまでは、代表的なサイズである96DPIを前提にプログラムが作られていました。というのは、解像度を仮定しないと、文字が画面の上で何ドットになるのかを想定できないからです。もちろん、実行するときに計算してレイアウトしなおすことも原理的には可能ですが、初期のパソコンでは、それを短時間で行う性能はなく、96DPIであらかじめ計算しておくということになりました。このため、Windows XPも基本は、ディスプレイのDPI値は96DPIであるとして設定されました。

 しかし、その後、パソコンのCPUの性能も上がり、さまざまなディスプレイ、特に大型のものや解像度の高いものがいろいろと登場してきて、96DPIでは、表示される文字やボタン、ウインドウなどが小さくなりすぎるという問題が出てきました。

 DPI値が変わると、同じ大きさの文字を構成するドット数は、

 DPI値が大きい ⇒ 文字を構成するドット数が多い
 DPI値が小さい ⇒ 文字を構成するドット数が少ない

 となります。しかし、1つのディスプレイ(固定したDPI値を持つ)で、プログラムが想定しているDPI値が違っていると、文字やウインドウのサイズが変わってしまいます。同じディスプレイに想定しているDPI値が違うアプリが同じサイズの文字やウインドウを表示させた場合。

 想定しているDPI値が小さい ⇒ 文字やウインドウが小さい
 想定しているDPI値が大きい ⇒ 文字やウインドウが大きい

 つまり、高いDPI値を持つ最近のディスプレイ上で古い小さなDPI値を前提に作られたアプリケーションの文字やウインドウは小さくなってしまうのです。これを回避するのがDPI仮想化という技術です。Windows Vistaでまずプログラムの作り方が変わり、High DPIに対応したアプリを作ることができるようになりました。そうでないアプリは、High DPI非対応(unawareアプリ)になります。