none
Tamanho em kb ao reduzir imagem RRS feed

  • Pergunta

  • Olá,

    No fileupload estou redimensionando uma imagem para ficar com 480px de largura com o codigo abaixo.
    A imagem original tem 2MB. Quando faço esse redimensionamento a imagem fica com 400kb.
    Porém, se uso um software para redimensionar a mesma imagem para 480px, consigo reduzir ela para 80kb mantendo a qualidade visual.
    Sabem qual código devo usar para reduzir a imagem (em kb) para esses mesmo 80kb(ou menos se possível) mantendo a qualidade visual?

    Bitmap newImg = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);                           
    Graphics newGraphic = Graphics.FromImage(newImg);
    newGraphic.DrawImage(imagem, 0, 0, width, height);
    newGraphic.Dispose();
    newImg.Save(caminho);

    Obrigado.

    domingo, 26 de janeiro de 2014 22:30

Respostas

Todas as Respostas

  • Bom dia ManducaDev,

    Eu já respondi uma Thread onde a duvida do usuário era parecida...

    Se não me engano não tem como você redimensionar a imagem sem perder um pouco da qualidade, mesmo que seja praticamente imperceptivel ao olho humano um pouco da qualidade é sempre perdida. Veja:

    http://forums.asp.net/t/1820178.aspx

    Abaixo tem um código que faz o procedimento de redimensionar a imagem "sem perder" a qualidade visual:

    private void MakeLarge()
    
    {
    
    System.Drawing.Image myThumbnail150;
    
    object obj = new object();
    
    obj = fuPhoto;
    
    System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
    
    HtmlInputFile hFile = (HtmlInputFile)obj;
    
    if (hFile.PostedFile != null && hFile.PostedFile.ContentLength > 0)
    
    {
    
    //this code used to remove some symbols between image name and replace with space
    
    string imgname1 = hFile.PostedFile.FileName.Replace('%', ' ').Substring(hFile.PostedFile.FileName.LastIndexOf("\\") + 1);
    
    string imgname2 = imgname1.Replace('#', ' ').Substring(imgname1.LastIndexOf("\\") + 1);
    
    string imgname3 = imgname2.Replace('@', ' ').Substring(imgname1.LastIndexOf("\\") + 1);
    
    string imgname4 = imgname3.Replace(',', ' ').Substring(imgname1.LastIndexOf("\\") + 1);
    
    string imgname5 = imgname4.Replace('&', ' ').Substring(imgname1.LastIndexOf("\\") + 1);
    
    
    Finalimagename = imgname5.ToString();
    
    
    string imgname = hFile.PostedFile.FileName.Substring(hFile.PostedFile.FileName.LastIndexOf("\\") + 1);
    
    string sExtension = imgname.Substring(imgname.LastIndexOf(".") + 1);
    
    
    //this code is used to check image extension
    
    if (sExtension.ToLower() == "jpg" || sExtension.ToLower() == "gif" || sExtension.ToLower() == "bmp" || sExtension.ToLower() == "jpeg")
    
    {
    
    
    hFile.PostedFile.SaveAs(ResolveUrl(Server.MapPath("~/Product_Photo_Large/" + Finalimagename)));
    
    //imgOriginal = "Product_Photo_Large\\" + Finalimagename;
    
    System.Drawing.Image imagesize = System.Drawing.Image.FromFile(Server.MapPath("~/Product_Large\\" + fuPhoto.PostedFile.FileName));
    
    Bitmap bitmapNew = new Bitmap(imagesize);
    
    
    if (imagesize.Width <>
    
    {
    
    
    myThumbnail150 = bitmapNew.GetThumbnailImage(410 * imagesize.Width / imagesize.Height, 410, myCallback, IntPtr.Zero);
    
    // myLarge = bitmapNew.GetThumbnailImage(410, 310, myCallback, IntPtr.Zero);
    
    }
    
    else if (imagesize.Width > imagesize.Height)
    
    {
    
    myThumbnail150 = bitmapNew.GetThumbnailImage(390, 390 * imagesize.Height / imagesize.Width, myCallback, IntPtr.Zero);
    
    // myLarge = bitmapNew.GetThumbnailImage(410, 310, myCallback, IntPtr.Zero);
    
    }
    
    else
    
    {
    
    myThumbnail150 = bitmapNew.GetThumbnailImage(390, 390, myCallback, IntPtr.Zero);
    
    }
    
    
    //Create a new directory name ThumbnailImage
    
    //Directory.CreateDirectory(Server.MapPath("ThumbnailImage"));
    
    //Save image in TumbnailImage folder
    
    myThumbnail150.Save(ResolveUrl(Server.MapPath("~/Resize\\")) + Finalimagename, System.Drawing.Imaging.ImageFormat.Jpeg);
    
    imgOriginal = "Resize\\" + Finalimagename;
    
    // MessageLabel.Text = "Successfully uploaded";
    
    
    
    }
    
    else
    
    {
    
    // lblError1.Visible = true;
    
    //lblError1.Text = "Check image extension";
    
    }
    
    }
    
    }
    
    
    
    
    And another function to resize your image is as here..
    
    
    private Bitmap ResizeImage(Stream streamImage, int maxWidth, int maxHeight)
    
    {
    
    Bitmap originalImage = new Bitmap(streamImage);
    
    int newWidth = originalImage.Width;
    
    int newHeight = originalImage.Height;
    
    double aspectRatio = (double)originalImage.Width / (double)originalImage.Height;
    
    
    if (aspectRatio <= 1 && originalImage.Width > maxWidth)
    
    {
    
    newWidth = maxWidth;
    
    newHeight = (int)Math.Round(newWidth / aspectRatio);
    
    }
    
    else if (aspectRatio > 1 && originalImage.Height > maxHeight)
    
    {
    
    newHeight = maxHeight;
    
    newWidth = (int)Math.Round(newHeight * aspectRatio);
    
    }
    
    
    Bitmap newImage = new Bitmap(originalImage, newWidth, newHeight);
    
    
    Graphics g = Graphics.FromImage(newImage);
    
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
    
    g.DrawImage(originalImage, 0, 0, newImage.Width, newImage.Height);
    
    
    originalImage.Dispose();
    
    
    return newImage;
    
    }


    Giovani Cruzara – Microsoft Contingent Staff

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Msdn Community Support

    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 27 de janeiro de 2014 10:38
  • Olá Giovane,

    Obrigado pela resposta.

    O primeiro método que vc sugeriu é o GetThumbnailImage.
    Esse funciona quando vc quer reduzir para um tamanho bem pequeno.
    Mas não é adequado para reduzir para tamanhos que, embora menores, ainda sejam grandes (480px de largura no meu caso). Se fizeres um teste verá que a qualidade da imagem fica horrível visualmente.

    O segundo método que sugeres é o mesmo que coloquei no meu post original (DrawImage). Esse como falei originalmente, mantém a qualidade visual mas por outro lado a imagem fica muito grande em termos de armazenamento (cerca de 400kb).

    Ou seja, nenhuma das idéias resolve.

    abraço

    segunda-feira, 27 de janeiro de 2014 23:00
  • Manduca

    Dê uma olhada nos links abaixo, poderão te ajudar.

    http://www.ecode10.com/artigo/1810/Zoom-e-rotacionar-imagem-usando-CSharp-e-ASP-NET

    http://www.ecode10.com/artigo/830/Converte-Imagem-em-Array-e-Array-em-Imagem

    http://www.ecode10.com/artigo/32/UPLOAD-Enviando-imagem-pela-InternetAcredito que tenha uma melhor solução pra você fazer. Uma imagem de 2MB é muito grande.


    Espero ter ajudado. Se ajudei, favor marcar no fórum falando que foi útil.

    Mauricio Junior - Comunidade www.ecode10.com

    • Marcado como Resposta Giovani Cr quarta-feira, 5 de fevereiro de 2014 11:27
    terça-feira, 28 de janeiro de 2014 12:07