Rendern Sie TrueType-Schriftarten in C++

Zeichen sind Symbole, die die Bedeutung verschiedener Wörter erklären. Sie können verschiedene Textzeichen mit TrueType-Schriftarten unter Verwendung von C++ mit der API Aspose.Font for C++ rendern. Es unterstützt verschiedene Textwiedergabefunktionen, darunter TrueType, Type1, OTF, EOT und andere Schriftarten. Lassen Sie uns untersuchen, wie Sie die Textwiedergabefunktionen mit ein paar einfachen API-Aufrufen verwenden können. Wir behandeln das Thema unter folgenden Überschriften:

C++ TrueType-Font-Rendering-API – Installation

In Anbetracht der Beliebtheit und Nachfrage der C++-Plattform haben wir sehr nützliche Funktionen in die API Aspose.Font for C++ eingeführt. Um TrueType-Schriftarten in Ihren Anwendungen wiederzugeben, müssen Sie die API konfigurieren, indem Sie sie von New Releases herunterladen, oder Sie können sie über NuGet mit dem folgenden Befehl installieren:

Install-Package Aspose.Font.Cpp

Implementieren Sie eine Schnittstelle zum Zeichnen von Glyphen zum Rendern von TrueType-Schriftarten mit C++

Zunächst müssen Sie IGlyphOutlinePainter unter Aspose.Font.Rendering-Namespace implementieren. Gehen Sie bei der Implementierung von Methoden und Klassen wie folgt vor:

  1. Erstellen Sie eine Klasse namens GlyphOutlinePainter
  2. Verwenden Sie System.Drawing.Drawing2D.GraphicsPath, um Grafiken zu zeichnen

Unten ist das C++ code snippet für die Implementierung der Schnittstelle, um Glyphen zu zeichnen:

For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-C
RenderingText::GlyphOutlinePainter::GlyphOutlinePainter(System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> path)
{
    _path = path;
}

void RenderingText::GlyphOutlinePainter::MoveTo(System::SharedPtr<Aspose::Font::RenderingPath::MoveTo> moveTo)
{
    _path->CloseFigure();
    _currentPoint.set_X((float)moveTo->get_X());
    _currentPoint.set_Y((float)moveTo->get_Y());
}

void RenderingText::GlyphOutlinePainter::LineTo(System::SharedPtr<Aspose::Font::RenderingPath::LineTo> lineTo)
{
    float x = (float)lineTo->get_X();
    float y = (float)lineTo->get_Y();
    _path->AddLine(_currentPoint.get_X(), _currentPoint.get_Y(), x, y);
    _currentPoint.set_X(x);
    _currentPoint.set_Y(y);
}

void RenderingText::GlyphOutlinePainter::CurveTo(System::SharedPtr<Aspose::Font::RenderingPath::CurveTo> curveTo)
{
    float x3 = (float)curveTo->get_X3();
    float y3 = (float)curveTo->get_Y3();
    
    _path->AddBezier(_currentPoint.get_X(), _currentPoint.get_Y(), (float)curveTo->get_X1(), (float)curveTo->get_Y1(), (float)curveTo->get_X2(), (float)curveTo->get_Y2(), x3, y3);
    
    _currentPoint.set_X(x3);
    _currentPoint.set_Y(y3);
}

void RenderingText::GlyphOutlinePainter::ClosePath()
{
    _path->CloseFigure();
}

System::Object::shared_members_type Aspose::Font::Examples::WorkingWithTrueTypeAndOpenTypeFonts::RenderingText::GlyphOutlinePainter::GetSharedMembers()
{
    auto result = System::Object::GetSharedMembers();
    
    result.Add("Aspose::Font::Examples::WorkingWithTrueTypeAndOpenTypeFonts::RenderingText::GlyphOutlinePainter::_path", this->_path);
    result.Add("Aspose::Font::Examples::WorkingWithTrueTypeAndOpenTypeFonts::RenderingText::GlyphOutlinePainter::_currentPoint", this->_currentPoint);
    
    return result;
}

Zweitens erstellen Sie bitte eine Methode mit dem Namen DrawText mit den folgenden Schritten:

  1. Symbole in der Textzeichenfolge durchlaufen
  2. Holen Sie sich GID als Glyphe, die für jedes Symbol identifiziert wird
  3. GlyphOutlinePainter erstellen und an das Objekt GlyphOutlineRenderer übergeben
  4. Geben Sie die Glyphenkoordinaten mit dem Objekt Matrix an

Nachdem Sie alle diese Schritte ausgeführt haben, erstellen Sie außerdem eine Hilfsmethode zur Berechnung der Schriftgröße für das Bild, wie im folgenden C++-Codeausschnitt beschrieben:

For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-C
double RenderingText::FontWidthToImageWith(double width, int32_t fontSourceResulution, double fontSize, double dpi /* = 300*/)
{
    double resolutionCorrection = dpi / 72;
    // 72 ist die interne dpi-Zahl der Schriftart
    return (width / fontSourceResulution) * fontSize * resolutionCorrection;
}

Rendern Sie Text mit TrueType-Schriftart mit C++

Wir haben die erforderliche Funktionalität für die Darstellung von Text mit TrueType-Schriftarten implementiert. Lassen Sie uns nun die Methoden mit Aspose.Font für die C++-API wie im folgenden Codeausschnitt aufrufen:

For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-C
System::String dataDir = RunExamples::GetDataDir_Data();
    
System::String fileName1 = dataDir + u"Montserrat-Bold.ttf";
//Schriftartdateiname mit vollständigem Pfad
System::SharedPtr<FontDefinition> fd1 = System::MakeObject<FontDefinition>(Aspose::Font::FontType::TTF, System::MakeObject<FontFileDefinition>(u"ttf", System::MakeObject<FileSystemStreamSource>(fileName1)));
System::SharedPtr<TtfFont> ttfFont1 = System::DynamicCast_noexcept<Aspose::Font::Ttf::TtfFont>(Aspose::Font::Font::Open(fd1));
    
System::String fileName2 = dataDir + u"Lora-Bold.ttf";
//Schriftartdateiname mit vollständigem Pfad
System::SharedPtr<FontDefinition> fd2 = System::MakeObject<FontDefinition>(Aspose::Font::FontType::TTF, System::MakeObject<FontFileDefinition>(u"ttf", System::MakeObject<FileSystemStreamSource>(fileName2)));
System::SharedPtr<TtfFont> ttfFont2 = System::DynamicCast_noexcept<Aspose::Font::Ttf::TtfFont>(Aspose::Font::Font::Open(fd2));
    
DrawText(u"Hello world", ttfFont1, 14, System::Drawing::Brushes::get_White(), System::Drawing::Brushes::get_Black(), dataDir + u"hello1_montserrat_out.jpg");
DrawText(u"Hello world", ttfFont2, 14, System::Drawing::Brushes::get_Yellow(), System::Drawing::Brushes::get_Red(), dataDir + u"hello2_lora_out.jpg");

Fazit

In diesem Artikel haben Sie gelernt, wie Sie Text mit TrueType-Schriftarten in C++ rendern. Möchten Sie mehr über die Funktionen erfahren, die Aspose.Font für die C++-API bietet? Weitere Einzelheiten finden Sie unter API-Referenzen oder Produktdokumentation. Sollten Sie jedoch Unklarheiten haben oder Hilfe benötigen, können Sie uns gerne über die kostenlosen Support-Foren erreichen. Wir freuen uns auf Ihre Kontaktaufnahme!

Siehe auch