gpt4 book ai didi

c# - SharpDx:设置字符宽度

转载 作者:搜寻专家 更新时间:2023-10-31 02:09:43 25 4
gpt4 key购买 nike

我正在使用 SharpDX 编写 C# Direct2D 应用程序,但是我可以理解 C++ 中提供的答案/示例。

我想呈现文本并更改某些字符的宽度以使其看起来像图片:

enter image description here

字母B扩大到200%,字母D缩小到50%

在下面的代码中,我绘制了字形的几何图形所以可以改变几何体的宽度但这不是一个很好的解决方案,因为几何绘图会像您在图片中看到的那样模糊。

enter image description here

总结起来有两个问题:

  1. 如何改变字符的宽度?

  2. 如何在不模糊的情况下绘制字母的几何图形。 (可以用 ClearType 渲染几何图形吗?)

    private void RenderGlyphRun1(FontFace1 fontFace)
    {
    var Offsets = new List<GlyphOffset>();
    var fontEmSize_ = 12;
    GlyphRun glyphRun = new GlyphRun();
    glyphRun.FontFace = fontFace;
    glyphRun.FontSize = fontEmSize_;
    glyphRun.BidiLevel = 1;
    var left = 650f;
    var top = 50f;

    var baseLine = (float)(fontFace.Metrics.LineGap + fontFace.Metrics.Ascent) /
    fontFace.Metrics.DesignUnitsPerEm * glyphRun.FontSize;

    string textToDraw = "ABCDE";
    foreach (char letter in textToDraw)
    {
    Offsets.Add(new GlyphOffset());
    }

    var charArr = textToDraw.Select(x => (int)x).ToArray();
    glyphRun.Indices = fontFace.GetGlyphIndices(charArr);

    var metrics = fontFace.GetDesignGlyphMetrics(glyphRun.Indices, false);
    glyphRun.Advances = metrics.Select(x => (float)x.AdvanceWidth /
    fontFace.Metrics.DesignUnitsPerEm * glyphRun.FontSize).ToArray();

    glyphRun.Offsets = Offsets.ToArray();

    RenderTarget2D.BeginDraw();
    RenderTarget2D.Clear(SharpDX.Color.White);

    RenderTarget2D.DrawGlyphRun(new Vector2(left, top),
    glyphRun, new SharpDX.Direct2D1.SolidColorBrush(RenderTarget2D, SharpDX.Color.Black),
    MeasuringMode.Natural);

    top += baseLine;

    var pathGeometry = new PathGeometry(Factory2D);
    var geometrySink = pathGeometry.Open();

    fontFace.GetGlyphRunOutline(glyphRun.FontSize, glyphRun.Indices,
    glyphRun.Advances, glyphRun.Offsets, glyphRun.IsSideways,
    glyphRun.BidiLevel % 2 != 0, geometrySink);

    geometrySink.Close();
    geometrySink.Dispose();
    fontFace.Dispose();

    var matrix = new Matrix3x2()
    {
    M11 = 1,
    M12 = 0,
    M21 = 0,
    M22 = 1,
    M31 = left,
    M32 = top
    };

    var transformedGeometry = new TransformedGeometry(Factory2D, pathGeometry, matrix);
    var brushColor = (Color4)SharpDX.Color.Black;
    var brush = new SolidColorBrush(RenderTarget2D, brushColor);
    RenderTarget2D.FillGeometry(transformedGeometry, brush);

    pathGeometry.Dispose();
    transformedGeometry.Dispose();
    brush.Dispose();

    RenderTarget2D.EndDraw();
    }

最佳答案

由于有些字母应该是窄的,有些是正常的,有些是宽的,你不能使用一个 GlyphRun,而必须创建 3 个不同的 GlyphRun

要使任何 GlyphRun 的所有字母变宽或变窄:

  1. Transform配置为RenderTarget
  2. 绘制GlyphRun
  3. 返回原来的Transform

宽变换:RenderTarget2D.Transform = new SharpDX.Mathematics.Interop.RawMatrix3x2(1.5f, 0, 0, 1, 0, 0);

窄变换:RenderTarget2D.Transform = new SharpDX.Mathematics.Interop.RawMatrix3x2(0.5f, 0, 0, 1, 0, 0);

采用此解决方案后,您无需将 GlyphRun 转换为 geometry 并混入模糊字母。

关于c# - SharpDx:设置字符宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46321771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com