por Cesar Cassiano Schimanco

C# - Utilizar fontes (ttf) sem instalar - PrivateFontCollection

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

Comentários

Carregando comentários

Postar um novo comentário



Processando...