Linux (old) Newbies

古いWindows環境からLinux環境へと移り住んだ日々の出来事

X11の文字表示が汚い・・・を少しでも改善する

先の記事での続きで、Ubuntu (24.04) のデスクトップ上での文字表示の汚さが気になってしまい、なんとか改善しないかと色々とやってみたことを綴ってみます。

X11のデフォルトは 96 dpi だった

現在の X11 での dpi を確認

$ xdpyinfo | grep resolution
resolution: 96x96 dots per inch

何もしていないX11環境だと デフォルトの 96 dpi と表示されるはず。

これは Nvidia の設定画面でも確認することが出来ます。

この時点で使っている LCD パネルと dpi の値が違うというのが分かるので設定を変更することで文字表示が改善する(かも)

コマンドで設定する方法しかないみたいですが
毎回ログイン時に実行しているシェルスクリプトに次の一文を加えました

# 解像度の変更
xrandr --dpi 102

コマンドで設定すると Nvidia の方にも反映されます。

 

他にも dpi を指定するところがあったよね

そう、画面のフォント設定や外観のテーマのところに dpi 指定があったはず。
私の利用環境では Ubuntu + Xfce4 なので、フォントマネージャとXfceのデスクトップ設定に dpi の項目がありました。

それらの該当箇所へ dpi の値を設定してみたけれど、なんか今ひとつ変化が感じられず何気なくフォントマネージャが出力する ./config/fontconfig/conf.d/19-DisplayProperties.conf を見てみたところ

    <edit name="dpi" mode="assign" binding="strong">
      <double>102</double>
    </edit>

dpi の指定の箇所が double 指定になっているじゃないですか。
GUIからの値入力でも小数点1位まで入力できるし、直接に書き換えならdoubleだから正確にもっと詳細な値が指定できるかも。

そう思って小数点以下まで正確に設定したら良くなったような気がした😊

    <edit name="dpi" mode="assign" binding="strong">
      <double>102.419354839</double>
    </edit>

先の項での xrandr 設定も詳細な値に変更

# 解像度の変更
xrandr --dpi 102.419354839

 

詳細な dpi については、次の項を見てみてください。

 

より詳細なdpiを計算する

LCDバネル の dpi (ppi) は、製造メーカー側でカタログスペックで提示していますが「インチ毎に何個」なのでピッタリと整数になるはずがないでしょうって疑い。そこでどうやって dpi の値を得るかを調べてみました。

■ dpi の公表値が不明な場合は画面サイズより計算 (非推奨)
要するに画面サイズ 24 inch とか 27 inch とかの対角の長さを直角三角形の斜辺として残りの2辺を画面の縦横比率を元にして算出するという流れです。
ピタゴラスの定理よりa² + b² = 斜辺²
なので、組み合わせとして縦横の比率を 16 : 9 だとすると
16 : 9 : √(16²+9²) = 16 : 9 : 18.35756…
この比率で 24 inch 対角のLCDなら
24.0 × 2.54 = 60.96 cm として
横 = 60.96 × 16/18.357559… → 53.13124 cm、縦 = 60.96 × 9/18.357559… → 29.88632 cm)
という縦横実寸サイズが求められます。
このサイズから横方向のピクセル数で計算すると
HG画面として 1920 x 1080 を仮定

1920 / (53.13 / 2.54) = 91.789949181  約 92 PPI
まぁ単純に製品名で 24 inch と記されていても実際は 23.8 inch とか 24.1 inch だったりと色々とあるので正確に画面の対角サイズが分かる場合はさておき、製品名の画面サイズから計算してはダメですからね🙃

しかしながら、画面サイズ = 有効な表示サイズとほぼ同じという昔の CRT (ブラウン管)時代ではないので、この画面サイズと表示可能なピクセル数、画面の縦横比率から計算するというのは、全く正確な情報が何もないという場合のみしか使えない技でしょうね。

■ dpi の公表値が不明で有効表示面積のサイズより計算 (推奨)
パネルサイズ (24 inch とか) の他に 有効表示領域 の値が公表されている場合があります。この場合は先の「パネルサイズの斜辺から計算する」の計算式の最後の計算で、この実際に表示可能な画面サイズで計算することでより正確な値となります。

HG画面として 1920 x 1080 を仮定

1920 / (【画面の横の長さ】 / 2.54) = xx.xxxxxxx  約 xx PPI

