探究WPF中文字模糊的問題:TextOptions的用法

czwy發表於2024-03-12

有網友問WPF中一些文字模糊是什麼問題。之前我也沒有認真思考過這個問題,只是大概知道和WPF的畫素對齊(pixel snapping)、抗鋸齒(anti-aliasing)有關,透過設定附加屬性TextOptions.TextFormattingMode或者TextOptions.TextRenderingMode來解決。這次我也查了下資料,瞭解了這幾個附加屬性的取值範圍以及用法。

畫素對齊和抗鋸齒

我們經常聽到WPF具有解析度無關性這個說法,因為WPF使用的是與裝置無關的繪圖系統,為字型和形狀等內容指定大小或者尺寸的數值並不是真實的畫素,在WPF中稱之為裝置無關單位。渲染過程中,WPF會自動把裝置無關單位轉換為物理畫素,由於裝置的差異以及DPI設定不同,轉換之後的畫素很少是整數,然而無法使用零點幾個畫素點去繪製,WPF會使用抗鋸齒特性進行補償。

例如繪製一條62.4992個畫素長的紅線時,WPF會正常填充前62個畫素,然後使用直線顏色(紅色)和背景色之間的顏色為第63個畫素著色,但這個補償也會帶來新的問題,在繪製直線、矩形或者具有直角的多邊形時,抗鋸齒特性導致形狀邊緣出現一片模糊的區域。在實際應用中的體現就是前邊說的文字模糊,奇數單位寬度的直線兩側有很細的淡色邊緣,如果直線寬度只有1個裝置無關單位,肉眼看到的線條顏色會比實際指定的顏色要淺一點。

TextOptions的使用

TextOptions定義一組影響文字在元素中的顯示方式的附加屬性。總共包含三個附加屬性:TextFormattingModeTextHintingModeTextRenderingMode。這三個附加屬性型別都是與屬性同名的列舉型別。

TextFormattingMode附加屬性

TextFormattingMode附加屬性用於切換WPF在格式化文字時使用的文字度量。取值範圍如下:

列舉名 說明
Ideal 0 指示 TextFormatter 使用理想的字型規格佈局文字。
Display 1 指示 TextFormatter 使用 GDI 相容字型規格佈局文字。

官方文件上的這個描述看起來似乎很直觀,但並不容易理解它倆的區別以及開發過程中選取哪一個值。

  • Ideal:自推出WPF以來一直用於格式化文字的度量。繪製的字型形狀與字型檔案中的輪廓保持高保真。建立字形點陣圖或者字形與字形之間的相對定位時,不會考慮最終位置。
  • Display:WPF4.0中引入的新的格式化文字的度量模式。它使用GDI相容的文字度量。該模式下每個字形的寬度都是整數個畫素,字形的大小和換行與基於GDI的框架相似(比如WinForm)。這也就意味著字形的大小和換行不完全準確。

兩種模式都有各自的優勢和缺點,Ideal模式可以提供最佳的字形和間距,減少使用者閱讀疲勞,但是在較小的字型情況下,文字渲染會模糊。Display模式則是犧牲字型形狀和間距為代價,提供畫素對齊的清晰的文字。
大多數情況下,兩種模式渲染的文字效果差異很小,Display模式主要是解決較小字型情況下文字模糊的問題。Ideal模式在大於15pt的字型情況下,和Display模式渲染的文字一樣清晰,且具有更好的字形和間距。此外以下三種情況也應選擇Ideal模式。

  • 變換文字:Display模式只有在字形繪製在完整的畫素上時才有清晰的效果,對文字進行變換時,Display模式的畫素對齊存在偏差,因為該模式的最佳化是在所有變換之前應用的,應用變換後將不再對齊到畫素邊界,從而導致文字模糊。而Ideal模式在任何地方繪製文字都具有同樣的渲染效果。
  • 縮放文字:縮放其實也是變換的一種形式,但相比其他的2D變換,Display模式在縮放文字時渲染的效果更差,主要是因為該模式下的文字度量不會隨著縮放倍數線性變化,為了保持縮放的準確性,Display模式是對原始尺寸文字的點陣圖進行縮放,這導致在任何明顯尺度變化時產生模糊和偽影。
  • 字形高保真:對字形有非常高的要求時,Ideal模式具有更好的效果,這也是Ideal模式的主要優勢之一。

TextRenderingMode附加屬性

TextRenderingMode附加屬性用於控制渲染文字時使用的抗鋸齒演算法。取值範圍如下:

列舉名 說明
Auto 0 根據用於設定文字格式的佈局模式,使用最合適的呈現演算法呈現文字。除非作業系統已經被設定為在本機禁用ClearType,該模式將使用ClearType。
Aliased 1 使用雙層抗鋸齒功能呈現文字。(有的地方說不使用抗鋸齒演算法)
Grayscale 2 使用灰度抗鋸齒功能呈現文字。
ClearType 3 使用最合適的ClearType呈現演算法呈現文字。

通常情況,不需要對該屬性進行設定,除非作業系統已經設定在本機禁用ClearType,預設是會使用ClearType呈現演算法呈現文字。在液晶顯示器環境,ClearType技術增強了文字的清晰度和可讀性。

ClearType使用亞畫素呈現技術,透過將字元對齊到畫素的小數部分,以更高的保真度顯示文字的真實形狀。超高的解析度增加了文字顯示中細節的清晰度,使其更便於長時間閱讀。WPF中ClearType可以朝Y軸方向抗鋸齒,使文字字元中平緩曲線的頂端和底端變得平滑。

TextHintingMode附加屬性

TextHintingMode附加屬性用於設定靜態文字或動態文字的呈現行為。取值範圍如下:

列舉名 說明
Auto 0 自動確定是否使用適用於動畫文字或靜態文字的質量設定來繪製文字。
Fixed 1 以最高靜態質量呈現文字。
Animated 2 以最高動畫質量呈現文字。

Fixed模式使用的演算法針對視覺上精確的字型平滑效果進行最佳化,但是將動畫應用於字型元素的屬性時,可能導致效能問題以及抖動,尤其是對於 轉換和投影。Animated模式透過使用一個更高效、但視覺精確下降的平滑演算法來針對動畫進行最佳化。

參考

https://devblogs.microsoft.com/visualstudio/wpf-text-clarity-improvements/

https://learn.microsoft.com/en-us/archive/blogs/text/additional-wpf-text-clarity-improvements

https://learn.microsoft.com/en-us/archive/blogs/text/wpf-4-0-text-stack-improvements

相關文章