无法使用DrawString上ttf文件中的字体

时间:2019-01-06 20:06:15

标签: c# fonts .net-core drawing

我正在尝试通过使用TTF字体绘制文本来创建图像。我在MacOS上使用.net core 2.1.500,并且具有mono-libgdiplus v5.6(通过brew安装)。

TTF文件为Neo Sans Medium,这是我的代码(我尝试使用不同的TTF字体,总是得到相同的结果)

using (var bmp = new Bitmap(1024, 512))
{
    Graphics g = Graphics.FromImage(bmp);
    g.Clear(Color.White);

    var rectf = new RectangleF(0, 40, 1024, 90);

    // If I specify a font that it doesn't know, it defaults to Verdana
    var defaultFont = new Font("DefaultFont", 55);
    Console.WriteLine($"defaultFont: {defaultFont.Name}"); // => defaultFont: Verdana

    g.DrawString("Text with default", defaultFont, Brushes.Black, rectf);

    var privateFontCollection = new PrivateFontCollection();
    privateFontCollection.AddFontFile("/path/to/Neo_Sans_Medium.ttf");
    var fontFamilies = privateFontCollection.Families;

    var family = fontFamilies[0];

    var familyHasRegular = family.IsStyleAvailable(FontStyle.Regular);
    Console.WriteLine($"familyHasRegular: {familyHasRegular}"); // => familyHasRegular: true

    var textFont = new Font(family, 55);
    Console.WriteLine($"textFont: {textFont.Name}"); // => textFont: Neo Sans

    var rectText = new RectangleF(0, 140, 1024 - 50 - 50, 1024 - 50 - 10);
    g.DrawString("Text with loaded font", textFont, Brushes.Black, rectText);

    g.Flush();

    g.Save();

    bmp.Save("test.png", ImageFormat.Png);
}

自从它打印出textFont: Neo Sans以来,在我看来它已经正确加载(否则,它将默认为Verdana)。

但是,我得到的输出就是这个:

enter image description here

我想念什么吗?

3 个答案:

答案 0 :(得分:2)

我能够使用SixLabors.ImageSharp来做到这一点。我还安装了SixLabors.FontsSixLabors.ImageSharp.Drawing

使用以下代码:

using (Image<Rgba32> image = new Image<Rgba32>(1024, 512))
{
    FontCollection fonts = new FontCollection();
    fonts.Install("/path/to/Neo_Sans_Medium.ttf");

    var verdana = SystemFonts.CreateFont("Verdana", 55);
    var neoSans = fonts.CreateFont("Neo Sans", 55);

    image.Mutate(x => x
        .BackgroundColor(Rgba32.White)
        .DrawText("Text with default", verdana, Rgba32.Black, new PointF(0, 0))
        .DrawText("Text with loaded font", neoSans, Rgba32.Black, new PointF(0, 65))
    );
    image.Save("out.png");
}

我能够得到这个:

enter image description here

答案 1 :(得分:0)

这里是如何使用自定义TTF字体进行绘制的示例。无需在此系统上安装私有字体。

技巧是将字体加载到PrivateFontCollection中, 然后使用集合中加载的FontFamily创建新的字体。

在此示例中,我使用了条形码字体KixBarcode。

    static Bitmap CreateBarcode(string text)
    {
        var collection = new PrivateFontCollection();
        collection.AddFontFile(@"F:\Projects\Tools\Rtf2Pdf\KixBarcode.ttf");
        var image = new Bitmap(300, 300);
        var g = Graphics.FromImage(image);
        var brush = new SolidBrush(Color.Black);
        var font = new Font(collection.Families[0], 12);
        g.Dispose();

        return image;
    }

答案 2 :(得分:0)

我能够在不切换到其他图形库的情况下完成此工作。将FFT文件复制到/usr/share/fonts/,然后切换为使用标准字体而不是PrivateFontCollection。

var font = new Font("Your Font Name", 50);
g.DrawString("Hello world", font, Brushes.Black, rectf);

安装字体可能看起来像是“黑客”,但如果将应用程序部署在容器中,就像在Dockerfile中复制TTF一样简单。