最近項目有部分需求,是關於圖片操作部分的, 大致的功能就是圖片的保存和展示。但是直接操作原圖,程序運行效率太慢。而且如果傳輸數據量過大的話,可能直接導致調用WCF服務失敗的問題。
為了解決這個問題,決定采用縮略圖的方法。保存數據的時候保存原圖和其縮略圖。但主界面展示的時候只加載縮略圖,點擊縮略圖後再顯示其原圖。這樣就避免了一進入主界面就加載大量數據,提高了效率。
那麼問題就來了,怎麼將原圖進行處理變成縮略圖呢?
下面提供了一個圖片處理的類,用來生成縮略圖。對GetReducedImage函數進行4次重載來完成不同的需求。
using System.IO; using System.Drawing; using System.Drawing.Imaging; ////// 圖片處理類 /// 1、生成縮略圖片或按照比例改變圖片的大小和畫質 /// 2、將生成的縮略圖放到指定的目錄下 /// public class ImageClass { public Image ResourceImage; private int ImageWidth; private int ImageHeight; public string ErrMessage; ////// 類的構造函數 /// /// 圖片文件的全路徑名稱 public ImageClass(string ImageFileName) { ResourceImage = Image.FromFile(ImageFileName); ErrMessage = ""; } public bool ThumbnailCallback() { return false; } ////// 生成縮略圖重載方法1,返回縮略圖的Image對象 /// /// 縮略圖的寬度 /// 縮略圖的高度 ///縮略圖的Image對象 public Image GetReducedImage(int Width, int Height) { try { Image ReducedImage; Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero); return ReducedImage; } catch (Exception e) { ErrMessage = e.Message; return null; } } ////// 生成縮略圖重載方法2,將縮略圖文件保存到指定的路徑 /// /// 縮略圖的寬度 /// 縮略圖的高度 /// 縮略圖保存的全文件名,(帶路徑),參數格式:D:Images ilename.jpg ///成功返回true,否則返回false public bool GetReducedImage(int Width, int Height, string targetFilePath) { try { Image ReducedImage; Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero); ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg); ReducedImage.Dispose(); return true; } catch (Exception e) { ErrMessage = e.Message; return false; } } ////// 生成縮略圖重載方法3,返回縮略圖的Image對象 /// /// 縮略圖的寬度百分比 如:需要百分之80,就填0.8 ///縮略圖的Image對象 public Image GetReducedImage(double Percent) { try { Image ReducedImage; Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent); ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent); ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero); return ReducedImage; } catch (Exception e) { ErrMessage = e.Message; return null; } } ////// 生成縮略圖重載方法4,返回縮略圖的Image對象 /// /// 縮略圖的寬度百分比 如:需要百分之80,就填0.8 /// 縮略圖保存的全文件名,(帶路徑),參數格式:D:Images ilename.jpg ///成功返回true,否則返回false public bool GetReducedImage(double Percent, string targetFilePath) { try { Image ReducedImage; Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent); ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent); ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero); ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg); ReducedImage.Dispose(); return true; } catch (Exception e) { ErrMessage = e.Message; return false; } } }
效果圖:
用GetReducedImage(double Percent)方法測試了一下,傳入縮略百分比為 0.05<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHAgbGFuZz0="en-US">
原圖大小為1M,處理後的圖片大小僅幾十KB,程序運行效率的確提高了不少。