Windowsのディスプレイとモニター いまだ96DPIが基準
いまだに96DPIをベースにした表示がなされるWindows
Windowsでは、いまだに96DPI(Dot Per Inch)をベースにした表示が行なわれている。また、あまり目立たない場所にあるが、「設定」→「システム」→「ディスプレイ」にある「テキスト、アプリ、その他の項目のサイズを変更する」で倍率を変更できるようになっている。
「設定」→「システム」→「ディスプレイ」でモニターを選択して表示倍率を変更することができる
このうち、100%は対応するモニターが96DPIであることに対応し、125%と150%は、それぞれ120DPIと144DPIに相当する。この設定は、対象のモニターのドット密度(1インチの中に何ドットあるのか)、あるいは、ドットのサイズを指定するものだ。かつてはDPI設定と呼んでいたが、Winodws 8あたりから「%」を使った表示倍率に変更になった。
この値はなんで必要なのかというと、文字の大きさの基準とするためだ。もともと紙の印刷では、活字の大きさを物理的な長さと連動した「ポイント」という単位で表記していた。しかし、昔は長さの単位や紙の大きさは各国でバラバラだった。それでも、紙に文字を印刷するには文字の大きさを物理的な長さとして把握する必要がある。そこで活字のポイント数から紙の上に並べることができる文字の数を簡単に計算できるように、1インチに対するポイント数を決めた。
たとえば、72ポイントが1インチに相当するという感じである。それでもインチの定義が各国で違うことにくわえ、ポイント自体も国や地域、企業などによって違っていたため、複数のポイントが生まれた。
コンピューターで組版をするとき、米国のポイントシステム(アメリカンポイント)に近い値として、1/72国際インチを1ポイントとする「DTPポイント」が定義される。コンピューターの画面に表示したものをそのままプリンターにも出力できるという「WYSIWYG」を実現する際に、画面上の最小単位であるドットを1ポイントとすることでポイントでの指定を可能にできた。1/72インチを1ポイントとすると、そのドット密度は72DPIになる。しかし、Windowsの基準はいまだに96DPIなのだ。
Windowsにおいてなぜ96DPIが基準になったのか?
Windowsは最初からプリンターの存在を考慮し、WYSIWYGを目標にしていた。このため、どうしてもディスプレイ上の文字と印刷文字との関係を定義する必要があった。しかし、PCの世界では多くのサードパーティーとともにディスプレイカードの解像度もさまざまなものが登場。そうした多様な解像度に対応する、多様な画面サイズのモニターが存在した。この結果、PCではDPI値を実際の値とすることはできず、論理値として扱うしかできなかった。そのときに選ばれたのが96DPIという値なのだ。
この96DPIは、実は72DPIを1/3だけ増やしたもの。72DPIの4/3とも言い換えることができる。なぜ1/3を増やしたのか? Microsoftによれば、これは、ディスプレイと紙の印刷物では、目からの距離が異なるため、その分を調整したのだという。
Microsoftの文書によれば、72DPIで作成した印刷文書とディスプレイ画面を見比べたとき、ディスプレイのほうが奥にあり、視点から遠くなる。このとき、印刷物と目までの距離に対して、約1/3ほどディスプレイは遠くなり、1/3だけ文字を大きくすることで印刷物とディスプレイが同じサイズで見えるようになる理屈だ
紙の印刷物は手に持って見るため、当然目の近くで見ることが多い。これに対して、PCの画面は手が届く範囲にあるキーボードよりも奥にディスプレイがある(当時のPCはCRTモニターを接続したデスクトップPCが基本)。そうなると、ディスプレイに紙と同じ大きさで文字を表示しても、ユーザーには文字が小さく見えてしまう。Microsoftの推定では、印刷物を見るよりも1/3ほど奥にディスプレイがあることが多いため、補正の結果で出てきた値が96DPIなのである。
画面上の文字サイズは、具体的にはドット数で大きさが決まる。同じモニターなら16×16ドットの文字よりも、24×24ドットの文字のほうが大きく見える。これをDPI値で表現するとより大きなDPI値が必要になる。72DPIを想定したモニターに対して、96DPIであるとWindowsが通知することで、アプリが表示する画面上の文字サイズは、手前にある紙の同ポイントの文字と同程度に見えるはずである
ただし、これはあくまでも論理的な話。実際には高解像度で小さなディスプレイもあれば、大きいのに解像度が高くないディスプレイもある。また、目とディスプレイの距離もタブレットなどではかなり短くなる。そこでWindowsでは、ユーザーがDPI値を設定できるようにしてある。
Windowsの起動中に表示倍率を変更したらどうなるのか
Windows 10では冒頭で紹介したようにDPI値ではなく、「表示倍率」で設定するようになっている。これはユーザーの“感覚”に反さないような表現をとったのだと考えられる。DPI値は、ドットの密度を表していると考えると密度が高くなることは、表示が細かくなると思いがちだ。しかし、実際には、物理的なサイズが変わらないモニターを見ているわけで、DPI値が大きくなるということは、同じ文字でもより多くのドットを使って表現されるため、モニター内では大きくなって見える。
これは、ドット密度という数値から想像するものとは逆の挙動である。そこで表示倍率を%で表記したものを設定するようになった。「倍率」なら、数値が大きくなれば、文字やウィンドウが大きくなることは多くの人の想像を裏切らない。
基本的な設定においては、100%から25%刻みで200%まで設定できるが、「設定」→「表示スケールの詳細設定」では、100~500%を1%刻みで可能。また、設定を簡単にするため、Windowsは推奨値を示す。たとえば、4Kディスプレイでは150%が推奨値となっている。
この表示倍率を変更すると、アプリケーションの種類により、動作が違う。たとえば、旧来のWin32アプリには何も通知されないので、表示拡大率が変更されたことをアプリ側は検出できない代わりに、Windowsが勝手にウィンドウやフォントのサイズを調整する(プロパティで変更できる)。
UWPアプリに関しては、自動でアプリの表示が表示倍率に追従する。またWPFでは、ディスプレイの解像度を変更し、表示倍率に追従させる。たとえば、4Kディスプレイ(3840×2160ドット)は、125%になると、2560×1440の解像度のモニターの中で動作しているような環境になる。解像度を低くしてしまうと、画面上の同じ位置でも座標値が変わる。たとえば、X座標が1024のとき、125%に変更されると819.2と中途半端な値になってしまうが、WPFでは座標値を整数ではなく、浮動小数点値で持つことでこの問題に対応する。
.NET FrameworkにあるScreenクラスは、モニターの解像度を報告するが、その値は、表示倍率で変換された解像度であり、これを使って、たとえば、モニターの中央にウィンドウを置くといった処理をする場合でも座標値が浮動小数点であるため、正しく画面の中央に配置できる。
Screenクラスは、モニターの解像度や原点位置を報告する。表示倍率を変更するとDISPLAY7の解像度が変わる
ディスプレイサイズが拡大し始めたのは、液晶ディスプレイが普及し始めた後だ。Windowsが登場したころはまだCRTが中心で大型モニタが作りにくかった。液晶パネルを切り出すためのガラス板が大型化できるようになると、大型テレビやディスプレイの価格が下がったが、サイズ的な成長はある程度で止まることになると思われる。あまり大きくなると視点の移動が大きすぎてかえって疲れてしまうからだ。筆者の感覚ではPCのディスプレイは、30インチ程度が限界で、このくらいのサイズで4Kから8Kと解像度が上がっていくのではないかと思われる。