C# - Convertendo arquivos textos para imagem (Windows Forms)


 No artigo de hoje vou mostrar como podemos salvar arquivos textos no formato imagem em um projeto Windows Forms usando a linguagem C#.

Este é um artigo onde iremos rever diversos conceitos básicos da linguagem C# como :  usar as caixas de diálogo OpenFileDialog e SaveFileDialog, Abrir arquivos textos, Salvar arquivos textos e Salvar arquivos imagens.

Além disso vamos aprender como podemos converter um texto para um arquivo imagem com opções para salvar a imagem nos formatos : JPG, BMP (Padrão) e GIF.

Para saber mais ou lembrar da teoria veja nas referências os artigos sobre os tópicos que estamos revendo.

Recursos usados :

Criando o projeto exemplo no VS 2013 Express Edition

Abra o VS 2013 Express for Windows desktop e clique em New Project;

A seguir selecione Visual C# -> Windows Forms Application;

Informe o nome Converter_Texto_Imagem e clique no botão OK;

 No formulário padrão form1.cs inclua a partir da ToolBox os seguintes controles:

Defina o seguinte leiaute no formulário form1.cs:

No menu PROJECT clique em Add Class e informe o nome ConverteTexto.cs. Nessa classe iremos definir os métodos para converter o texto para imagem.

A seguir inclua o seguinte código na classe ConverteTexto :

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
namespace Converter_Texto_Imagem
{
    public class ConverteTexto
    {
        public static Bitmap CriarImagemBitMap(string textoImagem, string fonte, int tamanho)
        {
            try
            {
                Bitmap objBmpImage = new Bitmap(1, 1);
                int intWidth = 0;
                int intHeight = 0;
                // Cria o objeto Font para desenha o texto da imagem
                Font objFont = new Font(fonte, tamanho, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel);
                // Cria o objeto grafico para medir a largura e altura do texto
                Graphics objGraphics = Graphics.FromImage(objBmpImage);
                // aqui determinamos o tamanho do bitmap 
                intWidth = (int)objGraphics.MeasureString(textoImagem, objFont).Width;
                intHeight = (int)objGraphics.MeasureString(textoImagem, objFont).Height;
                // Cria o bmpImage novamente com o tamanho correto para o texto e fonte
                objBmpImage = new Bitmap(objBmpImage, new Size(intWidth, intHeight));
                // Adiciona cores ao novo bitmap.
                objGraphics = Graphics.FromImage(objBmpImage);
                // Define a cor de fundo
                objGraphics.Clear(Color.White);
                objGraphics.SmoothingMode = SmoothingMode.AntiAlias;
                objGraphics.TextRenderingHint = TextRenderingHint.AntiAlias;
                objGraphics.DrawString(textoImagem, objFont, new SolidBrush(Color.FromArgb(102, 102, 102)), 0, 0);
                objGraphics.Flush();
                return (objBmpImage);
            }
            catch
            {
                throw;
            }
         }
        public static Bitmap Converte_Texto_Para_Imagem(string txt, string fontname, int fontsize)
        {
            try
            {
                //cria a imagem bitmap
                Bitmap bmp = new Bitmap(1, 1);
                //O método FromImage cria um novo Graphics a partir da imagem definida
                Graphics graphics = Graphics.FromImage(bmp);
                // Cria um objeto Font para desenhar o texto da imagem
                Font font = new Font(fontname, fontsize);
                // Instancia o objeto Bitmap imagem novamente com o tamanho correto para o texto e fonte
                SizeF stringSize = graphics.MeasureString(txt, font);
                bmp = new Bitmap(bmp, (int)stringSize.Width, (int)stringSize.Height);
                graphics = Graphics.FromImage(bmp);
                // Aqui temos uma outra possibilidade
                // bmp = new Bitmap(bmp, new Size((int)graphics.MeasureString(txt, font).Width, (int)graphics.MeasureString(txt, font).Height));
                //Desenha o texto com o formato definido
                graphics.DrawString(txt, font, Brushes.Blue, 0, 0);
                font.Dispose();
                graphics.Flush();
                graphics.Dispose();
                return bmp;  
            }
            catch
            {
                throw;
            }
        }
        public static Bitmap ConvertTextToImage(string txt, string fontname, int fontsize, Color bgcolor, Color fcolor, int width, int Height)
        {
            try
            {
                //cria o bitmap
                Bitmap bmp = new Bitmap(width, Height);
                using (Graphics graphics = Graphics.FromImage(bmp))
                {
                    //define a fonte e escreve o texto
                    Font font = new Font(fontname, fontsize);
                    graphics.FillRectangle(new SolidBrush(bgcolor), 0, 0, bmp.Width, bmp.Height);
                    graphics.DrawString(txt, font, new SolidBrush(fcolor), 0, 0);
                    graphics.Flush();
                    font.Dispose();
                    graphics.Dispose();
                }
                return bmp;
            }
            catch
            {
                throw;
            }
        }
     }
}

Nesta classe temos 3 métodos para converter texto para imagem. Todos eles fazem a mesma coisa com pequenas variações.

  1. CriarImagemBitMap(string textoImagem, string fonte, int tamanho)  - retorna um bitmap
  2. Converte_Texto_Para_Imagem(string txt, string fontname, int fontsize)
  3. ConvertTextToImage(string txt, string fontname, int fontsize, Color bgcolor, Color fcolor, int width, int Height)

Você pode escolher qualquer um deles para realizar a conversão e pode também alterá-los ou escolher um e remover os demais.

Neste artigo eu vou usar apenas um como exemplo e os demais ficam como uma alternativa.

Definindo o código do formulário

A primeira coisa que temos que fazer é definir os namespaces usados no formulário:

