昨天碰到一個很奇怪的事情,在最近的一個項目有這樣的一個需求,把上傳的圖片進行壓縮,避免因圖片過大而影響浏覽速度。
代碼也很簡單三兩句就可以實現了,但發現壓縮後的圖片,雖然有變小,但還不是很明顯。
代碼如下:
01 public void CreateThumbnailImage()
02 {
03 Image img = Image.FromFile("e:/1.jpg");
04 Image.GetThumbnailImageAbort cb = new Image.GetThumbnailImageAbort(CallBack);
05 Image thumbnailImage = img.GetThumbnailImage(120, 120, cb, System.IntPtr.Zero);
06 thumbnailImage.Save("e:/2.jpg");
07 }
08 public bool CallBack()
09 {
10 return false;
11 }
本來是一張大約800*700的圖片(80kb),壓縮到120*110左右的圖片,大小應該在10kb以內,但我卻發現壓縮後的圖片卻有45kb。有個別的圖片壓縮後反而比原來的更大,而且用網頁打開也無法顯示。
後來查了一下相關的文檔,發現.net在保存圖片時,是以png默認的格式來保存,我想問題應該就是出在這了,還是試試吧。
01 //獲得縮略圖
02 public void CreateThumbnailImage()
03 {
04 string imgFile = "e:/1.jpg";
05 Image img = Image.FromFile(imgFile);
06 Image.GetThumbnailImageAbort cb = new Image.GetThumbnailImageAbort(CallBack);
07 Image thumbnailImage = img.GetThumbnailImage(120, 120, cb, System.IntPtr.Zero);
08 string extendName = imgFile.Substring(imgFile.LastIndexOf(".") + 1);
09 ImageFormat imgFormat = GetImageFormat(extendName);
10 thumbnailImage.Save("e:/2.jpg",imgFormat);
11 }
12 public bool CallBack()
13 {
14 return false;
15 }
16 //獲得圖片格式
17 private static ImageFormat GetImageFormat(String extendName)
18 {
19 extendName = extendName.ToLower();
20 if (extendName == "gif")
21 {
22 return ImageFormat.Gif;
23 }
24 else if (extendName == "jpg" || extendName == "jpeg")
25 {
26 return ImageFormat.Jpeg;
27 }
28 else if (extendName == "bmp")
29 {
30 return ImageFormat.Bmp;
31 }
32 else if (extendName == "wmf")
33 {
34 return ImageFormat.Emf;
35 }
36 else if (extendName == "exif")
37 {
38 return ImageFormat.Exif;
39 }
40 else if (extendName == "icon")
41 {
42 return ImageFormat.Icon;
43 }
44 else if (extendName == "tiff")
45 {
46 return ImageFormat.Tiff;
47 }
48 else
49 {
50 return ImageFormat.Png;
51 }
52 }
還真的是這樣,壓縮後的圖片大小就只有4.6kb。
壓縮注意事項:
1、壓縮圖片要指定保存的格式,雖然保存後圖片名稱是對的,但圖片還是很大,而且在網頁上還無法顯示。
2、對於圖片格式為gif且為透明的圖片,如果壓縮後要保留透明的,那壓縮的格式就要用png的,而且圖片的擴展名也為png,若壓縮成gif的格式,它無法保留透明的部分。