2010-05-06 5 views
1

J'essaie de créer par programme une bitmap avec une police spécifiée dans ASP.Net. L'idée est que le texte, le nom de la police, la couleur de la taille etc. seront transmis à partir des variables et un bitmap du texte utilisant la police etc. sera retourné. Cependant, j'ai constaté que je suis seulement capable de le faire en utilisant le code suivant avec certaines polices.Impossible d'utiliser certaines polices par programme dans 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> 

Si je change le nom de la police dans les zones indiquées par les commentaires à Arial ou Verdana l'image et l'étiquette apparaissent avec la police correcte. Si, cependant, je change le nom de la police dans les deux emplacements pour quelque chose "Segoe Script" l'étiquette apparaîtra dans Segoe Script, mais l'image est dans ce qui ressemble à Arial.

Mise à jour:

Sur la base de cette question here j'ai pu le faire fonctionner en utilisant un PrivateFontCollection() et le chargement du fichier de police comme si.

<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> 

Répondre

1

Assurez-vous que la police est installée sur votre serveur.

De plus, votre code échouera horriblement si deux personnes regardent la page en même temps.
Vous devez créer un gestionnaire .ASHX qui prend les paramètres dans la chaîne de requête et sert dynamiquement l'image.

+0

La police est installée sur le serveur Web et je peux créer manuellement une image avec la police en utilisant paint.net. Le code que j'ai posté est juste pour voir si cela peut être fait. Merci. – etoisarobot

0

Vous rencontrerez des problèmes de mémoire avec votre code. Tous les objets GDI + doivent être soigneusement libérés ou ils présentent un comportement de fuite (même si le GC finira par nettoyer via les finaliseurs, cela peut être trop tard, car la quantité de mémoire non gérée restant inutilisée peut provoquer une rupture de l'application plus tôt).

En outre, vous pouvez utiliser un IHttpHandler spécial qui a traité les requêtes pour un tel "texte dynamique" au lieu de créer des fichiers "statiques".

Questions connexes