Низкое качество изображения после изменения размера

Здравствуйте, я использую эту функцию для изменения размера/загрузки изображения. Есть ли какая-либо быстрая настройка, которую я мог бы сделать, чтобы улучшить качество изображения с измененным размером без изменения полной функции?

   FileUpload FileUpload1 =(FileUpload)ListView1.InsertItem.FindControl("FileUpload1");
                string virtualFolder = "~/albume/";
                string physicalFolder = Server.MapPath(virtualFolder);
                string fileName = Guid.NewGuid().ToString();
                string extension = System.IO.Path.GetExtension(FileUpload1.FileName);
                FileUpload1.SaveAs(System.IO.Path.Combine(physicalFolder, fileName + extension));
                //test resize
                System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath("~/albume/") + fileName + extension);
                int srcWidth = img.Width;
                int srcHeight = img.Height;
                int thumbHeight = (int)((800.0 / srcWidth) * srcHeight);
                System.Drawing.Image thumb = img.GetThumbnailImage(800, thumbHeight, null, IntPtr.Zero);
                img.Dispose();
                FileUpload1.Dispose();
                thumb.Save(Server.MapPath("~/albume/") + fileName + extension, System.Drawing.Imaging.ImageFormat.Jpeg);

                //end resize
                myAlbum.poza = fileName + extension;

person Teodor    schedule 28.09.2011    source источник
comment
Ваше изображение содержит уменьшенное изображение? Если это так, это может быть применимо: если вы запрашиваете большое миниатюрное изображение (например, 300 x 300) из изображения, которое имеет встроенную миниатюру, может быть заметная потеря качества миниатюрного изображения. Возможно, было бы лучше масштабировать основное изображение (вместо масштабирования встроенной миниатюры), вызвав метод DrawImage. из документации.   -  person Daniel Hilgarth    schedule 28.09.2011
comment
возможный дубликат изменение размера изображения без потери качества   -  person Davide Piras    schedule 28.09.2011
comment
возможный дубликат масштабирования изображения высокого качества C#   -  person spender    schedule 28.09.2011
comment
Правильное изменение размера изображения сложно и имеет много подводных камней. Корректная реализация с поддержкой jpeg требует 5 страниц кода. Правильная реализация с поддержкой GIF требует 80 страниц кода. Я бы предложил использовать библиотеку для правильного изменения размера, кадрирования и кодирования.   -  person Lilith River    schedule 10.01.2012


Ответы (4)


вместо этого кода:

thumb.Save(Server.MapPath("~/albume/") + fileName + extension, System.Drawing.Imaging.ImageFormat.Jpeg);

используйте этот:

System.Drawing.Imaging.ImageCodecInfo[] info = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
System.Drawing.Imaging.EncoderParameters param = new System.Drawing.Imaging.EncoderParameters(1);
param.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
thumb.Save(Server.MapPath("~/albume/") + fileName + extension, info[1], param);
person nmokkary    schedule 02.05.2012

используйте этот фрагмент:

Bitmap newImage = new Bitmap(newWidth, newHeight);
using (Graphics gr = Graphics.FromImage(newImage))
{
    gr.SmoothingMode = SmoothingMode.AntiAlias;
    gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
    gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
    gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
}

украдено из этого вопроса/ответа: изменение размера изображения без потери качества посмотрите ультра проголосовавший ответ Криса и проголосуйте за него :)

person Davide Piras    schedule 28.09.2011
comment
спасибо, я пытаюсь реализовать рекомендованную вами функцию, но получаю System.Runtime.InteropServices.ExternalException: в GDI+ произошла общая ошибка. .. работаю над этим, я новичок в С# - person Teodor; 28.09.2011

На своем сайте я использую следующий код для изменения размера пользовательских изображений перед их отправкой на страницу.

Возможно, вы сможете использовать что-то подобное — попробуйте изучить различные режимы интерполяции.

using (Graphics graphics = Graphics.FromImage(target))
{
    graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
    graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
    graphics.Clear(ColorTranslator.FromHtml("#F4F6F5"));
    graphics.DrawImage(bmp, 0, 0, 145, 145);
    using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream())
    {
        target.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);                    
        memoryStream.WriteTo(context.Response.OutputStream);
    }
}
person Oliver    schedule 28.09.2011

Лучше не использовать «GetThumbnailImage», это снижает качество. Согласно http://msdn.microsoft.com/de-de/library/system.drawing.image.getthumbnailimage%28VS.80%29.aspx

Измените размер изображения, перерисовав его следующим образом:

private static Image resizeImage(Image imgToResize, Size size)
{
   int sourceWidth = imgToResize.Width;
   int sourceHeight = imgToResize.Height;

   float nPercent = 0;
   float nPercentW = 0;
   float nPercentH = 0;

   nPercentW = ((float)size.Width / (float)sourceWidth);
   nPercentH = ((float)size.Height / (float)sourceHeight);

   if (nPercentH < nPercentW)
      nPercent = nPercentH;
   else
      nPercent = nPercentW;

   int destWidth = (int)(sourceWidth * nPercent);
   int destHeight = (int)(sourceHeight * nPercent);

   Bitmap b = new Bitmap(destWidth, destHeight);
   Graphics g = Graphics.FromImage((Image)b);
   g.InterpolationMode = InterpolationMode.HighQualityBicubic;

   g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
   g.Dispose();

   return (Image)b;
}

находится на

person oberfreak    schedule 28.09.2011