商道如狼道 发表于 2024-5-13 21:11:18

探究WPF中文字模糊的问题:TextOptions的用法

有网友问WPF中一些文字模糊是什么问题。之前我也没有认真思索过这个问题,只是大概知道和WPF的像素对齐(pixel snapping)、抗锯齿(anti-aliasing)有关,通过设置附加属性TextOptions.TextFormattingMode或者TextOptions.TextRenderingMode来解决。这次我也查了下资料,了解了这几个附加属性的取值范围以及用法。
像素对齐和抗锯齿

我们经常听到WPF具有分辨率无关性这个说法,由于WPF使用的是与装备无关的绘图系统,为字体和外形等内容指定大小或者尺寸的数值并不是真实的像素,在WPF中称之为装备无关单位。渲染过程中,WPF会自动把装备无关单位转换为物理像素,由于装备的差异以及DPI设置不同,转换之后的像素很少是整数,然而无法使用零点几个像素点去绘制,WPF会使用抗锯齿特性进行补偿。
例如绘制一条62.4992个像素长的红线时,WPF会正常填充前62个像素,然后使用直线颜色(赤色)和背景色之间的颜色为第63个像素着色,但这个补偿也会带来新的问题,在绘制直线、矩形或者具有直角的多边形时,抗锯齿特性导致外形边缘出现一片模糊的区域。在实际应用中的体现就是前边说的文字模糊,奇数单位宽度的直线两侧有很细的淡色边缘,如果直线宽度只有1个装备无关单位,肉眼看到的线条颜色会比实际指定的颜色要浅一点。
TextOptions的使用

TextOptions定义一组影响文本在元素中的体现方式的附加属性。总共包含三个附加属性:TextFormattingMode、TextHintingMode、TextRenderingMode。这三个附加属性范例都是与属性同名的枚举范例。
TextFormattingMode附加属性

TextFormattingMode附加属性用于切换WPF在格式化文本时使用的文本度量。取值范围如下:
枚举名值说明Ideal0指示 TextFormatter 使用抱负的字体规格结构文本。Display1指示 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附加属性用于控制渲染文字时使用的抗锯齿算法。取值范围如下:
枚举名值说明Auto0根据用于设置文本格式的结构模式,使用最合适的出现算法出现文本。除非操作系统已经被设置为在本机禁用ClearType,该模式将使用ClearType。Aliased1使用双层抗锯齿功能出现文本。(有的地方说不使用抗锯齿算法)Grayscale2使用灰度抗锯齿功能出现文本。ClearType3使用最合适的ClearType出现算法出现文本。通常环境,不必要对该属性进行设置,除非操作系统已经设置在本机禁用ClearType,默认是会使用ClearType出现算法出现文本。在液晶体现器环境,ClearType技术增强了文本的清楚度和可读性。
ClearType使用亚像素出现技术,通过将字符对齐到像素的小数部门,以更高的保真度体现文本的真实外形。超高的分辨率增长了文本体现中细节的清楚度,使其更便于长时间阅读。WPF中ClearType可以朝Y轴方向抗锯齿,使文本字符中平缓曲线的顶端和底端变得平滑。
TextHintingMode附加属性

TextHintingMode附加属性用于设置静态文本或动态文本的出现行为。取值范围如下:
枚举名值说明Auto0自动确定是否使用实用于动画文本或静态文本的质量设置来绘制文本。Fixed1以最高静态质量出现文本。Animated2以最高动画质量出现文本。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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 探究WPF中文字模糊的问题:TextOptions的用法