无法在ASP.Net中以编程方式使用某些字体

时间:2010-05-06 14:30:54

标签: c# asp.net system.drawing

我正在尝试以编程方式在ASP.Net中创建具有指定字体的位图。我们的想法是,文本,字体名称,大小颜色等将从变量传入,并返回使用字体等的文本位图。 但是,我发现我只能使用以下代码使用某些字体。

   <div>
    <%
     string fontName = "Segoe Script"; //Change Font here
     System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(100, 100);
     System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(bmp);
     System.Drawing.Font fnt = new System.Drawing.Font(fontName, 20);
     System.Drawing.SolidBrush brush = new System.Drawing.SolidBrush(System.Drawing.Color.Red);
    graph.DrawString("Help", fnt, brush, new System.Drawing.Point(10, 10));

    bmp.Save(@"C:\Development\Path\image1.bmp");
    this.Image1.ImageUrl = "http://mysite/Images/image1.bmp";
    %>
 <asp:Label ID="Label1" runat="server" Text="Label" Font-Names="Segoe Script">  <%Response.Write("Help"); %></asp:Label> //Change font here
<asp:Image ID="Image1" runat="server" />
</div>

如果我将注释所指示的区域中的字体名称更改为Arial或Verdana,则图像和标签都会以正确的字体显示。 但是,如果我将两个位置的字体名称更改为“Segoe Script”,标签将显示在Segoe Script中,但图像看起来像Arial。

更新

基于这个问题here我能够通过使用PrivateFontCollection()并加载字体文件来使其正常工作。

   <div>
   <%
    string TypeFaceName = "Segoe Script";
    System.Drawing.Text.PrivateFontCollection fnts = new System.Drawing.Text.PrivateFontCollection();
    fnts.AddFontFile(@"C:\Development\Fonts\segoesc.ttf");
    System.Drawing.FontFamily fntfam = new System.Drawing.FontFamily(TypeFaceName);
    System.Drawing.Font fnt = new System.Drawing.Font(fntfam, 13);

    System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(100, 100);
    System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(bmp);
    System.Drawing.SolidBrush brush = new System.Drawing.SolidBrush(System.Drawing.Color.Red);
    graph.DrawString("Help", fnt, brush, new System.Drawing.Point(10, 10));

    bmp.Save(@"C:\Development\Path\Images\image1.bmp");
    this.Image1.ImageUrl = "http://MySite/Images/image1.bmp";
    %>
    <asp:Label ID="Label1" runat="server" Text="Label" Font-Names="Segoe Script">     <%Response.Write("Help"); %></asp:Label>
    <asp:Image ID="Image1" runat="server" />
    </div>

2 个答案:

答案 0 :(得分:1)

确保您的服务器上已安装该字体。

此外,如果两个人同时查看该页面,您的代码将会失败 您需要创建一个.ASHX处理程序,它接受查询字符串中的参数并动态提供图像。

答案 1 :(得分:0)

您的代码会遇到内存问题。所有GDI +对象都需要小心释放或者显示泄漏行为(即使GC最终会通过终结器进行清理,这可能为时已晚,因为未使用的非托管内存量可能导致应用程序提前中断)。 p>

此外,您可能希望使用特殊的IHttpHandler处理对此类“动态文本”的请求,而不是创建“静态”文件。