2009-02-07 113 views
15

我在服务器端使用GDI +创建一个流式传输到用户浏览器的图像。标准字体都不符合我的要求,所以我想加载TrueType字体,并使用该字体绘制我的琴弦的图形对象:使用自定义TTF字体进行DrawString图像渲染

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 +字符串渲染中使用它?

回答

31

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

// '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方法被用作意图。

14

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

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!"); 
    } 
}