C#實現圖片縮略圖生成:多種模式詳解與實踐
在圖像處理的場景中,生成圖片縮略圖是一項常見且實用的功能。無論是搭建圖片展示網站,還是開發本地圖片管理工具,按需生成合適尺寸的縮略圖,能夠有效減少圖片傳輸和顯示所需的資源,提升用戶體驗。本文將基于一段 C# 代碼,詳細介紹如何在 C# 中實現圖片縮略圖的生成,并支持多種不同的縮放模式。
一、代碼整體結構
代碼主要包含了三個核心部分:枚舉類型ThumbnailMode
用于定義縮略圖生成模式,類ThumbnailOptions
封裝生成縮略圖所需的參數,類Thumbnail
則負責具體的縮略圖生成邏輯。
1. 定義縮略圖生成模式枚舉
public enum ThumbnailMode
{Cut,Hw,H,W,
}
ThumbnailMode
枚舉定義了四種不同的縮略圖生成模式:
Cut
:指定高寬裁減(不變形)。該模式會根據目標寬高比例和原圖寬高比例進行計算,對原圖進行裁剪,以保證生成的縮略圖符合指定尺寸且不會變形。Hw
:指定高寬縮放(可能變形)。直接按照給定的目標寬度和高度對原圖進行縮放,不考慮原圖的寬高比例,可能導致圖片拉伸變形。W
:指定寬,高按比例。根據給定的目標寬度,按照原圖的寬高比例自動計算出對應的高度,從而生成等比例縮放的縮略圖。H
:指定高,寬按比例。與W
模式類似,根據給定的目標高度,按照原圖的寬高比例自動計算出對應的寬度。
2. 封裝縮略圖生成參數類
public class ThumbnailOptions
{/// <summary>/// 縮略圖寬度/// </summary>public int Width { get; set; }/// <summary>/// 縮略圖高度/// </summary>public int Height { get; set; }/// <summary>/// 生成縮略圖的方式/// </summary>public ThumbnailMode Mode { get; set; }
}
ThumbnailOptions
類用于封裝生成縮略圖所需的參數,包括目標寬度Width
、目標高度Height
以及選擇的生成模式Mode
。通過將這些參數封裝在一個類中,使得在調用生成縮略圖的方法時,參數傳遞更加清晰和便捷。
3. 實現縮略圖生成類
[SupportedOSPlatform("windows")]
internal class Thumbnail
{/// <summary>/// 生成縮略圖/// </summary>/// <param name="options">參數</param>/// <return> image</return>public static SystemImage Generate(SystemImage original, ThumbnailOptions options){var towidth = options.Width;var toheight = options.Height;var x = 0;var y = 0;var ow = original.Width;var oh = original.Height;switch (options.Mode){case ThumbnailMode.Hw: //指定高寬縮放(可能變形) break;case ThumbnailMode.W: //指定寬,高按比例 toheight = original.Height * options.Width/ original.Width;break;case ThumbnailMode.H: //指定高,寬按比例towidth = original.Width * options.Height/ original.Height;break;default: //指定高寬裁減(不變形) if ((double)original.Width / original.Height > towidth / (double)toheight){oh = original.Height;ow = original.Height * towidth / toheight;y = 0;x = (original.Width - ow) / 2;}else{ow = original.Width;oh = original.Width * options.Height / towidth;x = 0;y = (original.Height - oh) / 2;}break;}//新建一個bmp圖片var bitmap = new Bitmap(towidth, toheight);//新建一個畫板var g = Graphics.FromImage(bitmap);//設置高質量插值法g.InterpolationMode = InterpolationMode.High;//設置高質量,低速度呈現平滑程度g.SmoothingMode = SmoothingMode.HighQuality;//清空畫布并以透明背景色填充g.Clear(Color.Transparent);//在指定位置并且按指定大小繪制原圖片的指定部分g.DrawImage(original, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel);return bitmap;}
}
Thumbnail
類包含一個靜態方法Generate
,用于根據傳入的原圖和生成參數,生成對應的縮略圖。方法的參數original
為原始圖片對象,options
為包含目標尺寸和生成模式的參數對象。
二、生成縮略圖的核心邏輯
在Generate
方法中,首先獲取目標寬度towidth
和目標高度toheight
,以及原圖的寬度ow
和高度oh
。然后根據選擇的ThumbnailMode
模式,執行不同的計算邏輯來確定最終的裁剪或縮放尺寸。
switch (options.Mode)
{case ThumbnailMode.Hw: //指定高寬縮放(可能變形) break;case ThumbnailMode.W: //指定寬,高按比例 toheight = original.Height * options.Width / original.Width;break;case ThumbnailMode.H: //指定高,寬按比例towidth = original.Width * options.Height / original.Height;break;default: //指定高寬裁減(不變形) if ((double)original.Width / original.Height > towidth / (double)toheight){oh = original.Height;ow = original.Height * towidth / toheight;y = 0;x = (original.Width - ow) / 2;}else{ow = original.Width;oh = original.Width * options.Height / towidth;x = 0;y = (original.Height - oh) / 2;}break;
}
Hw
模式:由于直接按照給定的寬高進行縮放,在這部分代碼中未做特殊處理,后續繪制時會直接使用傳入的目標寬高。W
模式:根據原圖的寬高比例,計算出與目標寬度對應的高度,確保圖片在縮放過程中保持比例。H
模式:與W
模式類似,根據原圖比例計算出與目標高度對應的寬度。Cut
模式:通過比較原圖和目標圖的寬高比例,確定需要裁剪的區域。如果原圖寬高比大于目標寬高比,說明原圖更 “寬”,則保持高度不變,計算出對應的寬度,并確定水平方向的裁剪偏移量x
;反之,如果原圖寬高比小于目標寬高比,說明原圖更 “高”,則保持寬度不變,計算出對應的高度,并確定垂直方向的裁剪偏移量y
。
確定好裁剪或縮放的尺寸后,接下來使用System.Drawing
命名空間下的類來創建新的圖片對象和繪圖上下文,并進行圖片繪制:
//新建一個bmp圖片
var bitmap = new Bitmap(towidth, toheight);
//新建一個畫板
var g = Graphics.FromImage(bitmap);
//設置高質量插值法
g.InterpolationMode = InterpolationMode.High;
//設置高質量,低速度呈現平滑程度
g.SmoothingMode = SmoothingMode.HighQuality;
//清空畫布并以透明背景色填充
g.Clear(Color.Transparent);
//在指定位置并且按指定大小繪制原圖片的指定部分
g.DrawImage(original, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel);
return bitmap;
創建一個指定尺寸的Bitmap
對象作為縮略圖,獲取其繪圖上下文Graphics
對象。通過設置InterpolationMode
和SmoothingMode
,可以提升圖片縮放時的質量,使生成的縮略圖更加平滑。清空畫布后,使用DrawImage
方法將原圖的指定部分繪制到新的縮略圖中,最后返回生成的縮略圖對象。
三、使用示例
以下是一個簡單的使用示例,展示如何調用上述代碼生成縮略圖:
using System;
using System.Drawing;
class Program
{static void Main(){// 加載原始圖片var originalImage = Image.FromFile("path/to/your/original/image.jpg");// 創建縮略圖生成參數對象var options = new ThumbnailOptions{Width = 200,Height = 200,Mode = ThumbnailMode.Cut};// 生成縮略圖var thumbnail = Thumbnail.Generate(originalImage, options);// 保存縮略圖thumbnail.Save("path/to/save/thumbnail.jpg");// 釋放資源originalImage.Dispose();thumbnail.Dispose();}
}
在上述示例中,首先通過Image.FromFile
方法加載原始圖片,然后創建ThumbnailOptions
對象并設置目標尺寸和生成模式,接著調用Thumbnail.Generate
方法生成縮略圖,最后將縮略圖保存到指定路徑,并釋放相關資源。
四、總結
通過上述代碼和講解,我們了解了如何在 C# 中基于System.Drawing
庫實現圖片縮略圖的生成,并支持多種不同的縮放和裁剪模式。在實際項目中,我們可以根據具體需求選擇合適的模式來生成高質量的縮略圖。需要注意的是,代碼中使用了[SupportedOSPlatform("windows")]
特性,表明該代碼僅適用于 Windows 操作系統,如果需要在其他平臺上運行,可能需要考慮使用其他圖像處理庫或進行相應的適配。希望本文對你在 C# 圖像處理方面有所幫助,如果你有任何疑問或改進建議,歡迎在評論區交流!
上述博客全面解析了縮略圖生成代碼。若你覺得某些部分需要補充,或有新的展示需求,歡迎隨時和我說。