C#生成圖片縮略圖(2種思路),
前言:在日常圖片浏覽中,如果圖片過多,只有一張張的打開圖片才能知道圖片的內容,顯然這樣浏覽起來非常不便。Windows系統在浏覽圖片時提供了縮略圖的功能,這樣大大的方便了浏覽者了解每張圖片的內容,本實例采用兩種方式實現了與Windows系統縮略圖相同的功能。
第一種:生成MakeThumbnail方法

![]()
1 //// <summary>
2 /// 生成縮略圖
3 /// </summary>
4 /// <param name="originalImagePath">源圖路徑(物理路徑)</param>
5 /// <param name="thumbnailPath">縮略圖路徑(物理路徑)</param>
6 /// <param name="width">縮略圖寬度</param>
7 /// <param name="height">縮略圖高度</param>
8 /// <param name="mode">生成縮略圖的方式</param>
9 public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
10 {
11 Image originalImage = Image.FromFile(originalImagePath);
12
13 int towidth = width;
14 int toheight = height;
15
16 int x = 0;
17 int y = 0;
18 int ow = originalImage.Width;
19 int oh = originalImage.Height;
20
21 switch (mode)
22 {
23 case "HW"://指定高寬縮放(可能變形)
24 break;
25 case "W"://指定寬,高按比例
26 toheight = originalImage.Height * width/originalImage.Width;
27 break;
28 case "H"://指定高,寬按比例
29 towidth = originalImage.Width * height/originalImage.Height;
30 break;
31 case "Cut"://指定高寬裁減(不變形)
32 if((double)originalImage.Width/(double)originalImage.Height > (double)towidth/(double)toheight)
33 {
34 oh = originalImage.Height;
35 ow = originalImage.Height*towidth/toheight;
36 y = 0;
37 x = (originalImage.Width - ow)/2;
38 }
39 else
40 {
41 ow = originalImage.Width;
42 oh = originalImage.Width*height/towidth;
43 x = 0;
44 y = (originalImage.Height - oh)/2;
45 }
46 break;
47 default :
48 break;
49 }
50
51 //新建一個bmp圖片
52 Image bitmap = new System.Drawing.Bitmap(towidth,toheight);
53
54 //新建一個畫板
55 Graphics g = System.Drawing.Graphics.FromImage(bitmap);
56
57 //設置高質量插值法
58 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
59
60 //設置高質量,低速度呈現平滑程度
61 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
62
63 //清空畫布並以透明背景色填充
64 g.Clear(Color.Transparent);
65
66 //在指定位置並且按指定大小繪制原圖片的指定部分
67 g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow,oh),GraphicsUnit.Pixel);
68 try
69 {
70 //以jpg格式保存縮略圖
71 bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
72 }
73 catch(System.Exception e)
74 {
75 throw e;
76 }
77 finally
78 {
79 originalImage.Dispose();
80 bitmap.Dispose();
81 g.Dispose();
82 }
83 }
84
85 ThumbnailClass
MakeThumbnail
第二種:寫成ThumbnailClass類,書寫4個重載方法,有直接返回Image對象的,有生成縮略圖,並且保存到指定目錄等等

