图片截剪
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}
轉載于:https://www.cnblogs.com/bober/archive/2013/03/14/2958768.html
總結
- 上一篇: 提高编写CSS代码效率的10个习惯
- 下一篇: Oracle正则表达式的用法