رندر متن با استفاده از فونت

در پست قبلی، نحوه استفاده از Aspose.Font for .NET API برای بارگیری و ذخیره CFF، TrueType و [Type1] را مشاهده کردید. 5 فونت های برنامه نویسی شده. در این مقاله نحوه رندر متن با فونت TrueType و Type1 با استفاده از سی شارپ را خواهید آموخت. نمونه کد به شما نشان می دهد که چگونه یک تصویر JPG بر اساس متن ارائه شده ایجاد کنید.

NET Font Rendering API - نصب

Aspose.Font for .NET مکانیزم رندر فونت قدرتمندی را برای رندر کردن متن با استفاده از فونت‌های TrueType و Type1 فراهم می‌کند. می‌توانید API را دانلود یا با استفاده از NuGet نصب کنید.

PM> Install-Package Aspose.Font

رابط رندر متن را پیاده سازی کنید

به منظور دستیابی به رندر متن، Aspose.Font برای دات نت یک رابط IGlyphOutlinePainter برای ترسیم حروف نشان می دهد. مراحل زیر نحوه پیاده سازی متدها را در IGlyphOutlinePainter نشان می دهد.

  • متدهای رابط IGlyphOutlinePainter را با استفاده از کلاس GlyphOutlinePainter که به یک شی از نوع System.Drawing.Drawing2D.GraphicsPath برای ترسیم گرافیک نیاز دارد، پیاده سازی کنید.
// برای نمونه‌های کامل و فایل‌های داده، لطفاً به 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();
    }
}
  • یک متد جدید DrawText() ایجاد کنید تا متن را در شیء System.Drawing.Bitmap بکشید.
// برای نمونه‌های کامل و فایل‌های داده، لطفاً به https://github.com/aspose-font/Aspose.Font-for-.NET بروید
static void DrawText(string text, IFont font, double fontSize,
            Brush backgroundBrush, Brush textBrush, string outFile)
{
    //شناسه علامت برای هر نماد در خط متن دریافت کنید
    GlyphId[] gids = new GlyphId[text.Length];
   for (int i = 0; i < text.Length; i++)
        gids[i] = font.Encoding.DecodeToGid(text[i]);
    // تنظیمات طراحی مشترک را تنظیم کنید
    double dpi = 300;

    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
    // تهیه بیت مپ خروجی
    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;
    //متغیرهای مختصات و gid قبلی را اعلام کنید
    GlyphId previousGid = null;
    double glyphXCoordinate = 0;
    double glyphYCoordinate = fontSize * resolutionCorrection;
    //حلقه ای که هر گلیف را به صورت gids رنگ می کند
    foreach (GlyphId gid in gids)
    {
        // اگر فونت حاوی gid باشد
        if (gid != null)
        {
            Glyph glyph = font.GlyphAccessor.GetGlyphById(gid);
            if (glyph == null)
                continue;

            // مسیری که دستورالعمل های ترسیم را می پذیرد
            GraphicsPath path = new GraphicsPath();

            // پیاده سازی IGlyphOutlinePainter را ایجاد کنید
            GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);

            // رندر را ایجاد کنید
            Aspose.Font.Renderers.IGlyphRenderer renderer = new
                Aspose.Font.Renderers.GlyphOutlineRenderer(outlinePainter);

            // ویژگی های رایج گلیف را دریافت کنید
            double kerning = 0;

            // دریافت ارزش هسته
            if (previousGid != null)
            {
                kerning = (font.Metrics.GetKerningValue(previousGid, gid) /
                           glyph.SourceResolution) * fontSize * resolutionCorrection;
                kerning += FontWidthToImageWith(font.Metrics.GetGlyphWidth(previousGid),
                        glyph.SourceResolution, fontSize);
            }

            // موقعیت یابی گلیف - مختصات علامت X را با توجه به فاصله هسته افزایش دهید
            glyphXCoordinate += kerning;

            // ماتریس قرارگیری گلیف
            TransformationMatrix glyphMatrix =
                new TransformationMatrix(
                    new double[]
                            {
                                    fontSize*resolutionCorrection,
                                    0,
                                    0,
                                // منفی به دلیل بیت مپ سیستم مختصات از بالا شروع می شود
                                    - fontSize*resolutionCorrection,
                                    glyphXCoordinate,
                                    glyphYCoordinate
                            });

            // رندر علامت فعلی
            renderer.RenderGlyph(font, gid, glyphMatrix);
            // مسیر را پر کنید
            path.FillMode = FillMode.Winding;
            outGraphics.FillPath(textBrush, path);
        }
        //gid فعلی را به عنوان قبلی تنظیم کنید تا به درستی برای علامت بعدی استفاده کنید
        previousGid = gid;
    }
    //ذخیره نتایج
    outBitmap.Save(outFile);
}
  • یک روش کاربردی برای محاسبه عرض فونت با توجه به عرض تصویر تعریف کنید.
// برای نمونه‌های کامل و فایل‌های داده، لطفاً به 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;
}

رندر متن با فونت TrueType با استفاده از سی شارپ

نمونه کد زیر نحوه استفاده از پیاده سازی فوق الذکر را برای ارائه متن با فونت TrueType با استفاده از C# نشان می دهد.

// برای نمونه‌های کامل و فایل‌های داده، لطفاً به 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");

رندر متن با فونت Type1 با استفاده از C#

نمونه کد زیر نحوه رندر متن با فونت Type1 را با استفاده از C# نشان می دهد.

// برای نمونه‌های کامل و فایل‌های داده، لطفاً به 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");

نتیجه

در این مقاله نحوه پیاده سازی رندر متن با فونت TrueType یا Type1 را با استفاده از سی شارپ یاد گرفتید. نمونه کد نحوه تولید تصاویر JPG را بر اساس متن ارائه شده نشان داده است. می‌توانید با استفاده از مستندات درباره Aspose.Font for .NET بیشتر کاوش کنید.

همچنین ببینید