O System.Drawing do C# disponibiliza, por padrão, uma lista de fontes TTF instaladas no Windows (C:\windos\fonts\). Mas se você quiser utilizar uma fonte não instalada, a primeira alternativa é colocar a fonte dentro da pasta C:\windos\fonts\. Isso vai resolver o problema. A segunda alternativa é deixar a fonte dentro do diretório do seu projeto e utilizar o PrivateFontCollection para carregar ela. Assim ganhamos portabilidade e evitamos problemas de permissão ao instalar fontes no Windows.
Abaixo um exemplo de como utilizar as fontes do sistema (C:\windos\fonts).
//O FontFamily utiliza as fontes do C:\windos\fonts
//No construtor do FontFamily vai o nome da fonte (Arial)
FontFamily fontfamily = new FontFamily("Arial");
Pegar todas as fontes disponíveis no Windows
FontFamily[] windowsFonts = FontFamily.Families;
//Responder todas as fontes do Windows na página
foreach (FontFamily font in windowsFonts)
{
Response.Write(font.Name + "<br />");
}
Exemplo de como pegar uma fonte em qualquer diretório e utilizar no System.Drawing (fontes não instaladas no Windows).
//Local da fonte
string fontPath = @"C:\projetos\demo\Pokemon Hollow.ttf";
PrivateFontCollection pfc = new PrivateFontCollection();
//Adicionar a fonte à PrivateFontCollection
pfc.AddFontFile(fontPath);
//Carregar a fonte
FontFamily fontFamily = new FontFamily(pfc.Families.First().Name, pfc);
Pegar todas as fontes de um diretório específico com o PrivateFontCollection
PrivateFontCollection pfc = new PrivateFontCollection();
//Pegar todas as fontes de um diretório
foreach (string item in Directory.GetFiles(@"C:\projetos\demo\", "*.ttf"))
pfc.AddFontFile(item);
//Responder todas as fontes do PrivateFontCollection na página
foreach (FontFamily font in pfc.Families)
{
Response.Write(font.Name + "<br />");
}
Exemplo completo de como escrever texto em imagem utilizando as fontes do sistema e rotorna-la para o browser
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Definir que o tipo de retorno é uma imagem JPG
Response.ContentType = "image/jpeg";
//Texto que será exibido
string texto = "Teste";
//Pagar o tamanho da fonte
int fontSize = 24;
//Cor da fonte
Color cor = Color.Black;
//O FontFamily utiliza as fontes do C:\windos\fonts
//No construtor do FontFamily vai o nome da fonte (Arial)
FontFamily fontfamily = new FontFamily("Times New Roman");
//Criar uma imagem de tamanho fixo 500x500
using (Bitmap final = new Bitmap(500, 200))
{
//utilizar o Graphics com para escrever na imagem
using (Graphics g = Graphics.FromImage(final))
{
//Definir a cor de fundo como branco
g.Clear(Color.White);
//Configuração da fonte (FontFamily, FontSize, FontStyle)
Font font = new Font(fontfamily, fontSize, FontStyle.Regular);
//Cor da fonte
SolidBrush brush = new SolidBrush(cor);
//Escrever o texto na imagem
g.DrawString(texto, font, brush, 0, 0);
}
using (MemoryStream ms = new MemoryStream())
{
//Salva a imagem no MemoryStream
final.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
//Retorna a imagem para o browser
ms.WriteTo(Response.OutputStream);
}
}
}
}
Exemplo completo de como usar fontes sem instalar usando uma coleção de fontes privada (PrivateFontCollection)
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Text;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Definir que o tipo de retorno é uma imagem JPG
Response.ContentType = "image/jpeg";
//Texto que será exibido
string texto = "Pokémon";
//Pagar o tamanho da fonte
int fontSize = 24;
//Cor da fonte
Color cor = Color.Black;
//Local da fonte
string fontPath = @"C:\projetos\demo\Pokemon Hollow.ttf";
PrivateFontCollection pfc = new PrivateFontCollection();
//Adicionar a fonte à PrivateFontCollection
pfc.AddFontFile(fontPath);
//Carregar a fonte
FontFamily fontFamily = new FontFamily(pfc.Families.First().Name, pfc);
//Criar uma imagem de tamanho fixo 500x500
using (Bitmap final = new Bitmap(500, 200))
{
//utilizar o Graphics com para escrever na imagem
using (Graphics g = Graphics.FromImage(final))
{
//Definir a cor de fundo como branco
g.Clear(Color.White);
//Configuração da fonte (FontFamily, FontSize, FontStyle)
Font font = new Font(fontFamily, fontSize, FontStyle.Regular);
//Cor da fonte
SolidBrush brush = new SolidBrush(cor);
//Escrever o texto na imagem
g.DrawString(texto, font, brush, 0, 0);
}
using (MemoryStream ms = new MemoryStream())
{
//Salva a imagem no MemoryStream
final.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
//Retorna a imagem para o browser
ms.WriteTo(Response.OutputStream);
}
}
}
}
Cuidado, nem sempre o nome da fonte é igual à do arquivo.
OpenType (otf) e C#
Como o System.Drawing utiliza o GDI+, só é possível trabalhar com fontes do tipo TrueType (ttf). Caso precise trabalhar com OpenType (otf) utilize um conversor de fontes otf para ttf, pois o GDI+ só dá suporte a fontes TrueType.
Resumo:
Neste artigo vimos como escrever texto em imagem utilizando fontes do Windows e fontes não instaladas no Windows. Vimos também porque fontes do tipo OTF não funcionam com C#.