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

来源:https://www.cnblogs.com/czwy/p/18068823
-Advertisement-
Play Games

11.1.0-beta1 Avalonia 是 dotnet 的跨平臺 UI 框架,提供靈活的樣式系統,支持 Windows、macOS、Linux、iOS、Android 和 WebAssembly 等多種平臺。 Avalonia 已經成熟並已做好生產準備,已被 Schneider Electri ...


有網友問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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2024年3月4日,官方宣佈推出 Claude 3 模型系列,它在廣泛的認知任務中樹立了新的行業基準。該系列包括三個按能力遞增排序的最先進模型:Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus。每個後續模型都提供越來越強大的性能,允許用戶為其特定應用選擇智 ...
  • 大家好,我是你們的老伙計秀才!今天帶來的是[深入淺出Java多線程]系列的第十一篇內容:AQS(*AbstractQueuedSynchronizer*)。大家覺得有用請點贊,喜歡請關註!秀才在此謝過大家了!!! ...
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹如何運用`QNetworkAccessManager`組件實現Web網頁訪問。QNetworkAccessMana... ...
  • 前言 關於動態代理的一些知識,以及cglib與jdk動態代理的區別,在這一篇已經介紹過,不熟悉的可以先看下。 本篇我們來學習一下cglib的FastClass機制,這是cglib與jdk動態代理的一個主要區別,也是一個面試考點。 我們知道jdk動態代理是使用InvocationHandler介面,在 ...
  • 本文主要介紹了設計模式中的狀態模式,然後在這個基礎上介紹了Spring狀態機相關的概念,並根據常見的訂單流轉場景,介紹了Spring狀態機的使用方式。 ...
  • F-String(格式化字元串字面值)是在Python 3.6中引入的,它是一種非常強大且靈活的字元串格式化方法。 它允許你在字元串中嵌入表達式,這些表達式在運行時會被求值並轉換為字元串,這種特性使得F-String在編寫Python代碼時能夠更簡潔、更直觀地處理字元串。 本文總結了5個實用的F-S ...
  • 概述:在WPF中,通過使用不同的元素如Ellipse、Line、Rectangle等,可以輕鬆繪製各種圖形,包括圓、線條、橢圓、矩形、多邊形等。同時,通過TextBlock展示文字,Image展示圖片,以及Path創建路徑和曲線,使得圖形的繪製變得靈活多樣。通過簡單的XAML代碼,開發者可以快速構建 ...
  • 程式能運行,就是告訴你RZ10012,然後各種提示沒有了。 清理解決方案、電腦重啟了都沒有用,後來搜索到github,解決了,記一下: 關閉vs 刪除文件夾 .vs,bin,object 打開vs,重新生成解決方案 也是醉了。 文字少的博文不允許投稿到該網站分類? 知道什麼叫短小精悍嗎?知道什麼叫短 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...