我正在尝试通过使用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
)。
但是,我得到的输出就是这个:
我想念什么吗?
答案 0 :(得分:2)
我能够使用SixLabors.ImageSharp
来做到这一点。我还安装了SixLabors.Fonts
和SixLabors.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");
}
我能够得到这个:
答案 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一样简单。