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
- Implémenter l’interface de rendu de texte
- Rendu du texte avec la police TrueType à l’aide de C#
- Rendu du texte avec la police Type1 à l’aide de C#
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();
}
}
- Créez une nouvelle méthode DrawText() pour dessiner le texte dans l’objet System.Drawing.Bitmap.
// 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.