2009-02-07 101 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!"); 
    } 
}