標籤:圖片處理 縮圖 c# image
最近項目有部分需求,是關於圖片操作部分的, 大致的功能就是圖片的儲存和展示。但是直接操作原圖,程式運行效率太慢。而且如果傳輸資料量過大的話,可能直接導致調用WCF服務失敗的問題。
為瞭解決這個問題,決定採用縮圖的方法。儲存資料的時候儲存原圖和其縮圖。但主介面展示的時候只載入縮圖,點擊縮圖後再顯示其原圖。這樣就避免了一進入主介面就載入大量資料,提高了效率。
那麼問題就來了,怎麼將原圖進行處理變成縮圖呢?
下面提供了一個圖片處理的類,用來產生縮圖。對GetReducedImage函數進行4次重載來完成不同的需求。
using System.IO;using System.Drawing;using System.Drawing.Imaging;/// <summary> /// 圖片處理類 /// 1、產生縮圖片或按照比例改變圖片的大小和畫質 /// 2、將產生的縮圖放到指定的目錄下 /// </summary> public class ImageClass{ public Image ResourceImage; private int ImageWidth; private int ImageHeight; public string ErrMessage; /// <summary> /// 類的建構函式 /// </summary> /// <param name="ImageFileName">圖片檔案的全路徑名稱</param> public ImageClass(string ImageFileName) { ResourceImage = Image.FromFile(ImageFileName); ErrMessage = ""; } public bool ThumbnailCallback() { return false; } /// <summary> /// 產生縮圖重載方法1,返回縮圖的Image對象 /// </summary> /// <param name="Width">縮圖的寬度</param> /// <param name="Height">縮圖的高度</param> /// <returns>縮圖的Image對象</returns> 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; } } /// <summary> /// 產生縮圖重載方法2,將縮圖檔案儲存到指定的路徑 /// </summary> /// <param name="Width">縮圖的寬度</param> /// <param name="Height">縮圖的高度</param> /// <param name="targetFilePath">縮圖儲存的全檔案名稱,(帶路徑),參數格式:D:Images ilename.jpg</param> /// <returns>成功返回true,否則返回false</returns> 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; } } /// <summary> /// 產生縮圖重載方法3,返回縮圖的Image對象 /// </summary> /// <param name="Percent">縮圖的寬度百分比 如:需要百分之80,就填0.8</param> /// <returns>縮圖的Image對象</returns> 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; } } /// <summary> /// 產生縮圖重載方法4,返回縮圖的Image對象 /// </summary> /// <param name="Percent">縮圖的寬度百分比 如:需要百分之80,就填0.8</param> /// <param name="targetFilePath">縮圖儲存的全檔案名稱,(帶路徑),參數格式:D:Images ilename.jpg</param> /// <returns>成功返回true,否則返回false</returns> 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
原圖大小為1M,處理後的圖片大小僅幾十KB,程式運行效率的確提高了不少。
C# 產生圖片縮圖