none
Perda de qualidade ao salvar imagem RRS feed

  • Pergunta

  • Galera,

    Não sei porque, mas ao publicar imagens usando o código abaixo, a imagem "grande" fica sempre ruim, distorcida. Pesquisei na internet, usei system.drawing.imaging.encoderparameters e outras dicas mas nenhuma delas resolveu meu problema. Poderiam me ajudar?

    Desde já, obrigado!

    {
                    //-----------------------------------------------------------------------------------------------------
                    // Salvar Foto
                    //-----------------------------------------------------------------------------------------------------
                    String path = pageScript.Server.MapPath(pasta);
                    Boolean fileOk = false;
    
                    if (imagem.HasFile)
                    {
                        // Bloqueia a transferência de arquivos maior que 3 MB
                        if (imagem.PostedFile.ContentLength < 3145728)
                        {
                            // Verifico se é uma extensão de imagem válida
                            String fileExtension;
                            fileExtension = System.IO.Path.GetExtension(imagem.FileName).ToLower();
                            String[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg" };
    
                            for (int i = 0; i < allowedExtensions.Length; i++)
                            {
                                if (fileExtension == allowedExtensions[i])
                                {
                                    fileOk = true;
                                }
                            }
    
                            if (fileOk)
                            {
                                try
                                {
                                    Bitmap upBitmap = Bitmap.FromStream(imagem.PostedFile.InputStream) as Bitmap;
    
                                    System.Drawing.Image.GetThumbnailImageAbort msgCallback;
                                    msgCallback = new System.Drawing.Image.GetThumbnailImageAbort(thumbmailCallback);
    
                                    // Redimensiono a imagem grande
                                    System.Drawing.Image imgFoto;
                                    if (upBitmap.Height > upBitmap.Width)
                                    {
                                        imgFoto = upBitmap.GetThumbnailImage(480, 640, msgCallback, IntPtr.Zero);
                                    }
                                    else
                                    {
                                        imgFoto = upBitmap.GetThumbnailImage(640, 480, msgCallback, IntPtr.Zero);
                                    }
                                    // Renomeio a imagem grande
                                    String nomeFoto = DateTime.Now.ToString();
                                    nomeFoto = nomeFoto.Replace("/", "").Replace(" ", "").Replace(":", "");
    
                                    // Salvo a imagem grande
                                    imgFoto.Save(path + nomeFoto + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
                                    oFoto.ImgFoto = pasta + nomeFoto + ".jpg";
                                    //imgFoto.Save(path + imagem.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                                    //oFoto.ImgFoto = pasta + imagem.FileName;
    
                                    // Redimensiono a imagem pequena
                                    System.Drawing.Image thumbnail;
                                    if (upBitmap.Height > upBitmap.Width)
                                    {
                                        thumbnail = upBitmap.GetThumbnailImage(149, 204, msgCallback, IntPtr.Zero);
                                    }
                                    else
                                    {
                                        thumbnail = upBitmap.GetThumbnailImage(204, 149, msgCallback, IntPtr.Zero);
                                    }
    
                                    // Salvo a imagem pequena
                                    thumbnail.Save(path + "thumb_" + nomeFoto + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
                                    oFoto.Thumb = pasta + "thumb_" + nomeFoto + ".jpg";
                                    //thumbnail.Save(path + "thumb_" + imagem.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                                    //oFoto.Thumb = pasta + "thumb_" + imagem.FileName;
    
                                    upBitmap.Dispose();
                                    thumbnail.Dispose();
    
                                    return oFoto;
                                }
                                catch (Exception ex)
                                {
                                    // Mensagem informativa
                                    exibeMensagem.show(pageScript, "Erro: " + ex.Message + ", favor contactar o suporte!");
                                    return oFoto;
                                }
                            }
                            else // if (fileOk)
                            {
                                // Mensagem informativa
                                exibeMensagem.show(pageScript, "Só poderá carregar imagens neste campo.");
                                return oFoto;
                            }
                        }
                        else // if (fuMapa.PostedFile.ContentLength < 1048576)
                        {
                            // Mensagem informativa
                            exibeMensagem.show(pageScript, "Limite máximo para a imagem é de 1MB.");
                            return oFoto;
                        }
                    }
                }

    terça-feira, 21 de agosto de 2012 16:49

Respostas

Todas as Respostas

  • Olá wcsantos,

    me parece que ao diminuir uma imagem e deixa-la como thumb perde-se qualidade mesmo,

    minha dica é deixar os thumbs em outra pasta e quando for exibir as miniaturas vc direciona a essa pasta

    e quando for exibir as imagens de tamanho grande vc direciona para a pasta de imagens grandes.

    Pode ser que ao direcionar para a imagem grande, esteja pegando a imagem thumb, por isso está perdendo

    a qualidade, está exibindo uma imagem de tamanho muito menor em um quadro grande.

    Espero ter ajudado !!!

    se ajudou, não se esqueça de marcar como resposta.


    Eduardo Narimatsu.

    • Sugerido como Resposta MarceloSchneider quarta-feira, 22 de agosto de 2012 11:57
    • Não Sugerido como Resposta wcsantos quarta-feira, 22 de agosto de 2012 11:59
    terça-feira, 21 de agosto de 2012 22:59
  • Olá wcsantos,

    me parece que ao diminuir uma imagem e deixa-la como thumb perde-se qualidade mesmo,

    minha dica é deixar os thumbs em outra pasta e quando for exibir as miniaturas vc direciona a essa pasta

    e quando for exibir as imagens de tamanho grande vc direciona para a pasta de imagens grandes.

    Pode ser que ao direcionar para a imagem grande, esteja pegando a imagem thumb, por isso está perdendo

    a qualidade, está exibindo uma imagem de tamanho muito menor em um quadro grande.

    Espero ter ajudado !!!

    se ajudou, não se esqueça de marcar como resposta.


    Eduardo Narimatsu.

    Olá,

    Acho que não entendeu, vamos lá...

    O código gera 2 imagens, uma thumb e uma normal. Ambas ficam do tamanho definido no código, PORÉM a maior fica distorcida, perde qualidade, NÃO tamanho.

    Se eu salvo a "original" sem redimensionar ela fica perfeita, MESMO gerando o thumb depois.

    NÃO estou pegando a thumb no lugar da maior.

    O problema está aqui:

                                    Bitmap upBitmap = Bitmap.FromStream(imagem.PostedFile.InputStream) as Bitmap;
    
                                    System.Drawing.Image.GetThumbnailImageAbort msgCallback;
                                    msgCallback = new System.Drawing.Image.GetThumbnailImageAbort(thumbmailCallback);
    
                                    // Redimensiono a imagem grande
                                    System.Drawing.Image imgFoto;
                                    if (upBitmap.Height > upBitmap.Width)
                                    {
                                        imgFoto = upBitmap.GetThumbnailImage(480, 640, msgCallback, IntPtr.Zero);
                                    }
                                    else
                                    {
                                        imgFoto = upBitmap.GetThumbnailImage(640, 480, msgCallback, IntPtr.Zero);
                                    }

    Provavelmente na hora de redimensionar, o "componente" está diminuindo a qualidade da imagem.

    Temporariamente resolvi não redimensionando a imagem publicada e apenas gerando o thumb, PORÉM não é o ideal. O ideal seria ter TODAS as imagens publicadas com o mesmo tamanho.

    quarta-feira, 22 de agosto de 2012 12:06
  • Ainda sem respostas...

    Alguém pode me ajudar???

    terça-feira, 16 de outubro de 2012 12:48
  • wc, 

    Acredito que você esteja perdendo qualidade devido a forma que esta fazendo esse redimensionamento

    neste link http://pedrofernandes.net/2012/01/21/como-redimensionar-imagens-em-c/

    você vai ver uma forma de fazer isso sem perder (ou perder pouca) qualidade na imagem


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    • Marcado como Resposta wcsantos terça-feira, 16 de outubro de 2012 17:56
    terça-feira, 16 de outubro de 2012 12:57
  • wc, 

    Acredito que você esteja perdendo qualidade devido a forma que esta fazendo esse redimensionamento

    neste link http://pedrofernandes.net/2012/01/21/como-redimensionar-imagens-em-c/

    você vai ver uma forma de fazer isso sem perder (ou perder pouca) qualidade na imagem


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    Apesar do código do link estar errado, depois do acerto funcionou.

    Obrigado!

    terça-feira, 16 de outubro de 2012 17:52
  • Eu trabalhei um bom tempo com imagens, a melhor forma de redimensionar imagens que eu consegui até hoje foi esta.

    http://secretsmind.blogspot.com.br/2009/05/salvando-imagens-em-alta-qualidade.html

    Ela deixa em uma qualidade super boa, e ainda fica super pequena em tamanho(KB). Atente-se ao codec para salvar a imagem, também é muito importante.

    sexta-feira, 19 de outubro de 2012 02:51