1、需要添加应用System.Drawing.dll
2.命名空间
using System.IO; using System.Drawing; using System.Drawing.Imaging;
3、方法一
**//// <summary> /// 生成缩略图 /// </summary> /// <param name="originalImagePath">源图路径(物理路径)</param> /// <param name="thumbnailPath">缩略图路径(物理路径)</param> /// <param name="width">缩略图宽度</param> /// <param name="height">缩略图高度</param> /// <param name="mode">生成缩略图的方式</param> public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode) { Image originalImage = Image.FromFile(originalImagePath); int towidth = width; int toheight = height; int x = 0; int y = 0; int ow = originalImage.Width; int oh = originalImage.Height; switch (mode) { case "HW"://指定高宽缩放(可能变形) break; case "W"://指定宽,高按比例 toheight = originalImage.Height * width/originalImage.Width; break; case "H"://指定高,宽按比例 towidth = originalImage.Width * height/originalImage.Height; break; case "Cut"://指定高宽裁减(不变形) if((double)originalImage.Width/(double)originalImage.Height > (double)towidth/(double)toheight) { oh = originalImage.Height; ow = originalImage.Height*towidth/toheight; y = 0; x = (originalImage.Width - ow)/2; } else { ow = originalImage.Width; oh = originalImage.Width*height/towidth; x = 0; y = (originalImage.Height - oh)/2; } break; default : break; } //新建一个bmp图片 Image bitmap = new System.Drawing.Bitmap(towidth,toheight); //新建一个画板 Graphics g = System.Drawing.Graphics.FromImage(bitmap); //设置高质量插值法 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量,低速度呈现平滑程度 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //清空画布并以透明背景色填充 g.Clear(Color.Transparent); //在指定位置并且按指定大小绘制原图片的指定部分 g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow,oh), GraphicsUnit.Pixel); try { //以jpg格式保存缩略图 bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg); } catch(System.Exception e) { throw e; } finally { originalImage.Dispose(); bitmap.Dispose(); g.Dispose(); } }
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:Imagesfilename.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:Imagesfilename.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; } } }
5、亲测可用
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 using System.Drawing; 7 using System.Drawing.Imaging; 8 9 namespace ConsoleApplication2 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 string originalImagePath ="D:/pic/2012cnu-gisBarbecue/IMG_7226.JPG"; 16 string thumbnailPath ="D:/pic/2012cnu-gisBarbecue/14.jpg"; 17 MakeThumbnail(originalImagePath, thumbnailPath, 200, 200, "W"); 18 thumbnailPath = "D:/pic/2012cnu-gisBarbecue/15.jpg"; 19 ImageClass imageC = new ImageClass(originalImagePath); 20 imageC.GetReducedImage(0.5, thumbnailPath); 21 } 22 /**/ 23 /// <summary> 24 /// 生成缩略图 25 /// </summary> 26 /// <param name="originalImagePath">源图路径(物理路径)</param> 27 /// <param name="thumbnailPath">缩略图路径(物理路径)</param> 28 /// <param name="width">缩略图宽度</param> 29 /// <param name="height">缩略图高度</param> 30 /// <param name="mode">生成缩略图的方式</param> 31 public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode) 32 { 33 Image originalImage = Image.FromFile(originalImagePath); 34 35 int towidth = width; 36 int toheight = height; 37 38 int x = 0; 39 int y = 0; 40 int ow = originalImage.Width; 41 int oh = originalImage.Height; 42 43 switch (mode) 44 { 45 case "HW"://指定高宽缩放(可能变形) 46 break; 47 case "W"://指定宽,高按比例 48 toheight = originalImage.Height * width / originalImage.Width; 49 break; 50 case "H"://指定高,宽按比例 51 towidth = originalImage.Width * height / originalImage.Height; 52 break; 53 case "Cut"://指定高宽裁减(不变形) 54 if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight) 55 { 56 oh = originalImage.Height; 57 ow = originalImage.Height * towidth / toheight; 58 y = 0; 59 x = (originalImage.Width - ow) / 2; 60 } 61 else 62 { 63 ow = originalImage.Width; 64 oh = originalImage.Width * height / towidth; 65 x = 0; 66 y = (originalImage.Height - oh) / 2; 67 } 68 break; 69 default: 70 break; 71 } 72 73 //新建一个bmp图片 74 Image bitmap = new System.Drawing.Bitmap(towidth, toheight); 75 76 //新建一个画板 77 Graphics g = System.Drawing.Graphics.FromImage(bitmap); 78 79 //设置高质量插值法 80 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; 81 82 //设置高质量,低速度呈现平滑程度 83 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 84 85 //清空画布并以透明背景色填充 86 g.Clear(Color.Transparent); 87 88 //在指定位置并且按指定大小绘制原图片的指定部分 89 g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), 90 new Rectangle(x, y, ow, oh), 91 GraphicsUnit.Pixel); 92 93 try 94 { 95 //以jpg格式保存缩略图 96 bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg); 97 } 98 catch (System.Exception e) 99 { 100 throw e; 101 } 102 finally 103 { 104 originalImage.Dispose(); 105 bitmap.Dispose(); 106 g.Dispose(); 107 } 108 } 109 } 110 public class ImageClass 111 { 112 public Image ResourceImage; 113 private int ImageWidth; 114 private int ImageHeight; 115 116 public string ErrMessage; 117 118 /// <summary> 119 /// 类的构造函数 120 /// </summary> 121 /// <param name="ImageFileName">图片文件的全路径名称</param> 122 public ImageClass(string ImageFileName) 123 { 124 ResourceImage = Image.FromFile(ImageFileName); 125 ErrMessage = ""; 126 } 127 128 public bool ThumbnailCallback() 129 { 130 return false; 131 } 132 133 /// <summary> 134 /// 生成缩略图重载方法1,返回缩略图的Image对象 135 /// </summary> 136 /// <param name="Width">缩略图的宽度</param> 137 /// <param name="Height">缩略图的高度</param> 138 /// <returns>缩略图的Image对象</returns> 139 public Image GetReducedImage(int Width, int Height) 140 { 141 try 142 { 143 Image ReducedImage; 144 145 Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); 146 147 ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero); 148 149 return ReducedImage; 150 } 151 catch (Exception e) 152 { 153 ErrMessage = e.Message; 154 return null; 155 } 156 } 157 158 /// <summary> 159 /// 生成缩略图重载方法2,将缩略图文件保存到指定的路径 160 /// </summary> 161 /// <param name="Width">缩略图的宽度</param> 162 /// <param name="Height">缩略图的高度</param> 163 /// <param name="targetFilePath">缩略图保存的全文件名,(带路径),参数格式:D:Imagesfilename.jpg</param> 164 /// <returns>成功返回true,否则返回false</returns> 165 public bool GetReducedImage(int Width, int Height, string targetFilePath) 166 { 167 try 168 { 169 Image ReducedImage; 170 171 Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); 172 173 ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero); 174 ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg); 175 176 ReducedImage.Dispose(); 177 178 return true; 179 } 180 catch (Exception e) 181 { 182 ErrMessage = e.Message; 183 return false; 184 } 185 } 186 187 /// <summary> 188 /// 生成缩略图重载方法3,返回缩略图的Image对象 189 /// </summary> 190 /// <param name="Percent">缩略图的宽度百分比 如:需要百分之80,就填0.8</param> 191 /// <returns>缩略图的Image对象</returns> 192 public Image GetReducedImage(double Percent) 193 { 194 try 195 { 196 Image ReducedImage; 197 198 Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); 199 200 ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent); 201 ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent); 202 203 ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero); 204 205 return ReducedImage; 206 } 207 catch (Exception e) 208 { 209 ErrMessage = e.Message; 210 return null; 211 } 212 } 213 214 /// <summary> 215 /// 生成缩略图重载方法4,返回缩略图的Image对象 216 /// </summary> 217 /// <param name="Percent">缩略图的宽度百分比 如:需要百分之80,就填0.8</param> 218 /// <param name="targetFilePath">缩略图保存的全文件名,(带路径),参数格式:D:Imagesfilename.jpg</param> 219 /// <returns>成功返回true,否则返回false</returns> 220 public bool GetReducedImage(double Percent, string targetFilePath) 221 { 222 try 223 { 224 Image ReducedImage; 225 226 Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); 227 228 ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent); 229 ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent); 230 231 ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero); 232 233 ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg); 234 235 ReducedImage.Dispose(); 236 237 return true; 238 } 239 catch (Exception e) 240 { 241 ErrMessage = e.Message; 242 return false; 243 } 244 } 245 246 247 } 248 249 }