使用自定义TTF字体进行DrawString图像渲染

我在服务器端使用GDI +创建一个流式传输到用户浏览器的图像。 没有标准字体符合我的要求,因此我想加载TrueType字体并使用此字体将我的字符串绘制到图形对象:

using (var backgroundImage = new Bitmap(backgroundPath)) using (var avatarImage = new Bitmap(avatarPath)) using (var myFont = new Font("myCustom", 8f)) { Graphics canvas = Graphics.FromImage(backgroundImage); canvas.DrawImage(avatarImage, new Point(0, 0)); canvas.DrawString(username, myFont, new SolidBrush(Color.Black), new PointF(5, 5)); return new Bitmap(backgroundImage); } 

myCustom表示服务器上未安装的字体,但我有TTF文件。

如何加载TTF文件以便我可以在GDI +字符串渲染中使用它?

我找到了使用自定义字体的解决方案。

 // 'PrivateFontCollection' is in the 'System.Drawing.Text' namespace var foo = new PrivateFontCollection(); // Provide the path to the font on the filesystem foo.AddFontFile("..."); var myCustomFont = new Font((FontFamily)foo.Families[0], 36f); 

现在myCustomFont可以按预期与Graphics.DrawString方法一起使用。

只是为了提供更完整的解决方案

 using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Drawing; using System.Drawing.Text; public partial class Test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string fontName = "YourFont.ttf"; PrivateFontCollection pfcoll = new PrivateFontCollection(); //put a font file under a Fonts directory within your application root pfcoll.AddFontFile(Server.MapPath("~/Fonts/" + fontName)); FontFamily ff = pfcoll.Families[0]; string firstText = "Hello"; string secondText = "Friend!"; PointF firstLocation = new PointF(10f, 10f); PointF secondLocation = new PointF(10f, 50f); //put an image file under a Images directory within your application root string imageFilePath = Server.MapPath("~/Images/YourImage.jpg"); Bitmap bitmap = (Bitmap)System.Drawing.Image.FromFile(imageFilePath);//load the image file using (Graphics graphics = Graphics.FromImage(bitmap)) { using (Font f = new Font(ff, 14, FontStyle.Bold)) { graphics.DrawString(firstText, f, Brushes.Blue, firstLocation); graphics.DrawString(secondText, f, Brushes.Red, secondLocation); } } //save the new image file within Images directory bitmap.Save(Server.MapPath("~/Images/" + System.Guid.NewGuid() + ".jpg")); Response.Write("A new image has been created!"); } }