![]()
1 using System.IO;
2 using System.Drawing;
3 using System.Drawing.Imaging;
4
5 /// <summary>
6 /// 圖片處理類
7 /// 1、生成縮略圖片或按照比例改變圖片的大小和畫質
8 /// 2、將生成的縮略圖放到指定的目錄下
9 /// </summary>
10 public class ImageClass
11 {
12 public Image ResourceImage;
13 private int ImageWidth;
14 private int ImageHeight;
15
16 public string ErrMessage;
17
18 /// <summary>
19 /// 類的構造函數
20 /// </summary>
21 /// <param name="ImageFileName">圖片文件的全路徑名稱</param>
22 public ImageClass(string ImageFileName)
23 {
24 ResourceImage=Image.FromFile(ImageFileName);
25 ErrMessage="";
26 }
27
28 public bool ThumbnailCallback()
29 {
30 return false;
31 }
32
33 /// <summary>
34 /// 生成縮略圖重載方法1,返回縮略圖的Image對象
35 /// </summary>
36 /// <param name="Width">縮略圖的寬度</param>
37 /// <param name="Height">縮略圖的高度</param>
38 /// <returns>縮略圖的Image對象</returns>
39 public Image GetReducedImage(int Width,int Height)
40 {
41 try
42 {
43 Image ReducedImage;
44
45 Image.GetThumbnailImageAbort callb=new Image.GetThumbnailImageAbort(ThumbnailCallback);
46
47 ReducedImage=ResourceImage.GetThumbnailImage(Width,Height,callb,IntPtr.Zero);
48
49 return ReducedImage;
50 }
51 catch(Exception e)
52 {
53 ErrMessage=e.Message;
54 return null;
55 }
56 }
57
58 /// <summary>
59 /// 生成縮略圖重載方法2,將縮略圖文件保存到指定的路徑
60 /// </summary>
61 /// <param name="Width">縮略圖的寬度</param>
62 /// <param name="Height">縮略圖的高度</param>
63 /// <param name="targetFilePath">縮略圖保存的全文件名,(帶路徑),參數格式:D:\Images\filename.jpg</param>
64 /// <returns>成功返回true,否則返回false</returns>
65 public bool GetReducedImage(int Width,int Height,string targetFilePath)
66 {
67 try
68 {
69 Image ReducedImage;
70
71 Image.GetThumbnailImageAbort callb=new Image.GetThumbnailImageAbort(ThumbnailCallback);
72
73 ReducedImage=ResourceImage.GetThumbnailImage(Width,Height,callb,IntPtr.Zero);
74 ReducedImage.Save(@targetFilePath,ImageFormat.Jpeg);
75
76 ReducedImage.Dispose();
77
78 return true;
79 }
80 catch(Exception e)
81 {
82 ErrMessage=e.Message;
83 return false;
84 }
85 }
86
87 /// <summary>
88 /// 生成縮略圖重載方法3,返回縮略圖的Image對象
89 /// </summary>
90 /// <param name="Percent">縮略圖的寬度百分比 如:需要百分之80,就填0.8</param>
91 /// <returns>縮略圖的Image對象</returns>
92 public Image GetReducedImage(double Percent)
93 {
94 try
95 {
96 Image ReducedImage;
97
98 Image.GetThumbnailImageAbort callb=new Image.GetThumbnailImageAbort(ThumbnailCallback);
99
100 ImageWidth=Convert.ToInt32(ResourceImage.Width*Percent);
101 ImageHeight=Convert.ToInt32(ResourceImage.Width*Percent);
102
103 ReducedImage=ResourceImage.GetThumbnailImage(ImageWidth,ImageHeight,callb,IntPtr.Zero);
104
105 return ReducedImage;
106 }
107 catch(Exception e)
108 {
109 ErrMessage=e.Message;
110 return null;
111 }
112 }
113
114 /// <summary>
115 /// 生成縮略圖重載方法4,返回縮略圖的Image對象
116 /// </summary>
117 /// <param name="Percent">縮略圖的寬度百分比 如:需要百分之80,就填0.8</param>
118 /// <param name="targetFilePath">縮略圖保存的全文件名,(帶路徑),參數格式:D:\Images\filename.jpg</param>
119 /// <returns>成功返回true,否則返回false</returns>
120 public bool GetReducedImage(double Percent,string targetFilePath)
121 {
122 try
123 {
124 Image ReducedImage;
125
126 Image.GetThumbnailImageAbort callb=new Image.GetThumbnailImageAbort(ThumbnailCallback);
127
128 ImageWidth=Convert.ToInt32(ResourceImage.Width*Percent);
129 ImageHeight=Convert.ToInt32(ResourceImage.Width*Percent);
130
131 ReducedImage=ResourceImage.GetThumbnailImage(ImageWidth,ImageHeight,callb,IntPtr.Zero);
132
133 ReducedImage.Save(@targetFilePath,ImageFormat.Jpeg);
134
135 ReducedImage.Dispose();
136
137 return true;
138 }
139 catch(Exception e)
140 {
141 ErrMessage=e.Message;
142 return false;
143 }
144 }
145 }
ThumbnailClass