2012-01-01 240 views
3

我需要通過網絡來傳輸一些圖片,我保存JPEG和40%的圖像質量如下:更改尺寸

public void SaveJpeg(string path, Image image, int quality) { 
     if((quality < 0) || (quality > 100)) { 
      string error = string.Format("Jpeg image quality must be 
between 0 and 100, with 100 being the highest quality. A value of {0} was 
specified.", quality); 
      throw new ArgumentOutOfRangeException(error); 
     } 
     EncoderParameter qualityParam = new 
EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); 
     ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg"); 
     EncoderParameters encoderParams = new EncoderParameters(1); 
     encoderParams.Param[0] = qualityParam; 
     image.Save(path, jpegCodec, encoderParams); 
    } 

但隨着這樣的JPEG文件的大小不夠小,我也改變質量,但這不是很好的外觀。有什麼辦法可以保存較小文件大小和適當外觀的圖片嗎?我不知道,但有沒有辦法使用System.Drawing.Graphics對象,我也不需要壓縮文件,或者更改圖像的尺寸,現在只是圖片文件的大小很重要。

+0

您可以使寬度和高度更小或者必須使圖片尺寸保持不變嗎? – 2012-01-01 13:02:11

+0

@Jason Down不,我希望能找到一種無變化的方式 – Saeid 2012-01-01 13:03:09

+0

那麼真的只有三種方法來減小文件的大小。降低質量,減小尺寸或將格式更改爲具有更好壓縮比的其他格式(不知道如何在.Net中以任何方式執行此操作,而不是通常的選擇)。 – 2012-01-01 13:08:48

回答

2

對於圖像壓縮,創建小文件和創建質量較差的圖像之間存在細微的差別。 JPEG是一種有損壓縮格式,這意味着數據在壓縮時會被刪除,這就是爲什麼不斷重新編碼JPEG文件會不斷降低其質量的原因。

另一方面,PNG文件是無損的,但仍可能導致更大的文件。您可以嘗試使用PngBitmapEncoder將文件編碼爲PNG。這將確保質量仍然很高,但尺寸可能會或可能不會降低到足夠您的程序(這取決於圖像)。

如果您在本地計算機上執行此操作,並且不需要經常執行此操作(例如對於許多併發用戶),則可以調用外部程序爲您執行操作。 PNG Monster非常擅長壓縮PNG文件而不降低質量。你可以從你的程序調用它併發送PNG文件。 (您可能想檢查許可條款以確保它與您的程序兼容)。

沒有很多方法可以保持高質量並同時執行高壓縮,而無需操縱圖像(例如更改尺寸)。

0

我有一個方法來創建和保存上傳圖片的縮略圖,我認爲NewImageSize方法可能會幫助你。它也處理質量問題。

public Size NewImageSize(int OriginalHeight, int OriginalWidth, double FormatSize) 
     { 
      Size NewSize; 
      double tempval; 

      if (OriginalHeight > FormatSize && OriginalWidth > FormatSize) 
      { 
       if (OriginalHeight > OriginalWidth) 
        tempval = FormatSize/Convert.ToDouble(OriginalHeight); 
       else 
        tempval = FormatSize/Convert.ToDouble(OriginalWidth); 

       NewSize = new Size(Convert.ToInt32(tempval * OriginalWidth), Convert.ToInt32(tempval * OriginalHeight)); 
      } 
      else 
       NewSize = new Size(OriginalWidth, OriginalHeight); return NewSize; 
     } 

     private bool save_image_with_thumb(string image_name, string path) 
     { 

       ResimFileUpload1.SaveAs(path + image_name + ".jpg"); //normal resim kaydet 



      ///////Thumbnail yarat ve kaydet////////////// 
      try 
      { 
       Bitmap myBitmap; 

       myBitmap = new Bitmap(path + image_name + ".jpg"); 

       Size thumbsize = NewImageSize(myBitmap.Height, myBitmap.Width, 100); 

       System.Drawing.Image.GetThumbnailImageAbort myCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback); 

       // If jpg file is a jpeg, create a thumbnail filename that is unique. 

       string sThumbFile = path + image_name + "_t.jpg"; 

       // Save thumbnail and output it onto the webpage 

       System.Drawing.Image myThumbnail = myBitmap.GetThumbnailImage(thumbsize.Width, thumbsize.Height, myCallBack, IntPtr.Zero); 

       myThumbnail.Save(sThumbFile); 

       // Destroy objects 
       myThumbnail.Dispose(); 
       myBitmap.Dispose(); 

       return true; 
      } 
      catch //yaratamazsa normal ve thumb iptal 
      { 
       return false; 
      } 
      /////////////////////////////////// 

     }