我正在使用 SharpDX 编写 C# Direct2D 应用程序,但是我可以理解 C++ 中提供的答案/示例。
我想渲染文本并更改某些字符的宽度,使其看起来像图片:
字母 B 扩大到 200%,字母 D 缩小到 50%
在下面的代码中,我绘制了字形的几何图形因此可以更改几何图形的宽度但这不是一个好的解决方案,因为几何图形绘制出来的效果就像您在图片中看到的那样模糊。
总之,有两个问题:
如何更改字符的宽度?
如何在不模糊的情况下绘制字母的几何形状。(可以用 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(); }