using System;
using
System.Drawing;
using
System.Drawing.Imaging;
using
System.Windows.Forms;
using
System.IO;

Agora vamos implementar no formulário o código no evento Click de cada um dos botões de comando:

1- Botão Abrir Arquivo

  private void btnAbrirArquivo_Click(object sender, EventArgs e)
  {
            OpenFileDialog AbrirComo = new OpenFileDialog();
            DialogResult caminho = new DialogResult();
            StreamReader fluxoTexto = null;
            string Arquivo = null;
            AbrirComo.Title = "Abrir como";
            AbrirComo.FileName = "Nome Arquivo";
            AbrirComo.InitialDirectory = @"C:\dados";
            AbrirComo.Filter = "Arquivos Textos (*.txt)|*.txt";
            caminho = AbrirComo.ShowDialog();
            Arquivo = AbrirComo.FileName;
            try
            {
                if (!File.Exists(Arquivo))
                {
                    MessageBox.Show("Operação cancelada ou arquivo inválido", "Arquivo", MessageBoxButtons.OK);
                }
                else
                {
                    fluxoTexto = new StreamReader(Arquivo);
                    txtTexto.Text = fluxoTexto.ReadToEnd();
                    fluxoTexto.Close();
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
 }

Este código usa o componente OpenFileDialog() e permite ao usuário abrir um arquivo texto exibindo na caixa de texto txtTexto.

2 - botão Salvar Arquivo

 private void btnSalvarTexto_Click(object sender, EventArgs e)
  {
            SaveFileDialog salvarComo = new SaveFileDialog();
            DialogResult caminho;
            StreamWriter fluxoTexto = null;
            string Arquivo = null;
            try
            {
                salvarComo.CheckFileExists = false;
                salvarComo.Title = "Arquivos Textos |*.txt |";
                salvarComo.InitialDirectory = @"C:\dados";
                caminho = salvarComo.ShowDialog();
                Arquivo = salvarComo.FileName;
                if (string.IsNullOrWhiteSpace(Arquivo))
                {
                    MessageBox.Show("Operação Cancelada ou Arquivo Inválido", "Salvar Como", MessageBoxButtons.OK);
                }
                else
                {
                    fluxoTexto = new StreamWriter(Arquivo);
                    fluxoTexto.Write(txtTexto.Text);
                    fluxoTexto.Close();
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
 }

Neste código estamos usando uma caixa de diálogo SaveFileDialog() para que o usuário possa salvar o arquivo texto.

3 - botão Gerar Imagem

  private void btnGerarImagem_Click(object sender, EventArgs e)
  {
            try
            {
                picImagem.Image = ConverteTexto.CriarImagemBitMap(txtTexto.Text,"Arial",11);
                //picImagem.Image = ConverteTexto.Converte_Texto_Para_Imagem(txtTexto.Text,"Verdana",10);
                //picImagem.Image = ConverteTexto.ConvertTextToImage(txtTexto.Text, "Bookman Old Style", 10, Color.White, Color.Blue, txtTexto.Width, txtTexto.Height);
                //picImagem.Image = ConverteTexto.ConvertTextToImage(txtTexto.Text, "Times New Roman", 10, Color.White, Color.Black, 700,500);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
 }

O código acima usa os métodos da classe ConverteTexto para converter o texto para imagem. No código estou dando exemplo de como chamar todos os métodos definidos.

4 -  botão Salvar Imagem

 private void btnSalvarImagem_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif";
            saveFileDialog1.FilterIndex = 2; //define o padrão como sendo bitmap
            saveFileDialog1.Title = "Salvar arquivo imagem";
            saveFileDialog1.FileName = "Mac_" + DateTime.Now.Millisecond.ToString();
            saveFileDialog1.ShowDialog();
            try
            {
                // Se o nome do arquivo não for vazio abre para salvar
                if (!string.IsNullOrWhiteSpace(saveFileDialog1.FileName))
                {
                    if (picImagem.Image == null)
                    {
                        MessageBox.Show("Arquivo Imagem inválido", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        // Salva a imagem via FileStream criado pelo método OpenFile
                        FileStream fs = (FileStream)saveFileDialog1.OpenFile();
                        // Salva a imagem no formato (ImageFormat) apropriado
                        // baseado no tipo de arquivo selecionado na caixa de dialog
                        // A propriedade FilterIndex inicia como valor 1 
                        switch (saveFileDialog1.FilterIndex)
                        {
                            case 1:
                                this.picImagem.Image.Save(fs, ImageFormat.Jpeg);
                                break;
                            case 2:
                                this.picImagem.Image.Save(fs, ImageFormat.Bmp);
                                break;
                            case 3:
                                this.picImagem.Image.Save(fs, ImageFormat.Gif);
                                break;
                        }
                        MessageBox.Show("Arquivo imagem salvo com sucesso", "Imagem", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        //fecha arquivo
                        fs.Close();
                    }
                }
                else
                {
                    MessageBox.Show("Arquivo inválido", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
 }

Esse código usa a caixa de diálogo SaveFileDialog para salvar a imagem convertida e exibida no controle PictureBox (picImagem) para os formatos JPG, BMP ou GIF conforme definido pela seleção do usuário na caixa de diálogo.

Executando o projeto e escolhendo um texto para converter temos o seguinte resultado:

O exemplo funciona bem para arquivos textos pequenos mas você pode incrementar o projeto estendendo suas funcionalidades.

Pegue o projeto completo aqui:  Converter_Texto_Imagem.zip

(Disse Jesus) Não crês tu que eu estou no Pai, e que o Pai está em mim? As palavras que eu vos digo não as digo de mim mesmo, mas o Pai, que está em mim, é quem faz as obras.
João 14:10

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti