WPF DrawingContext DrawGlyphRun模糊文本

时间:2017-01-04 15:03:03

标签: wpf drawingcontext

我正在使用DrawingContext DrawGlyphRun(GlyphRun)函数使用https://smellegantcode.wordpress.com/2008/07/03/glyphrun-and-so-forth/中的解决方案在Canvas中绘制文本。

我在FormattedText上使用它,因为它更快,它也用于计算文本宽度。

除了2个问题之外,这很有效:

  1. 文字模糊(见下图)。使用GlyphRun显示顶部的文本。使用FormattedText显示底部文本,该文本具有更好的质量。
  2. Blur Image

    1. 无法显示日文或中文字符。
    2. 字符问题似乎是GlyphTypeface.CharacterToGlyphMap无法找到jp或cn字符,所以我不确定如何处理这些字符。

1 个答案:

答案 0 :(得分:1)

在我做了一些研究之后,我刚刚找到了你的问题。

使用公共构造函数创建的GlyphRun创建具有TextFormattingMode = Ideal

的对象

所有WPF控件的rendring使用方法/构造函数接受TextFormattingMode作为参数。

您可以通过反射调用GlyphRun.TryCreate()静态方法:

internal static GlyphRun TryCreate(
        GlyphTypeface           glyphTypeface,
        int                     bidiLevel,
        bool                    isSideways,
        double                  renderingEmSize,
        IList<ushort>           glyphIndices,
        Point                   baselineOrigin,
        IList<double>           advanceWidths,
        IList<Point>            glyphOffsets,
        IList<char>             characters,
        string                  deviceFontName,
        IList<ushort>           clusterMap,
        IList<bool>             caretStops,
        XmlLanguage             language,
        TextFormattingMode      textLayout
        )

但是您需要advanceWidths获取TextFormattingMode = Ideal的问题。为此,您需要通过反射访问GlyphTypeface类提供的内部方法。

返回具有这些宽度的字典的

GlyphTypeface.AdvanceWidths属性在内部调用

internal double GetAdvanceWidth(ushort glyph, TextFormattingMode textFormattingMode, bool isSideways)

使用textFormattingMode = TextFormattingMode.Ideal

按索引访问字典时

您可以下载.Net源代码并自行检查。

关于你的第二个问题,我认为你使用chars而不是unicode代码点来获得字形索引。