public class ImageUtil{#region " 正方型裁剪 "/// <summary> /// 正方型裁剪 /// 以图片中心为轴心,截取正方型,然后等比缩放 /// 用于头像处理 /// </summary> /// <param name="postedFile">原图HttpPostedFile对象</param> /// <param name="fileSaveUrl">缩略图存放地址</param> /// <param name="side">指定的边长(正方型)</param> /// <param name="quality">质量(范围0-100)</param> public static void CutForSquare(string fromFilePath, string fileSaveUrl, int side, int quality){//创建目录 string dir = Path.GetDirectoryName(fileSaveUrl);if (!Directory.Exists(dir))Directory.CreateDirectory(dir);//原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息) System.Drawing.Image initImage = System.Drawing.Image.FromFile(fromFilePath, true);//原图宽高均小于模版,不作处理,直接保存 if (initImage.Width <= side && initImage.Height <= side){initImage.Save(fileSaveUrl);}else{ //原始图片的宽、高 int initWidth = initImage.Width;int initHeight = initImage.Height;//非正方型先裁剪为正方型 if (initWidth != initHeight){ //截图对象 System.Drawing.Image pickedImage = null;System.Drawing.Graphics pickedG = null;//宽大于高的横图 if (initWidth > initHeight){ //对象实例化 pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);pickedG = System.Drawing.Graphics.FromImage(pickedImage);//设置质量 pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//定位 Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);//画图 pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);//重置宽 initWidth = initHeight;}//高大于宽的竖图 else{//对象实例化 pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);pickedG = System.Drawing.Graphics.FromImage(pickedImage);//设置质量 pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//定位 Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);//画图 pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);//重置高 initHeight = initWidth;} //将截图对象赋给原图 initImage = (System.Drawing.Image)pickedImage.Clone();//释放截图资源 pickedG.Dispose();pickedImage.Dispose();}//缩略图对象 System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);//设置质量 resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//用指定背景色清空画布 resultG.Clear(Color.White);//绘制缩略图 resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);//关键质量控制 //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();ImageCodecInfo ici = null;foreach (ImageCodecInfo i in icis){if (i.FilenameExtension.Contains(fileSaveUrl.Substring(fileSaveUrl.LastIndexOf('.'), fileSaveUrl.Length - fileSaveUrl.LastIndexOf('.')).ToUpper())){ici = i;}}EncoderParameters ep = new EncoderParameters(1);ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);//保存缩略图 resultImage.Save(fileSaveUrl, ici, ep);//释放关键质量控制所用资源 ep.Dispose();//释放缩略图资源 resultG.Dispose();resultImage.Dispose();//释放原始图片资源 initImage.Dispose();}}#endregion#region " 固定模版裁剪并缩放 "/// <summary> /// 指定长宽裁剪 /// 按模版比例最大范围的裁剪图片并缩放至模版尺寸 /// </summary> /// <param name="postedFile">原图HttpPostedFile对象</param> /// <param name="fileSaveUrl">保存路径</param> /// <param name="maxWidth">最大宽(单位:px)</param> /// <param name="maxHeight">最大高(单位:px)</param> /// <param name="quality">质量(范围0-100)</param> public static void CutForCustom(string fromFilePath, string fileSaveUrl, int maxWidth, int maxHeight, int quality){string dir = Path.GetDirectoryName(fileSaveUrl);if (!Directory.Exists(dir))Directory.CreateDirectory(dir);//从文件获取原始图片,并使用流中嵌入的颜色管理信息 System.Drawing.Image initImage = System.Drawing.Image.FromFile(fromFilePath, true);//原图宽高均小于模版,不作处理,直接保存 if (initImage.Width <= maxWidth && initImage.Height <= maxHeight){initImage.Save(fileSaveUrl);}else{//模版的宽高比例 double templateRate = (double)maxWidth / maxHeight;//原图片的宽高比例 double initRate = (double)initImage.Width / initImage.Height;//原图与模版比例相等,直接缩放 if (templateRate == initRate){//按模版大小生成最终图片 System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;templateG.Clear(Color.White);templateG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);}//原图与模版比例不等,裁剪后缩放 else{//裁剪对象 System.Drawing.Image pickedImage = null;System.Drawing.Graphics pickedG = null;//定位 Rectangle fromR = new Rectangle(0, 0, 0, 0);//原图裁剪定位 Rectangle toR = new Rectangle(0, 0, 0, 0);//目标定位 //宽为标准进行裁剪 if (templateRate > initRate){//裁剪对象实例化 pickedImage = new System.Drawing.Bitmap(initImage.Width, (int)Math.Floor(initImage.Width / templateRate));pickedG = System.Drawing.Graphics.FromImage(pickedImage);//裁剪源定位 fromR.X = 0;fromR.Y = (int)Math.Floor((initImage.Height - initImage.Width / templateRate) / 2);fromR.Width = initImage.Width;fromR.Height = (int)Math.Floor(initImage.Width / templateRate);//裁剪目标定位 toR.X = 0;toR.Y = 0;toR.Width = initImage.Width;toR.Height = (int)Math.Floor(initImage.Width / templateRate);}//高为标准进行裁剪 else{pickedImage = new System.Drawing.Bitmap((int)Math.Floor(initImage.Height * templateRate), initImage.Height);pickedG = System.Drawing.Graphics.FromImage(pickedImage);fromR.X = (int)Math.Floor((initImage.Width - initImage.Height * templateRate) / 2);fromR.Y = 0;fromR.Width = (int)Math.Floor(initImage.Height * templateRate);fromR.Height = initImage.Height;toR.X = 0;toR.Y = 0;toR.Width = (int)Math.Floor(initImage.Height * templateRate);toR.Height = initImage.Height;}//设置质量 pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//裁剪 pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);//按模版大小生成最终图片 System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;templateG.Clear(Color.White);templateG.DrawImage(pickedImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, pickedImage.Width, pickedImage.Height), System.Drawing.GraphicsUnit.Pixel);//关键质量控制 //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();ImageCodecInfo ici = null;foreach (ImageCodecInfo i in icis){if (i.FilenameExtension.Contains(fileSaveUrl.Substring(fileSaveUrl.LastIndexOf('.'), fileSaveUrl.Length - fileSaveUrl.LastIndexOf('.')).ToUpper())){ici = i;}}EncoderParameters ep = new EncoderParameters(1);ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);//保存缩略图 templateImage.Save(fileSaveUrl, ici, ep);//templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg); //释放资源 templateG.Dispose();templateImage.Dispose();pickedG.Dispose();pickedImage.Dispose();}}//释放资源 initImage.Dispose();}#endregion}