rendre du texte à l'aide de polices

Dans le post précédent, vous avez vu comment utiliser l’API Aspose.Font for .NET pour charger et enregistrer CFF, TrueType et Type1 polices par programme. Dans cet article, vous apprendrez à rendre du texte avec des polices TrueType et Type1 à l’aide de C#. Les exemples de code vous montreront comment générer une image JPG basée sur le texte fourni.

API de rendu des polices .NET - Installation

Aspose.Font for .NET fournit un puissant mécanisme de rendu des polices afin de restituer le texte à l’aide des polices TrueType et Type1. Vous pouvez télécharger l’API ou l’installer à l’aide de NuGet.

PM> Install-Package Aspose.Font

Implémenter l’interface de rendu de texte

Afin d’obtenir le rendu du texte, Aspose.Font for .NET fournit une interface IGlyphOutlinePainter pour dessiner les glyphes. Les étapes suivantes montrent comment implémenter les méthodes dans IGlyphOutlinePainter.

  • Implémentez les méthodes d’interface IGlyphOutlinePainter à l’aide de la classe GlyphOutlinePainter qui nécessite un objet de type System.Drawing.Drawing2D.GraphicsPath pour dessiner des graphiques.
// Pour des exemples complets et des fichiers de données, rendez-vous sur https://github.com/aspose-font/Aspose.Font-for-.NET
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();
    }
}
// Pour des exemples complets et des fichiers de données, rendez-vous sur https://github.com/aspose-font/Aspose.Font-for-.NET
static void DrawText(string text, IFont font, double fontSize,
            Brush backgroundBrush, Brush textBrush, string outFile)
{
    //Obtenir des identifiants de glyphe pour chaque symbole dans la ligne de texte
    GlyphId[] gids = new GlyphId[text.Length];
    for (int i = 0; i < text.Length; i++)
        gids[i] = font.Encoding.DecodeToGid(text[i]);
    // définir les paramètres de dessin communs
    double dpi = 300;

    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
    // préparer le bitmap de sortie
    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;
    //déclarer les variables de coordonnées et le gid précédent
    GlyphId previousGid = null;
    double glyphXCoordinate = 0;
    double glyphYCoordinate = fontSize * resolutionCorrection;
    //boucle qui peint chaque glyphe dans gids
    foreach (GlyphId gid in gids)
    {
        // si la police contient le gid
        if (gid != null)
        {
            Glyph glyph = font.GlyphAccessor.GetGlyphById(gid);
            if (glyph == null)
                continue;

            // chemin qui accepte les instructions de dessin
            GraphicsPath path = new GraphicsPath();

            // Créer une implémentation IGlyphOutlinePainter
            GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);

            // Créer le moteur de rendu
            Aspose.Font.Renderers.IGlyphRenderer renderer = new
                Aspose.Font.Renderers.GlyphOutlineRenderer(outlinePainter);

            // obtenir les propriétés communes des glyphes
            double kerning = 0;

            // obtenir la valeur de crénage
            if (previousGid != null)
            {
                kerning = (font.Metrics.GetKerningValue(previousGid, gid) /
                           glyph.SourceResolution) * fontSize * resolutionCorrection;
                kerning += FontWidthToImageWith(font.Metrics.GetGlyphWidth(previousGid),
                        glyph.SourceResolution, fontSize);
            }

            // positionnement du glyphe - augmente la coordonnée X du glyphe en fonction de la distance de crénage
            glyphXCoordinate += kerning;

            // Matrice de placement des glyphes
            TransformationMatrix glyphMatrix =
                new TransformationMatrix(
                    new double[]
                            {
                                    fontSize*resolutionCorrection,
                                    0,
                                    0,
                                // négatif car le système de coordonnées bitmap commence par le haut
                                    - fontSize*resolutionCorrection,
                                    glyphXCoordinate,
                                    glyphYCoordinate
                            });

            // rendre le glyphe actuel
            renderer.RenderGlyph(font, gid, glyphMatrix);
            // remplir le chemin
            path.FillMode = FillMode.Winding;
            outGraphics.FillPath(textBrush, path);
        }
        //définir le gid actuel comme précédent pour obtenir le crénage correct pour le glyphe suivant
        previousGid = gid;
    }
    //Enregistrer les résultats
    outBitmap.Save(outFile);
}
  • Définissez une méthode utilitaire pour calculer la largeur de la police en fonction de la largeur de l’image.
// Pour des exemples complets et des fichiers de données, rendez-vous sur https://github.com/aspose-font/Aspose.Font-for-.NET
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;
}

Rendu du texte avec la police TrueType à l’aide de C#

L’exemple de code suivant montre comment utiliser l’implémentation mentionnée ci-dessus pour restituer du texte avec une police TrueType à l’aide de C#.

// Pour des exemples complets et des fichiers de données, rendez-vous sur https://github.com/aspose-font/Aspose.Font-for-.NET
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");

Rendu du texte avec la police Type1 à l’aide de C#

L’exemple de code suivant montre comment restituer du texte avec une police Type1 à l’aide de C#.

// Pour des exemples complets et des fichiers de données, rendez-vous sur https://github.com/aspose-font/Aspose.Font-for-.NET
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");

Conclusion

Dans cet article, vous avez appris à implémenter le rendu de texte avec une police TrueType ou Type1 à l’aide de C#. Les exemples de code ont montré comment générer des images JPG basées sur le texte fourni. Vous pouvez en savoir plus sur Aspose.Font for .NET en utilisant la documentation.

Voir également