2012-01-01 170 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; 
      } 
      /////////////////////////////////// 

     }