Biegral 2019/1/4 10:25:21 1280
/// <summary> /// 图片处理类 /// </summary> public class PhotoUtility { /// <summary> /// 水印位置 /// </summary> public enum Position { TopLeft , TopRight , TopCenter , Middle , BottomLeft , BottomCenter , BottomRight }; /// <summary> /// 压缩图片 /// </summary> /// <param name="sourceImage">原图</param> /// <param name="filename">原图压缩图片的保存文件名 </param> /// <param name="r">压缩图片大小,如果为0则不压缩</param> /// <param name="WaterString">水印文字信息</param> /// <param name="F">水印文字字体,如果为null则系统设置默认值</param> /// <param name="brush">笔刷 如果为null则系统设置为默认值</param> /// <param name="p">水印位置</param> public static void Compress(Image sourceImage, string filename, int r, string WaterString, Font F, Brush brush, Position p) { int targetWidth = r; int targetHeight = r; //当大于0的时候才压缩 if (r > 0) { if (sourceImage.Height <= r && sourceImage.Width <= r) { targetHeight = sourceImage.Height; targetWidth = sourceImage.Width; } else if (sourceImage.Height > sourceImage.Width) { targetWidth = sourceImage.Width * r / sourceImage.Height; } else { targetHeight = sourceImage.Height * r / sourceImage.Width; } } else { targetHeight = sourceImage.Height; targetWidth = sourceImage.Width; } //缩放图片 Image targetImage = Image.FromHbitmap(new Bitmap(targetWidth, targetHeight, PixelFormat.Format32bppRgb).GetHbitmap()); Graphics g = Graphics.FromImage(targetImage); //设置缩略图的平滑度及质量 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.DrawImage(sourceImage, 0, 0, targetWidth, targetHeight); //水印文字 if (WaterString!=null && WaterString != string.Empty){ F = (F == null ? new Font("Arial Black", 28, FontStyle.Bold) : F); brush = (brush == null ? Brushes.Silver : brush); float WaterStringLength = (float)WaterString.Length * F.Size; switch (p){ case Position.Middle: g.DrawString(WaterString, F, brush, (targetWidth - WaterStringLength) / 2, targetHeight / 2 - 50); break; case Position.TopCenter: g.DrawString(WaterString, F, brush, (targetWidth - WaterStringLength) / 2, F.Size); break; case Position.BottomCenter: g.DrawString(WaterString, F, brush, (targetWidth - WaterStringLength) / 2, targetHeight - F.Size * 2); break; case Position.TopLeft: g.DrawString(WaterString, F, brush, 2, F.Size); break; case Position.BottomLeft: g.DrawString(WaterString, F, brush, 2, targetHeight - F.Size * 2); break; default: g.DrawString(WaterString, F, brush, (targetWidth - WaterStringLength) / 2, targetHeight / 2 - 50); break; } } g.Dispose(); //设置输出格式 EncoderParameters encParams = new EncoderParameters(1); encParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 65L); ImageCodecInfo codeInfo = null; ImageCodecInfo[] codeInfos = ImageCodecInfo.GetImageEncoders(); foreach (ImageCodecInfo info in codeInfos) { if (info.MimeType.Equals("image/jpeg")) { codeInfo = info; break; } } if (codeInfo != null) { targetImage.Save(filename, codeInfo, encParams); } targetImage.Dispose(); sourceImage.Dispose(); } /// <summary> /// 压缩图片,默认水印为居中 /// </summary> /// <param name="sourceImage">原图</param> /// <param name="filename">压缩图片保存路径</param> /// <param name="r">压缩大小</param> /// <param name="WaterString">水印文字</param> /// <param name="F">水印文字字体,如果为null则系统设置默认值</param> /// <param name="brush">笔刷 如果为null则系统设置为默认值</param> public static void Compress(Image sourceImage, string filename, int r, string WaterString, Font F, Brush brush) { Compress(sourceImage, filename, r, WaterString, F, brush, Position.Middle); } /// <summary> /// 不压缩图片,不设置水印 /// </summary> /// <param name="sourceImage">原图</param> /// <param name="filename">图片保存路径</param> public static void Compress(Image sourceImage, string filename) { Compress(sourceImage, filename, 0, null, null, null, Position.Middle); } /// <summary> /// 压缩图片,不设置水印 /// </summary> /// <param name="sourceImage">原图</param> /// <param name="filename">压缩图片保存路径</param> /// <param name="r">压缩大小</param> public static void Compress(Image sourceImage, string filename, int r){ Compress(sourceImage, filename, r, null, null, null, Position.Middle); } /// <summary> /// 生成缩略图 /// </summary> /// <param name="sourceImage">原图</param> /// <param name="thumbWidth">缩略图宽度</param> /// <param name="thumbHeight">缩略图高度 </param> /// <param name="filename">缩略图的保存文件名 </param> public static void CreateThumb(Image sourceImage, int thumbWidth, int thumbHeight, string filename) { int tw = thumbWidth; int th = thumbHeight; if (sourceImage.Height < th && sourceImage.Width < tw) { th = sourceImage.Height; tw = sourceImage.Width; } else if (sourceImage.Height / th > sourceImage.Width / tw) { tw = sourceImage.Width * th / sourceImage.Height; } else { th = sourceImage.Height * tw / sourceImage.Width; } //将图片缩放到一个空白背景的图片上,生成大小一致的缩略图 Image thumbImage = Image.FromHbitmap(new Bitmap(thumbWidth, thumbHeight, PixelFormat.Format32bppRgb).GetHbitmap()); Graphics g = Graphics.FromImage(thumbImage); //g.Clear(Color.Transparent); //设置缩略图的平滑度及质量 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; //绘制背景 SolidBrush brush = new SolidBrush(Color.White); g.FillRectangle(brush, 0, 0, thumbWidth, thumbHeight); //绘图 g.DrawImage(sourceImage, (thumbWidth - tw) / 2, (thumbHeight - th) / 2, tw, th); g.Dispose(); //保存缩略图 thumbImage.Save(filename, ImageFormat.Png); thumbImage.Dispose(); sourceImage.Dispose(); } /// <summary> /// 切割一个图片 /// </summary> /// <param name="sourceImage">原图</param> /// <param name="X">要切割的X轴位置</param> /// <param name="Y">要切割的Y轴位置</param> /// <param name="r">切割的矩形大小</param> public static void Clip(Image sourceImage, int X, int Y,int Width,int Height,string filename) { Bitmap b = new Bitmap(sourceImage); Bitmap b1 = b.Clone(new Rectangle(X, Y, Width, Height), PixelFormat.Format24bppRgb); b1.Save(filename); b.Dispose(); b1.Dispose(); } } ------------------ /// <summary> /// 缩略图处理类 /// </summary> public class ThumbImage { public enum CutWay { /// <summary> /// 指定高宽缩放(可能变形) /// </summary> HW, /// <summary> /// 指定宽,高按比例 /// </summary> W, /// <summary> /// 指定高,宽按比例 /// </summary> H, /// <summary> /// 指定高宽裁减(不变形) /// </summary> Cut, /// <summary> /// 等比缩放(不变形,如果高大按高,宽大按宽缩放) /// </summary> DB } /**/ /// <summary> /// 生成缩略图 /// </summary> /// <param name="originalImagePath">源图路径(物理路径)</param> /// <param name="thumbnailPath">缩略图路径(物理路径)</param> /// <param name="width">缩略图宽度</param> /// <param name="height">缩略图高度</param> /// <param name="cutWay">生成缩略图的方式</param> public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, CutWay cutWay) { System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath); int towidth = width; int toheight = height; int x = 0; int y = 0; int ow = originalImage.Width; int oh = originalImage.Height; switch (cutWay) { case CutWay.HW://指定高宽缩放(可能变形) break; case CutWay.W://指定宽,高按比例 if ((double)originalImage.Width < (double)towidth && (double)originalImage.Height < (double)toheight) { towidth = originalImage.Width; toheight = originalImage.Height; } else { toheight = originalImage.Height * width / originalImage.Width; } break; case CutWay.H://指定高,宽按比例 if ((double)originalImage.Width < (double)towidth && (double)originalImage.Height < (double)toheight) { towidth = originalImage.Width; toheight = originalImage.Height; } else { towidth = originalImage.Width * height / originalImage.Height; } break; case CutWay.Cut://指定高宽裁减(不变形) if ((double)originalImage.Width < (double)towidth && (double)originalImage.Height < (double)toheight) { towidth = originalImage.Width; toheight = originalImage.Height; } else 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; case CutWay.DB://等比缩放(不变形,如果高大按高,宽大按宽缩放) if ((double)originalImage.Width<(double)towidth&&(double)originalImage.Height<(double)toheight) { towidth = originalImage.Width; toheight = originalImage.Height; } else if ((double)originalImage.Width / (double)towidth < (double)originalImage.Height / (double)toheight) { toheight = height; towidth = originalImage.Width * height / originalImage.Height; } else { towidth = width; toheight = originalImage.Height * width / originalImage.Width; } break; default: break; } //新建一个bmp图片 System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight); //新建一个画板 System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap); //设置高质量插值法 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量,低速度呈现平滑程度 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //清空画布并以透明背景色填充 g.Clear(System.Drawing.Color.Transparent); //在指定位置并且按指定大小绘制原图片的指定部分 g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel); try { bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg); } catch (System.Exception e) { throw e; } finally { originalImage.Dispose(); bitmap.Dispose(); g.Dispose(); } } /**/ /// <summary> /// 在图片上增加文字水印 /// </summary> /// <param name="Path">原服务器图片路径</param> /// <param name="Path_sy">生成的带文字水印的图片路径</param> public static void AddShuiYinWord(string Path, string Path_sy) { string addText = "测试水印"; System.Drawing.Image image = System.Drawing.Image.FromFile(Path); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image); g.DrawImage(image, 0, 0, image.Width, image.Height); System.Drawing.Font f = new System.Drawing.Font("Verdana", 16); System.Drawing.Brush b = new System.Drawing.SolidBrush(System.Drawing.Color.Blue); g.DrawString(addText, f, b, 15, 15); g.Dispose(); image.Save(Path_sy); image.Dispose(); } /**/ /// <summary> /// 在图片上生成图片水印 /// </summary> /// <param name="Path">原服务器图片路径</param> /// <param name="Path_syp">生成的带图片水印的图片路径</param> /// <param name="Path_sypf">水印图片路径</param> public static void AddShuiYinPic(string Path, string Path_syp, string Path_sypf) { System.Drawing.Image image = System.Drawing.Image.FromFile(Path); System.Drawing.Image copyImage = System.Drawing.Image.FromFile(Path_sypf); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image); g.DrawImage(copyImage, new System.Drawing.Rectangle(image.Width - copyImage.Width, image.Height - copyImage.Height, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, System.Drawing.GraphicsUnit.Pixel); g.Dispose(); image.Save(Path_syp); image.Dispose(); } /// <summary> /// 获得图片信息 /// </summary> /// <param name="Path">物理路径</param> /// <returns></returns> public static ImageInformation GetImageInforation(string Path) { using (Image img = Image.FromFile(Path)) { return new ImageInformation() { Width=img.Width, Height=img.Height }; } } } /// <summary> /// 获得图片信息 /// </summary> public struct ImageInformation { /// <summary> /// 图片宽 /// </summary> public int Width { get; set; } /// <summary> /// 图片高 /// </summary> public int Height { get; set; } }