代碼非原創。ide
由於在項目中須要用到壓縮圖片的功能,因此就在網上找到了這段代碼,稍微探索了一下發現其功能仍是比較齊全的。大意就是一個對圖片從新編碼的過程。函數
經過System.Drawing.Image類以及繼承自他的Bitmap和Metafile類可完成對圖片格式的轉換(BMP/JPEG/GIF/TIFF/PNG),轉存JPEG時的質量壓縮,以及裁剪和縮放(該部分不在本文討論範圍)。代碼以下:
編碼
代碼有點亂,說一下大體思路,spa
首先將須要的圖片讀取進來code
Image iSource = Image.FromFile(sFile);
以後是生成一個Image.save()時的參數,用於設置JPEG的壓縮比例,值越小,壓縮率越大orm
Imaging.EncoderParameters ep = new Imaging.EncoderParameters(); long[] qy = new long[1]; qy[0] = flag;//設置壓縮的比例1-100 Imaging.EncoderP arameter eParam = new Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy); ep.Param[0] = eParam;
選擇你編碼器,系統內置的編碼器只有BMP/JPEG/GIF/TIFF/PNG這幾種格式。blog
System.Drawing.Imaging.ImageCodecInfo[] arrayICI = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();//獲取系統內置的編碼器 System.Drawing.Imaging.ImageCodecInfo jpegICIinfo = null; for (int x = 0; x < arrayICI.Length; x++) { if (arrayICI[x].FormatDescription.Equals("JPEG")) { jpegICIinfo = arrayICI[x];//查找出JPEG編碼器 break; } }
最後就是保存 繼承
iSource.Save(dPath, jpegICIinfo, ep);
具體更加深刻的內容還將來得及探索,若有則留做以後補充。圖片
完整的函數代碼以下: ip
1 /// <summary> 2 /// 壓縮圖片分辨率 3 /// </summary> 4 /// <param name="sFile">原圖片的完整路徑</param> 5 /// <param name="dPath">目標位置的完整路徑</param> 6 /// <param name="flag">圖片的壓縮比例</param> 7 /// <returns></returns> 8 public static bool CompressPic(string sFile, string dPath, int flag) 9 { 10 if (!File.Exists(sFile)) 11 { 12 return false; 13 } 14 string path1 = Path.GetDirectoryName(dPath); 15 if (!Directory.Exists(path1)) 16 { 17 Directory.CreateDirectory(path1); 18 } 19 20 System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile); 21 System.Drawing.Imaging.ImageFormat tFormat = iSource.RawFormat; 22 //如下代碼爲保存圖片時,設置壓縮質量 23 System.Drawing.Imaging.EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters(); 24 long[] qy = new long[1]; 25 qy[0] = flag;//設置壓縮的比例1-100 26 System.Drawing.Imaging.EncoderParameter eParam = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy); 27 ep.Param[0] = eParam; 28 try 29 { 30 System.Drawing.Imaging.ImageCodecInfo[] arrayICI = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();//獲取系統內置的編碼器 31 System.Drawing.Imaging.ImageCodecInfo jpegICIinfo = null; 32 for (int x = 0; x < arrayICI.Length; x++) 33 { 34 if (arrayICI[x].FormatDescription.Equals("JPEG")) 35 { 36 jpegICIinfo = arrayICI[x];//查找出JPEG編碼器 37 break; 38 } 39 } 40 if (jpegICIinfo != null) 41 { 42 iSource.Save(dPath, jpegICIinfo, ep);//dFile是壓縮後的新路徑 43 } 44 else 45 { 46 iSource.Save(dPath, tFormat); 47 } 48 return true; 49 } 50 catch 51 { 52 return false; 53 } 54 finally 55 { 56 iSource.Dispose(); 57 } 58 }