標籤:縮圖 c# 不失真
最近一個手持機項目有個需求,因為物料圖片的大小不一,有的很大顯示到手持機上會只顯示圖片的一部分,介面顯得非常亂,很影響客戶的體驗度。所以需要一個方法,將上傳到伺服器上的圖片進行處理,按照一定的大小格式進行儲存。
下面提供了兩種擷取圖片縮圖的方法,供大家參考。
方法一:通過調用Image對象的內建方法GetThumbnailImage()進行圖片轉換
/// <summary> /// 產生縮圖重載方法,返回縮圖的Image對象 /// </summary> /// <param name="width">縮圖的寬度</param> /// <param name="height">縮圖的高度</param> /// <param name="imageFrom">原Image對象</param> /// <returns>縮圖的Image對象</returns> public Image GetReducedImage2(int width, int height, Image imageFrom) { // 源圖寬度及高度 int imageFromWidth = imageFrom.Width; int imageFromHeight = imageFrom.Height; try { // 產生的縮圖實際寬度及高度.如果指定的高和寬比原圖大,則返回原圖;否則按照指定高寬產生圖片 if (width >= imageFromWidth && height >= imageFromHeight) { return imageFrom; } else { Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(() => { return false; }); //調用Image對象內建的GetThumbnailImage()進行圖片縮減 Image reducedImage = imageFrom.GetThumbnailImage(width, height, callb, IntPtr.Zero); //將圖片以指定的格式儲存到到指定的位置 reducedImage.Save(@"E:\640x480.png", ImageFormat.Png); return reducedImage; } } catch (Exception) { //拋出異常 throw new Exception("轉換失敗,請重試!"); } }
方法二:採用雙立方插值法,執行預篩選以確保高品質的收縮,此模式可產生品質教高的轉換映像。
/// <summary> /// 按照指定的高和寬產生相應的規格的圖片,採用此方法產生的縮圖片不會失真 /// </summary> /// <param name="width">指定寬度</param> /// <param name="height">指定高度</param> /// <param name="imageFrom">原圖片</param> /// <returns>返回新產生的圖</returns> public static Image GetReducedImage(int width, int height, Image imageFrom) { // 源圖寬度及高度 int imageFromWidth = imageFrom.Width; int imageFromHeight = imageFrom.Height; // 產生的縮圖實際寬度及高度.如果指定的高和寬比原圖大,則返回原圖;否則按照指定高寬產生圖片 if (width >= imageFromWidth && height >= imageFromHeight) { return imageFrom; } else { // 產生的縮圖在上述"畫布"上的位置 int X = 0; int Y = 0; // 建立畫布 Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); bmp.SetResolution(imageFrom.HorizontalResolution, imageFrom.VerticalResolution); using (Graphics g = Graphics.FromImage(bmp)) { // 用白色清空 g.Clear(Color.White); // 指定高品質的雙立方插值法。執行預篩選以確保高品質的收縮。此模式可產生品質最高的轉換映像。 g.InterpolationMode = InterpolationMode.HighQualityBicubic; // 指定高品質、低速度呈現。 g.SmoothingMode = SmoothingMode.HighQuality; // 在指定位置並且按指定大小繪製指定的 Image 的指定部分。 g.DrawImage(imageFrom, new Rectangle(X, Y, width, height), new Rectangle(0, 0, imageFromWidth, imageFromHeight), GraphicsUnit.Pixel); //將圖片以指定的格式儲存到到指定的位置 bmp.Save(@"E:\640x480.png", ImageFormat.Png); return bmp; } } }
先分享這兩種方法,大家可以嘗試。
C#產生縮圖不失真的方法