c#生成图片缩略图的类(2种实现思路)

时间:2022-06-01 20:11:10

第一种 

复制代码代码如下:


/**//// <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(); 


关键方法Graphics.DrawImage见ms-help://MS.NETFrameworkSDKv1.1.CHS/cpref/html/frlrfsystemdrawinggraphicsclassdrawimagetopic11.htm 
第二种
4个重载方法,有直接返回Image对象的,有生成缩略图,并且保存到指定目录的! 

复制代码代码如下:


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:Images ilename.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:Images ilename.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;