none
Converter String em Imagem RRS feed

  • Pergunta

  • Pessoal,

    Preciso transforma uma string qualquer em imagem e gravar a mesma no banco. Só que esta dando erro quando vou gerar a imagem segue o codigo abaixo:

    protected void Page_Load(object sender, EventArgs e)
        {
            string s = "A";
            Base64ToImage(s);
           
          
        }
        private System.Drawing.Image Base64ToImage(string texto)
        {

            byte[] textoByte = System.Text.Encoding.UTF8.GetBytes(texto);
           
            string texto64 = Convert.ToBase64String(textoByte);
     
            byte[] imageBytes = Convert.FromBase64String(texto64);
            MemoryStream ms = new MemoryStream();

            ms.Write(imageBytes, 0, imageBytes.Length);

            System.Drawing.Image image = System.Drawing.Image.FromStream(ms);
            return image;
        }


            Na linha System.Drawing.Image image = System.Drawing.Image.FromStream(ms);   da o erro de Parametro invalido
    Mas a conversão de string para stringbase64 não ocorre problema nenhum.

    No aguardo
    segunda-feira, 30 de novembro de 2009 19:35

Respostas

  • Carlos,

    Tenta isso abaixo, e nos fala se ajudou.

    Se sim, marque a resposta como tal.

    using System;
    using System.IO;
    using System.Drawing;
    using System.Drawing.Drawing2D;

    namespace String2Image
    {
        public partial class Image : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                string _strTexto = "TESTE 123";
                Bitmap _bmpOut = new Bitmap(200, 50);
                Graphics _graphs = Graphics.FromImage(_bmpOut);
                _graphs.DrawString(_strTexto, new Font("Arial", 14), new SolidBrush(Color.Black), 0, 0);

                MemoryStream ms = new MemoryStream();
                _bmpOut.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
               
                byte[] bmpBytes = ms.GetBuffer();
                _bmpOut.Dispose();
                ms.Close();
               
                Response.BinaryWrite(bmpBytes);
                Response.End();

            }

           
        }
    }

    “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Propor como Resposta” para ajudar outros membros que estejam lendo esta thread”.
    segunda-feira, 30 de novembro de 2009 21:05

