2014-11-28 3 views
0

Я пытаюсь уменьшить размеры изображений, например 100px X 100px до 50px X 50px. Я пробую код, но он увеличивает размер изображения, например 270kb до 700kb. Есть идеи?Уменьшение размеров изображений без увеличения размера .net

Стараюсь два метода и имеют один и тот же результат:

public void ResizeImage() 
    { 
     Image img = Image.FromFile("~/Images/image.jpg"); 

     double imgHeight = img.Size.Height; 
     double imgWidth = img.Size.Width; 

     double x = 0.5; 
     //New sizes 
     int newWidth = Convert.ToInt32(imgWidth * x); 
     int newHeight = Convert.ToInt32(imgHeight * x); 

     Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback); 
     Image myThumbnail = img.GetThumbnailImage(newWidth, newHeight, myCallback, IntPtr.Zero); 

     //Save 
     myThumbnail.Save("~/Images/image.jpg"); 

    } 

    public bool ThumbnailCallback() 
    { 
     return false; 
    } 


    public void ResizeImage2() 
    { 
     Image img = Image.FromFile("~/Images/image.jpg"); 

     double imgHeight = img.Size.Height; 
     double imgWidth = img.Size.Width; 

     double x = 0.5; 
     //Seteo nuevos tamaños 
     int newWidth = Convert.ToInt32(imgWidth * x); 
     int newHeight = Convert.ToInt32(imgHeight * x); 


     Bitmap b = new Bitmap(newWidth, newHeight); 
     Graphics g = Graphics.FromImage((Image)b); 
     g.InterpolationMode = InterpolationMode.HighQualityBicubic; 

     g.DrawImage(img, 0, 0, newWidth, newHeight); 
     g.Dispose(); 

     b.Save("~/Images/image.jpg"); 


    } 

Благодарности

+0

если увеличить размер изображения, имеется больше данных, поэтому увеличение размера практически неизбежно. Вы можете снизить качество за счет увеличения сжатия. – Plutonix

+0

@Plutonix он уменьшает его – Artiom

ответ

2

вы сохраняете его в формате BMP. Установите сжатие. http://msdn.microsoft.com/ru-ru/library/9t4syfhh(v=vs.110).aspx Также вы можете прочитать этот пост о качестве сжатия High quality JPEG compression with c#

Для всех перегрузок смотрите здесь Компрессионные http://msdn.microsoft.com/ru-ru/library/System.Drawing.Image.Save(v=vs.110).aspx

Просто

bmp.Save("c:\\button.gif", System.Drawing.Imaging.ImageFormat.Jpeg); 

сохранения с настройками качества

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 
ImageCodecInfo ici = null; 

foreach (ImageCodecInfo codec in codecs) 
{ 
    if (codec.MimeType == "image/jpeg") 
    ici = codec; 
} 

EncoderParameters ep = new EncoderParameters(); 
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100); 
bm.Save("C:\\quality" + x.ToString() + ".jpg", ici, ep); 
+0

Спасибо, это работает! – user3865905

0

Вы SAV ING изображения без указания формата, попытайтесь использовать другую перегрузку Bitmap.Save(): http://msdn.microsoft.com/en-us/library/ms142147(v=vs.110).aspx

, такие как:

b.Save("~/Images/image.jpg", ImageFormat.Jpeg); 

Для изменения размера изображения я обычно использую следующий вспомогательный метод, который может поддерживать соотношение сторон и заполнение. Оригинальный источник: https://stackoverflow.com/a/9301367/1373170

Я изменил его, чтобы использовать потоки, для собственного удобства:

public static void ResizeImage(Image image, Stream outputStream, int maximumWidth, int maximumHeight, bool enforceRatio, bool addPadding) 
    { 
     var canvasWidth = maximumWidth; 
     var canvasHeight = maximumHeight; 
     var newImageWidth = maximumWidth; 
     var newImageHeight = maximumHeight; 
     var xPosition = 0; 
     var yPosition = 0; 

     if (enforceRatio) 
     { 
      var ratioX = maximumWidth/(double)image.Width; 
      var ratioY = maximumHeight/(double)image.Height; 
      var ratio = ratioX < ratioY ? ratioX : ratioY; 
      newImageHeight = (int)(image.Height * ratio); 
      newImageWidth = (int)(image.Width * ratio); 

      if (addPadding) 
      { 
       xPosition = (int)((maximumWidth - (image.Width * ratio))/2); 
       yPosition = (int)((maximumHeight - (image.Height * ratio))/2); 
      } 
      else 
      { 
       canvasWidth = newImageWidth; 
       canvasHeight = newImageHeight; 
      } 
     } 

     var thumbnail = new Bitmap(canvasWidth, canvasHeight); 
     var graphic = Graphics.FromImage(thumbnail); 

     if (enforceRatio && addPadding) 
     { 
      graphic.Clear(Color.White); 
     } 

     graphic.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     graphic.SmoothingMode = SmoothingMode.HighQuality; 
     graphic.PixelOffsetMode = PixelOffsetMode.HighQuality; 
     graphic.CompositingQuality = CompositingQuality.HighQuality; 
     graphic.DrawImage(image, xPosition, yPosition, newImageWidth, newImageHeight); 

     thumbnail.Save(outputStream, ImageFormat.Png); 
    } 

Примечание Этот код использует кодировку PNG, но которые могут быть легко изменены, чтобы быть параметром, чтобы сделать он настраивается.

+0

Действительно спасибо за помощь – user3865905

0

Вам просто нужно установить формат сохранения в jpeg и выбрать другой уровень качества. В нескольких попытках вы можете найти свое правильное качество!

Пример кода (из http://msdn.microsoft.com/it-it/library/ytz20d80(v=vs.110).aspx)

// Save the bitmap as a JPEG file with quality level 25. 
myEncoderParameter = new EncoderParameter(myEncoder, 25L); 
myEncoderParameters.Param[0] = myEncoderParameter; 
myBitmap.Save("Shapes025.jpg", myImageCodecInfo, myEncoderParameters); 
+0

Спасибо за помощь! – user3865905

Смежные вопросы