1. 程式人生 > >C#實戰小技巧(六):生成縮圖

C#實戰小技巧(六):生成縮圖

在C#開發中,經常會遇到為某張圖片生成縮圖的需求,本文提供一個能夠生成縮圖的C#函式,支援將bmp、png、jpg等常見格式的靜態圖片壓縮,生成縮圖,可以避免png圖片丟失透明度。不過該函式的圖片壓縮方法比較簡單,只能壓縮20M以內的圖片,圖片大於20M將出現記憶體錯誤,有待改進。

        /// <summary>
        /// 壓縮圖片並儲存,檔名為compress_+原檔名
        /// </summary>
        /// <param name="filePath">原圖路徑</param>
        /// <returns>
縮圖路徑</returns>
private string GetReducedImage(string filePath) { string fileDir = new StringBuilder(AppDomain.CurrentDomain.BaseDirectory).Append(ICTResources.ICTUser.Session.useraccount).Append("\\Image").ToString(); if (!Directory.Exists(fileDir)) { Directory.CreateDirectory(fileDir); } string
compressName = new StringBuilder(fileDir).Append("\\compress_").Append(Path.GetFileName(filePath)).ToString(); int minSize = 200; Graphics draw = null; System.Drawing.Image ResourceImage = System.Drawing.Image.FromFile(filePath); double percent = 0.4; int
imageWidth = Convert.ToInt32(ResourceImage.Width); int imageHeight = Convert.ToInt32(ResourceImage.Height); if (imageWidth > imageHeight) { if (imageWidth > minSize) { percent = Convert.ToDouble(minSize) / imageWidth; imageWidth = minSize; imageHeight = (int)(imageHeight * percent); } } else { if (imageHeight > minSize) { percent = Convert.ToDouble(minSize) / imageHeight; imageHeight = minSize; imageWidth = (int)(imageWidth * percent); } } // 新建一個bmp圖片 System.Drawing.Image bitmap = new System.Drawing.Bitmap(imageWidth, imageHeight); System.Drawing.Image bitmap2 = new System.Drawing.Bitmap(imageWidth, imageHeight); // 新建一個畫板 System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap); try { // 設定高質量插值法 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; // 設定高質量,低速度呈現平滑程度 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; // 清空畫布並以透明背景色(白色)填充 g.Clear(System.Drawing.Color.White); //g.Clear(System.Drawing.Color.Transparent); // 在指定位置並且按指定大小繪製原圖片的指定部分 g.DrawImage(ResourceImage, new System.Drawing.Rectangle(0, 0, imageWidth, imageHeight)); // 用新建立的image物件拷貝bitmap物件 讓g物件可以釋放資源 draw = Graphics.FromImage(bitmap2); draw.DrawImage(bitmap, 0, 0); // 設定縮圖編碼格式 ImageCodecInfo ici = null; if (Path.GetExtension(filePath).Equals(".png") || Path.GetExtension(filePath).Equals(".PNG")) { //ici = this.getImageCoderInfo("image/png"); ici = this.getImageCoderInfo("image/jpeg"); } else if (Path.GetExtension(filePath).Equals(".gif") || Path.GetExtension(filePath).Equals(".GIF")) { ici = this.getImageCoderInfo("image/gif"); } else { ici = this.getImageCoderInfo("image/jpeg"); } // 設定壓縮率 long ratio = 20L; // 壓縮為原圖20%的質量 System.Drawing.Imaging.Encoder ecd = System.Drawing.Imaging.Encoder.Quality; ResourceImage.Dispose(); bitmap.Dispose(); g.Dispose(); draw.Dispose(); // 儲存調整在這裡即可 using (EncoderParameters eptS = new EncoderParameters(1)) { using (EncoderParameter ept = new EncoderParameter(ecd, ratio)) { eptS.Param[0] = ept; bitmap2.Save(compressName, ici, eptS); } } } catch (System.Exception e) { compressName = string.Empty; } finally { if (ResourceImage != null) { ResourceImage.Dispose(); } if (bitmap != null) { bitmap.Dispose(); } if (g != null) { g.Dispose(); } if (bitmap2 != null) { bitmap2.Dispose(); } if (draw != null) { draw.Dispose(); } } return compressName; } /// <summary> /// 獲取圖片編碼 /// </summary> /// <param name="coderType">編碼格式:image/png、image/jpeg等</param> /// <returns></returns> private ImageCodecInfo getImageCoderInfo(string coderType) { ImageCodecInfo[] iciS = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo retIci = null; foreach (ImageCodecInfo ici in iciS) { if (ici.MimeType.Equals(coderType)) { retIci = ici; } } return retIci; }