Todas as Respostas

  • Tenta dessa maneira

    public Image Base64ToImage(string base64String)
    {
      // Convert Base64 String to byte[]
      byte[] imageBytes = Convert.FromBase64String(base64String);
      MemoryStream ms = new MemoryStream(imageBytes, 0, 
        imageBytes.Length);
    
      // Convert byte[] to Image
      ms.Write(imageBytes, 0, imageBytes.Length);
      Image image = Image.FromStream(ms, true);
      return image;
    }
    abraço,
    Leonardo B. Moreira - Web Developer .net with asp.net and C# - I know, it is only programming but I like it.
    segunda-feira, 30 de novembro de 2009 19:47
  • Continua dando o mesmo erro
    segunda-feira, 30 de novembro de 2009 20:05
  • Carlos,

    Tenta isso abaixo, e nos fala se ajudou.

    Se sim, marque a resposta como tal.

    using System;
    using System.IO;
    using System.Drawing;
    using System.Drawing.Drawing2D;

    namespace String2Image
    {
        public partial class Image : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                string _strTexto = "TESTE 123";
                Bitmap _bmpOut = new Bitmap(200, 50);
                Graphics _graphs = Graphics.FromImage(_bmpOut);
                _graphs.DrawString(_strTexto, new Font("Arial", 14), new SolidBrush(Color.Black), 0, 0);

                MemoryStream ms = new MemoryStream();
                _bmpOut.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
               
                byte[] bmpBytes = ms.GetBuffer();
                _bmpOut.Dispose();
                ms.Close();
               
                Response.BinaryWrite(bmpBytes);
                Response.End();

            }

           
        }
    }

    “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Propor como Resposta” para ajudar outros membros que estejam lendo esta thread”.
    segunda-feira, 30 de novembro de 2009 21:05
  • Carlos,

    É óbvio que o seu código dará erro, já que você está transformando uma string em base64, transformando o base64 em um array de bytes, o array de bytes em uma stream na memória, e então a stream em imagem. O problema é que a stream não representa nenhum formato de imagem conhecido (BMP, PNG, JPG e outros).

    Quando você diz "transformar uma string qualquer em imagem", o que quer dizer com isso? Não é possível transformar uma string qualquer em imagem. Não vejo sentido nessa frase. Poderia esclarecer melhor a sua dúvida?

    Att.

    Ari C. Raimundo
    terça-feira, 1 de dezembro de 2009 01:30
    Moderador
  • Valeu andre, seu codigo solucionou meu problema, mas tenho outro problema agora, preciso desconverter esta imagem em string novamente, pois estou gravando ela no banco e preciso recuperar a mesma em algum momento
    terça-feira, 1 de dezembro de 2009 14:20
  • Carlos,

    Qual o banco de dados que está utilizando?

    Att.

    Ari C. Raimundo
    terça-feira, 1 de dezembro de 2009 14:33
    Moderador
  • Vamos ver se entendi, oke vc quer fazer eh gravar a imagem no banco de dados e depois recuperar, eh isso?
    “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Propor como Resposta” para ajudar outros membros que estejam lendo esta thread”.
    terça-feira, 1 de dezembro de 2009 15:49
  • Sql server 2005 ja esta gravando a imagem no banco e ja estou recuperando a imagem em bytes, mas quando converto de volta para string gera caracteres estranhos.
    terça-feira, 1 de dezembro de 2009 16:22
  • Carlos,

    Você está armazenando a imagem no banco de dados com o tipo image do SQL Server? Não entendi o porquê de transformar a imagem para string.

    Veja o link abaixo:

    Storing and Retrieving Images from SQL Server using Microsoft .NET
    http://www.codeproject.com/KB/database/ImageSaveInDataBase.aspx

    Att.

    Ari C. Raimundo
    terça-feira, 1 de dezembro de 2009 16:24
    Moderador
  • Ari, é um sistema legado que guarda grandes quantidades de texto como imagem, e quando necessita editar ou visualizar este texto ele realiza a ação inversa, tenho que disponibilizar este mesmo sistema na web, logo não posso mudar a estrutura do banco nem como os mesmo tratam os dados.
    terça-feira, 1 de dezembro de 2009 16:31
  • Carlos,

    Entendi, mas o problema é que você não pode transformar uma string qualquer em imagem.

    Se a string é base64 e oriunda de um array de bytes que representa um arquivo de imagem dai sim é possível. Neste caso você usaria a sugestão do Leonardo. Se é uma string qualquer como a classe Image irá entender o formato? Não teria sentido.

    Att.

    Ari C. Raimundo
    terça-feira, 1 de dezembro de 2009 16:35
    Moderador
  • Nos mostre como vc esta fazendo...

    “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Propor como Resposta” para ajudar outros membros que estejam lendo esta thread”.
    terça-feira, 1 de dezembro de 2009 16:43
  • usei exatamente o seu codigo:
    Para converter de string para imagem

    protected byte[] StringImagem(string texto)
        {

            Bitmap _bmpOut = new Bitmap(200, 50);
            Graphics _graphs = Graphics.FromImage(_bmpOut);
            _graphs.DrawString(texto, new Font("Arial", 14), new SolidBrush(Color.Black), 0, 0);

            MemoryStream ms = new MemoryStream();
            _bmpOut.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

            byte[] bmpBytes = ms.GetBuffer();
            _bmpOut.Dispose();
            ms.Close();

            //Response.BinaryWrite(bmpBytes);
            //Response.End();
            return bmpBytes;

        }
    bmpBytes é gravado no banco como tipo imagem

     SqlCommand k = new SqlCommand("SELECT QS_JUSTIF FROM SQS010 WHERE QS_VAGA = @NUM",conexao);
                    k.Parameters.Add("@NUM", SqlDbType.VarChar, 50);
                    k.Parameters["@NUM"].Value = numrp;
                    byte[] imagemEmBytes = (byte[])k.ExecuteScalar();
                    //MemoryStream ms = new MemoryStream();
                    //ms.Write(imagemEmBytes, 0, imagemEmBytes.Length);

                    string jus = Convert.ToBase64String(imagemEmBytes);

    pra converter de imagem do banco para string


    terça-feira, 1 de dezembro de 2009 16:47
  • Olá Carlos Magno,

    Analise o exemplo:

            private void btnGera_Click(object sender, EventArgs e)
            {
                byte[] textoByte = System.Text.Encoding.UTF8.GetBytes(txtPicBox.Text);
                char[] imageChar = new char[256];
                int tam = Convert.ToBase64CharArray(textoByte, 0, textoByte.Length, imageChar, 0);
                Bitmap BtMap = new Bitmap(1, tam);
                for (int ix = 0; ix < tam; ix++)
                { BtMap.SetPixel(0, ix, Color.FromArgb((byte)imageChar[ix], (byte)imageChar[ix], (byte)imageChar[ix])); }
                MemoryStream memStr = new MemoryStream();
                BtMap.Save(memStr, System.Drawing.Imaging.ImageFormat.Bmp);
                System.Drawing.Image image = System.Drawing.Image.FromStream(memStr);
                picBox.Image = image;
            }
    
            private void btnRetorna_Click(object sender, EventArgs e)
            {
                Bitmap BtMap = new Bitmap(picBox.Image);
                GraphicsUnit grUnit = GraphicsUnit.Pixel;
                RectangleF retang = BtMap.GetBounds(ref grUnit);
                int tam = (int)retang.Height;
                char[] imageChar = new char[256];
                for (int ix = 0; ix < tam; ix++)
                {
                    Color qCor = BtMap.GetPixel(0, ix);
                    imageChar[ix] = (char)qCor.B;
                }
                byte[] textoByte = Convert.FromBase64CharArray(imageChar, 0, tam);
                string retorno = "";
                for (int ix = 0; ix < textoByte.Length; ix++)
                {
                    retorno += ((char)textoByte[ix]);
                }
                txtRetorno.Text = retorno;
            }
    


    Saudações

    Márcio Lima
    quinta-feira, 3 de dezembro de 2009 00:01