renderizar texto usando fuentes

En la publicación anterior, vio cómo usar Aspose.Font for .NET API para cargar y guardar CFF, TrueType y Type1 fuentes mediante programación. En este artículo, aprenderá cómo representar texto con fuentes TrueType y Type1 usando C#. Los ejemplos de código le mostrarán cómo generar una imagen JPG basada en el texto proporcionado.

API de representación de fuentes .NET - Instalación

Aspose.Font for .NET proporciona un poderoso mecanismo de representación de fuentes para representar el texto usando fuentes TrueType y Type1. Puede descargar la API o instalarla mediante NuGet.

PM> Install-Package Aspose.Font

Implementar interfaz de representación de texto

Para lograr la representación del texto, Aspose.Font for .NET proporciona una interfaz IGlyphOutlinePainter para dibujar los glifos. Los siguientes pasos demuestran cómo implementar los métodos en IGlyphOutlinePainter.

  • Implemente los métodos de interfaz IGlyphOutlinePainter utilizando la clase GlyphOutlinePainter que requiere un objeto de tipo System.Drawing.Drawing2D.GraphicsPath para dibujar gráficos.
// Para obtener ejemplos completos y archivos de datos, vaya a 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();
    }
}
// Para obtener ejemplos completos y archivos de datos, vaya a https://github.com/aspose-font/Aspose.Font-for-.NET
static void DrawText(string text, IFont font, double fontSize,
            Brush backgroundBrush, Brush textBrush, string outFile)
{
    //Obtenga identificadores de glifos para cada símbolo en la línea de texto
    GlyphId[] gids = new GlyphId[text.Length];
    for (int i = 0; i < text.Length; i++)
        gids[i] = font.Encoding.DecodeToGid(text[i]);
    // establecer configuraciones de dibujo comunes
    double dpi = 300;

    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
    // preparar Bitmap de salida
    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;
    //declarar variables de coordenadas y gid anterior
    GlyphId previousGid = null;
    double glyphXCoordinate = 0;
    double glyphYCoordinate = fontSize * resolutionCorrection;
    //bucle que pinta cada glifo en gids
    foreach (GlyphId gid in gids)
    {
        // si la fuente contiene el gid
        if (gid != null)
        {
            Glyph glyph = font.GlyphAccessor.GetGlyphById(gid);
            if (glyph == null)
                continue;

            // ruta que acepta instrucciones de dibujo
            GraphicsPath path = new GraphicsPath();

            // Crear implementación de IGlyphOutlinePainter
            GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);

            // Crear el renderizador
            Aspose.Font.Renderers.IGlyphRenderer renderer = new
                Aspose.Font.Renderers.GlyphOutlineRenderer(outlinePainter);

            // obtener propiedades de glifo comunes
            double kerning = 0;

            // obtener valor de interletraje
            if (previousGid != null)
            {
                kerning = (font.Metrics.GetKerningValue(previousGid, gid) /
                           glyph.SourceResolution) * fontSize * resolutionCorrection;
                kerning += FontWidthToImageWith(font.Metrics.GetGlyphWidth(previousGid),
                        glyph.SourceResolution, fontSize);
            }

            // posicionamiento de glifo: aumenta la coordenada X del glifo según la distancia de interletraje
            glyphXCoordinate += kerning;

            // Matriz de colocación de glifos
            TransformationMatrix glyphMatrix =
                new TransformationMatrix(
                    new double[]
                            {
                                    fontSize*resolutionCorrection,
                                    0,
                                    0,
                                // negativo debido al sistema de coordenadas de Bitmap que comienza desde arriba
                                    - fontSize*resolutionCorrection,
                                    glyphXCoordinate,
                                    glyphYCoordinate
                            });

            // representar el glifo actual
            renderer.RenderGlyph(font, gid, glyphMatrix);
            // llenar el camino
            path.FillMode = FillMode.Winding;
            outGraphics.FillPath(textBrush, path);
        }
        //establezca el gid actual como anterior para obtener el interletraje correcto para el siguiente glifo
        previousGid = gid;
    }
    //Guardar resultados
    outBitmap.Save(outFile);
}
  • Defina un método de utilidad para calcular el ancho de la fuente según el ancho de la imagen.
// Para obtener ejemplos completos y archivos de datos, vaya a 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;
}

Renderizar texto con fuente TrueType usando C#

El siguiente ejemplo de código muestra cómo usar la implementación mencionada anteriormente para representar texto con una fuente TrueType usando C#.

// Para obtener ejemplos completos y archivos de datos, vaya a 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");

Renderizar texto con fuente Type1 usando C#

El siguiente ejemplo de código muestra cómo representar texto con una fuente Type1 usando C#.

// Para obtener ejemplos completos y archivos de datos, vaya a 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");

Conclusión

En este artículo, ha aprendido a implementar la representación de texto con una fuente TrueType o Type1 mediante C#. Los ejemplos de código han mostrado cómo generar imágenes JPG basadas en el texto proporcionado. Puede explorar más sobre Aspose.Font for .NET utilizando la documentación.

Ver también