■ パネル仕様のピクセルピッチから計算 (推奨)
ほとんどの場合でLCDパネルの「ピクセルピッチ」が公開されています。
(メーカー公開資料から分からない場合は https://www.displayspecifications.com/ など参照)
私の例だと ピクセルピッチが 0.248 x 0.248 mm 仕様なので
2.54 x 10 / 0.248 = 102.419354839 dpi となります

メーカーカタログでの ppi (dpi) の値は 単に 102 としか記されていませんが、結構小数点以下での違いが大きく影響するように感じます。

実際に精密な値を xrandr で設定したら Nvidiaの表示が・・・

縦横で dpi の数値が違って出るんだけど、いいのかなー。
まぁ、そーいう変なハンパな LCD パネルなのでしょうねー🤣🤣🤣

とにかく、正確な値を設定することで、白バックに黒文字でも目が痛くなりにくく、黒バックに白文字なら更に引き締まって見えるようになったように感じました。あとは組み合わせるフォント次第かなーってところです。

・・・Wayland ? 綺麗ですねー、でも動作するアプリが限られる。😛

縦と横で値が違うのが気になる

【 2026-03-10追記 】 先の Nvidia の設定表示で縦と横の dpi の数値が異なるのは Nvidia には何の問題もなくて、X11 側でそのような設定になってしまっているからでした。

$ xdpyinfo | grep  resolution
  resolution:    102x103 dots per inch

xrandr のコマンド解説を見ると --dpi で指定した値を使って実際の画面サイズから計算すると記されています。そう、この実際のサイズで参照されている値が実物と微妙に違っているために発生する誤差でそのようになるのではないかなーと。

$ xrandr | grep " connected "
HDMI-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 476mm x 268mm

この画面サイズの 縦mm と横mm が厳密なメーカー発表では 縦が 476.1mm 横が267.8mm となっていて四捨五入すれば確かに合っていますが精密ではなさそう。

そもそもメーカーが公表しているピクセルピッチの 0.248 mmというのも疑わしく思いました。(実際にカタログなどでの製品スペックと実物の仕様が異なるというのもあるらしい) そう感じたのは画面サイズと対角の長さを入力すれば dpi をサクっと計算してくれるサイトを見つけて値を見たときに、なんか自分の計算したのと結果が違ったからです。
➡️ 数値を入れると dpi を計算してくれるサイト
おそらくは画面サイズの 24 inch とかを元に計算するので実際とは違ってくるのでしょうね。

実際、メーカー公表値が合っているかピクセルピッチを計算してみると

有効表示領域から計算すると

縦 476.1 / 1920 = 0.24796875
横 267.8 / 1080 = 0.247962963

これまた小数点以下3桁で丸めると、たしかに 0.248 mm となるので正しいのだけど端数はどうするーってところです。
この端数を破棄した値を使って先述の 「ピクセルピッチを元に計算する」 というのも正確ではなさそうだと思えてきました。

最終的に納得したのは(自己満足)

【 2026-03-11追記 】計算する順番での桁落ちや値の丸めで最終結果が変わってくるなら、一気に計算すればいいのでは~と安直に考えました。
もっとも先の xrandr 内部で持っている画面サイズを元に計算される部分は変えようがないから微妙に縦横で xrandr での dpi が異なる表示となるのは解消できませんが、実際の縦横サイズ(有効表示領域)が分かっているのであれば、それを元に実寸の対角サイズを計算して何処よりも正確に結果が出せます。

今度は逆に「直角三角形の斜辺の長さは?」という計算ですね。

言葉で書くと
 表示ピクセルの対角での数 ÷ 画面の対角線の実寸(インチ)
文字で書くと
 ( √(横ピクセル² + 縦ピクセル²)) ÷ ( ( √(縦mm² + 横mm²)) ÷ (2.54 x 10))
表計算などの式で書くと
 (SQRT(横ピクセル ^ 2 + 縦ピクセル ^ 2)) / ( (SQRT(縦mm ^ 2 + 横mm ^ 2)) / (2.54 * 10))
実際の値の例だと
 (SQRT(1920 ^ 2 + 1080 ^ 2)) / ( (SQRT(476.1 ^ 2 + 267.8 ^ 2)) / (2.54 * 10))

これが途中で端数処理しないから超精密ではないかなー

でも元来、dpi の指定は整数であって、そこに小数点付き実数を設定するのは間違っているのか正解はどっちなのでしょう🤣

私は上記の一気に計算での式で算出した値にしていますが、やはりそれだと xrandr での縦横サイズが異なって見えることから、簡単に模範的な値を取るなら先の 数値を入れると dpi を計算してくれるサイト で計算した値なら少なくともメーカー公表スペックでの整数の dpi でなく、小数点2桁まで求めてくれるので有用な値となります。