none
Converter string base64 para um arquivo de Imagem RRS feed

  • Pergunta

  • Olá, estou com um pequeno problema, estou recebendo por request.querystring  um parametro que seria uma string de base64, no qual estou convertendo para uma imagem, porém quando a imagem é muito grande, tem muitas linhas apresenta erro.

    segue aqui o código.

            public string Base64ToImage(string base64String, int userId, int task, string Description)
            {
                try
                {
                    byte[] newfile = Convert.FromBase64String(Decompress(base64String));
                    string diretorio = "c:\\" + userId + "\\" + task;
                    if (Directory.Exists(diretorio))
                        Directory.Delete(diretorio, true);
                    DirectoryInfo di = Directory.CreateDirectory(diretorio);
                    File.WriteAllBytes(diretorio + @"\" + userId + "_" + task + ".jpg", newfile);
                    return diretorio + @"\" + userId + "_" + task + ".jpg";
                }
                catch (Exception) { return ""; }
            }
            public static string Decompress(string compressed)
            {
                byte[] compressedBytes = Encoding.ASCII.GetBytes(compressed);
                MemoryStream mem = new MemoryStream(compressedBytes);
                GZipStream gzip = new GZipStream(mem, CompressionMode.Decompress);
                StreamReader reader = new StreamReader(gzip);
                return reader.ReadToEnd();
            }
    
    

    Tem alguma outra forma simples de converter uma string com mais de 60 mil linhas em uma imagem, sem que apresente erro de falta de memória 

    Atenciosamente

    Marcus Fernando

    sexta-feira, 4 de outubro de 2013 19:47

Todas as Respostas

  • Olá Marcus,

    Em qual linha ocorre o erro?

    Se o problema estiver no "Encoding.ASCII.GetBytes(compressed);", então é possível que a passagem do código na Base64 via query string esteja sofrendo alteração em algum caracter especial. 

    Mas, ao meu ver, uma query string tão grande não é uma boa prática e passar a base64 via query string tb não é.

    Não existe nenhuma maneira de trafegar os bytes via session e depois limpar a session? Acredito que vc irá poupar mais memória deste modo.

    []s!


    MSc. Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Visual C#
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    sexta-feira, 4 de outubro de 2013 23:08
    Moderador
  • Olá Fernando, na verdade quanto mais linhas pelo que eu pude ver, maior a resolução e estou comunicando um handler com uma aplicação em android , em razao disso passo via url, o que me leva a outro problema, pois a memória de um navegador suporta no máximo 2024 caracteres , em razao disso estou avaliando conversao encode da url e zipar a string para ver se não ultrapassa o limite

    O erro ocorre na própria conversão

    byte[] newfile = Convert.FromBase64String(Decompress(base64String));

     Atenciosamente

    Marcus Fernando

    segunda-feira, 7 de outubro de 2013 03:46
  • Fernando, eu fiz receber por post mesmo trabalhando em cima de encode e decode url, segue o exemplo e funciono com qualidade máxima.

         }
            public string Base64ToImage(string base64String, int userId, int task, string name, string extension)
            {
                string t = System.Uri.UnescapeDataString(base64String);
                byte[] newfile = Convert.FromBase64String(t);
                string diretorio = ConfigurationSettings.AppSettings["UploadPathServiceTemp"] + "\\" + userId + "\\" + task;
                if (Directory.Exists(diretorio))
                    Directory.Delete(diretorio, true);
                DirectoryInfo di = Directory.CreateDirectory(diretorio);
                File.WriteAllBytes(diretorio + @"\" + name + "." + extension, newfile);
                return diretorio + @"\" + name + "." + extension;
            }

    Obrigado pela ajuda!!

    Atenciosamente

    Marcus Fernando

    quinta-feira, 10 de outubro de 2013 20:11