彩票走势图

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

翻译|使用教程|编辑:李显亮|2020-09-21 09:47:11.320|阅读 561 次

概述:Aspose最新推出专用的API——Aspose.Font,用于处理和渲染包括TrueType,CFF,OpenType和Type1在内的流行字体类型。本文将介绍如何使用C#呈现TrueType和Type1字体的文本。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

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

对于此类情况,Aspose提供了专用的API——Aspose.Font,用于处理和渲染包括TrueType,CFF,OpenType和Type1在内的流行字体类型。

上一篇文章中,您已经了解了如何使用Aspose.Font for .NET API来以编程方式加载和保存CFF,TrueType和Type1字体。在本文中,将学习如何使用C#呈现TrueType和Type1字体的文本。

点击下载最新版Aspose.Font for .NET

整合所有格式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 path
FontDefinition 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 path
FontDefinition 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 path

FontDefinition 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技术交流群(642018183),我们很高兴为您提供查询和咨询

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP