字体文件处理库Aspose.Font功能教学:使用C#渲染具有TrueType和Type1字体的文本

在数字排版中,字体定义了用于字符外观的特定样式。通常,在文档和 页中使用字体来样式化文本。每种字体都在一个文件中进行了描述,该文件包含有关字符的大小,粗细,样式和编码的信息。

对于此类情况,Aspose提供了专用的API——

整合所有格式API处理控件Aspose永久授权正在 火热销售中,新购乐享85折起!联系客服立马1分钟了解全部咨询!

实施文本渲染界面

为了实现文本呈现,.NET的Aspose.Font提供了IGlyphOutlinePainter接口来绘制字形。以下步骤演示了如何在IGlyphOutlinePainter中实现这些方法。

  • 使用GlyphOutlinePainter类实现IGlyphOutlinePainter接口方法,该类需要一个类型为System.Drawing.Drawing2D.GraphicsPath的对象才能绘制图形。
    class GlyphOutlinePainter : IGlyphOutlinePainter{    private System.Drawing.Drawing2D.GraphicsPath _path;    private System.Drawing.PointF _currentPoint;    public GlyphOutlinePainter(System.Drawing.Drawing2D.GraphicsPath path)    {        _path = path;    }    public void MoveTo(MoveTo moveTo)    {        _path.CloseFigure();        _currentPoint.X = (float)moveTo.X;        _currentPoint.Y = (float)moveTo.Y;    }    public void LineTo(LineTo lineTo)    {        float x = (float)lineTo.X;        float y = (float)lineTo.Y;        _path.AddLine(_currentPoint.X, _currentPoint.Y, x, y);        _currentPoint.X = x;        _currentPoint.Y = y;    }    public void CurveTo(CurveTo curveTo)    {        float x3 = (float)curveTo.X3;        float y3 = (float)curveTo.Y3;        _path.AddBezier(                  _currentPoint.X,                  _currentPoint.Y,                  (float)curveTo.X1,                  (float)curveTo.Y1,                  (float)curveTo.X2,                  (float)curveTo.Y2,                  x3,                  y3);        _currentPoint.X = x3;        _currentPoint.Y = y3;    }    public void ClosePath()    {        _path.CloseFigure();    }}
  • 创建一个新方法DrawText()将文本绘制到System.Drawing.Bitmap对象中。
    static void DrawText(string text, IFont font, double fontSize,            Brush backgroundBrush, Brush textBrush, string outFile){    //Get glyph identifiers for every symbol in text line    GlyphId[] gids = new GlyphId[text.Length];    for (int i = 0; i < text.Length; i++)        gids[i] = font.Encoding.DecodeToGid(text[i]);    // set common drawing settings    double dpi = 300;    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi    // prepare output bitmap    Bitmap outBitmap = new Bitmap(960, 720);    outBitmap.SetResolution((float)dpi, (float)dpi);    Graphics outGraphics = Graphics.FromImage(outBitmap);    outGraphics.FillRectangle(backgroundBrush, 0, 0, outBitmap.Width, outBitmap.Height);    outGraphics.SmoothingMode = SmoothingMode.HighQuality;    //declare coordinate variables and previous gid    GlyphId previousGid = null;    double glyphXCoordinate = 0;    double glyphYCoordinate = fontSize * resolutionCorrection;    //loop which paints every glyph in gids    foreach (GlyphId gid in gids)    {        // if the font contains the gid        if (gid != null)        {            Glyph glyph = font.GlyphAccessor.GetGlyphById(gid);            if (glyph == null)                continue;            // path that accepts drawing instructions            GraphicsPath path = new GraphicsPath();            // Create IGlyphOutlinePainter implementation            GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);            // Create the renderer            Aspose.Font.Renderers.IGlyphRenderer renderer = new                Aspose.Font.Renderers.GlyphOutlineRenderer(outlinePainter);            // get common glyph properties            double kerning = 0;            // get kerning value            if (previousGid != null)            {                kerning = (font.Metrics.GetKerningValue(previousGid, gid) /                           glyph.SourceResolution) * fontSize * resolutionCorrection;                kerning += FontWidthToImageWith(font.Metrics.GetGlyphWidth(previousGid),                        glyph.SourceResolution, fontSize);            }            // glyph positioning - increase glyph X coordinate according to kerning distance            glyphXCoordinate += kerning;            // Glyph placement matrix            TransformationMatrix glyphMatrix =                new TransformationMatrix(                    new double[]                            {                                    fontSize*resolutionCorrection,                                    0,                                    0,                                // negative because of bitmap coordinate system begins from the top                                    - fontSize*resolutionCorrection,                                    glyphXCoordinate,                                    glyphYCoordinate                            });            // render current glyph            renderer.RenderGlyph(font, gid, glyphMatrix);            // fill the path            path.FillMode = FillMode.Winding;            outGraphics.FillPath(textBrush, path);        }        //set current gid as previous to get correct kerning for next glyph        previousGid = gid;    }    //Save results    outBitmap.Save(outFile);}
  • 定义一种实用程序方法,以根据图像的宽度计算字体的宽度。
    static double FontWidthToImageWith(double width, int fontSourceResulution, double fontSize, double dpi = 300){    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi    return (width / fontSourceResulution) * fontSize * resolutionCorrection;}

使用C#渲染具有TrueType字体的文本

下面的代码示例演示如何使用上述实现通过C#使用TrueType字体呈现文本。

string dataDir = RunExamples.GetDataDir_Data();string fileName1 = dataDir + "Montserrat-Bold.ttf"; //Font file name with full pathFontDefinition fd1 = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName1)));TtfFont ttfFont1 = Aspose.Font.Font.Open(fd1) as TtfFont;    string fileName2 = dataDir + "Lora-Bold.ttf"; //Font file name with full pathFontDefinition fd2 = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName2)));TtfFont ttfFont2 = Aspose.Font.Font.Open(fd2) as TtfFont;DrawText("Hello world", ttfFont1, 14, Brushes.White, Brushes.Black, dataDir + "hello1_montserrat_out.jpg");DrawText("Hello world", ttfFont2, 14, Brushes.Yellow, Brushes.Red, dataDir + "hello2_lora_out.jpg");

使用C#渲染Type1字体的文本

下面的代码示例演示如何使用C#以Type1字体呈现文本。

string fileName = dataDir + "courier.pfb"; //Font file name with full pathFontDefinition fd = new FontDefinition(FontType.Type1, new FontFileDefinition("pfb", new FileSystemStreamSource(fileName)));Type1Font font = Aspose.Font.Font.Open(fd) as Type1Font;            DrawText("Hello world", font, 14, Brushes.White, Brushes.Black, dataDir + "hello1_type1_out.jpg");DrawText("Hello world", font, 14, Brushes.Yellow, Brushes.Red, dataDir + "hello2_type1_out.jpg");


还想要更多吗可以点击阅读【2020 · Aspose最新资源整合】查找需要的教程资源。如果您有任何疑问或需求,请随时加入Aspose技术交流群(),我们很高兴为您提供查询和咨询
标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年8月17日
下一篇 2020年8月18日

相关推荐

发表回复

登录后才能评论