Usuário com melhor resposta
Tamanho em kb ao reduzir imagem

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.
Respostas
-
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
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. -
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
-
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