yazı tiplerini kullanarak metin oluşturma

Önceki gönderide, CFF, TrueType ve [Type1] yüklemek ve kaydetmek için Aspose.Font for .NET API’sinin nasıl kullanıldığını gördünüz. 5 yazı tiplerini programlı olarak. Bu makalede, C# kullanarak TrueType ve Type1 yazı tipiyle metin oluşturmayı öğreneceksiniz. Kod örnekleri, sağlanan metne dayalı olarak bir JPG görüntüsünün nasıl oluşturulacağını gösterecektir.

.NET Yazı Tipi İşleme API’si - Kurulum

Aspose.Font for .NET, metni TrueType ve Type1 yazı tiplerini kullanarak işlemek için güçlü bir yazı tipi oluşturma mekanizması sağlar. API’yi indirebilir veya NuGet kullanarak kurulumunu sağlayabilirsiniz.

PM> Install-Package Aspose.Font

Metin Oluşturma Arayüzünü Uygulayın

Aspose.Font for .NET, metin işlemeyi gerçekleştirmek için glifleri çizmek için bir IGlyphOutlinePainter arabirimi sağlar. Aşağıdaki adımlar, yöntemlerin IGlyphOutlinePainter’da nasıl uygulanacağını gösterir.

  • Grafik çizmek için System.Drawing.Drawing2D.GraphicsPath türünde bir nesne gerektiren GlyphOutlinePainter sınıfını kullanarak IGlyphOutlinePainter arabirim yöntemlerini uygulayın.
// Eksiksiz örnekler ve veri dosyaları için lütfen https://github.com/aspose-font/Aspose.Font-for-.NET adresine gidin.
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();
    }
}
// Eksiksiz örnekler ve veri dosyaları için lütfen https://github.com/aspose-font/Aspose.Font-for-.NET adresine gidin.
static void DrawText(string text, IFont font, double fontSize,
            Brush backgroundBrush, Brush textBrush, string outFile)
{
    //Metin satırındaki her sembol için glif tanımlayıcıları alın
    GlyphId[] gids = new GlyphId[text.Length];
   for (int i = 0; i < text.Length; i++)
        gids[i] = font.Encoding.DecodeToGid(text[i]);
    // ortak çizim ayarlarını yap
    double dpi = 300;

    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
    // çıktı bit eşlemi hazırla
    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;
    //koordinat değişkenlerini ve önceki gid'i bildir
    GlyphId previousGid = null;
    double glyphXCoordinate = 0;
    double glyphYCoordinate = fontSize * resolutionCorrection;
    //gids'deki her glifi boyayan döngü
    foreach (GlyphId gid in gids)
    {
        // yazı tipi g'yi içeriyorsa
        if (gid != null)
        {
            Glyph glyph = font.GlyphAccessor.GetGlyphById(gid);
            if (glyph == null)
                continue;

            // çizim talimatlarını kabul eden yol
            GraphicsPath path = new GraphicsPath();

            // IGlyphOutlinePainter uygulaması oluşturma
            GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);

            // İşleyiciyi oluştur
            Aspose.Font.Renderers.IGlyphRenderer renderer = new
                Aspose.Font.Renderers.GlyphOutlineRenderer(outlinePainter);

            // ortak glif özelliklerini al
            double kerning = 0;

            // karakter aralığı değerini al
            if (previousGid != null)
            {
                kerning = (font.Metrics.GetKerningValue(previousGid, gid) /
                           glyph.SourceResolution) * fontSize * resolutionCorrection;
                kerning += FontWidthToImageWith(font.Metrics.GetGlyphWidth(previousGid),
                        glyph.SourceResolution, fontSize);
            }

            // glif konumlandırma - karakter aralığı mesafesine göre glif X koordinatını artırın
            glyphXCoordinate += kerning;

            // Glif yerleştirme matrisi
            TransformationMatrix glyphMatrix =
                new TransformationMatrix(
                    new double[]
                            {
                                    fontSize*resolutionCorrection,
                                    0,
                                    0,
                                // bitmap koordinat sistemi üstten başladığı için negatif
                                    - fontSize*resolutionCorrection,
                                    glyphXCoordinate,
                                    glyphYCoordinate
                            });

            // geçerli glifi oluştur
            renderer.RenderGlyph(font, gid, glyphMatrix);
            // yolu doldur
            path.FillMode = FillMode.Winding;
            outGraphics.FillPath(textBrush, path);
        }
        //sonraki glif için doğru karakter aralığını elde etmek için geçerli gid'i önceki olarak ayarlayın
        previousGid = gid;
    }
    //Sonuçları kaydet
    outBitmap.Save(outFile);
}
  • Yazı tipinin genişliğini görüntünün genişliğine göre hesaplamak için bir yardımcı yöntem tanımlayın.
// Eksiksiz örnekler ve veri dosyaları için lütfen https://github.com/aspose-font/Aspose.Font-for-.NET adresine gidin.
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# kullanarak TrueType Yazı Tipi ile Metni Oluşturun

Aşağıdaki kod örneği, C# kullanarak bir TrueType yazı tipiyle metni işlemek için yukarıda belirtilen uygulamanın nasıl kullanılacağını gösterir.

// Eksiksiz örnekler ve veri dosyaları için lütfen https://github.com/aspose-font/Aspose.Font-for-.NET adresine gidin.
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# kullanarak Type1 Yazı Tipi ile Metni Oluşturun

Aşağıdaki kod örneği, C# kullanarak bir Type1 yazı tipiyle metnin nasıl oluşturulacağını gösterir.

// Eksiksiz örnekler ve veri dosyaları için lütfen https://github.com/aspose-font/Aspose.Font-for-.NET adresine gidin.
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");

Çözüm

Bu makalede, C# kullanarak bir TrueType veya Type1 yazı tipiyle metnin işlenmesini nasıl uygulayacağınızı öğrendiniz. Kod örnekleri, sağlanan metne dayalı olarak JPG görüntülerinin nasıl oluşturulacağını göstermiştir. Belgeleri kullanarak Aspose.Font for .NET hakkında daha fazlasını keşfedebilirsiniz.

Ayrıca bakınız