生成高清缩略图; 添加图片、文字水印; 图片、文字水印透明
2011-01-06 15:07
766 查看
之前写了一个公共的ImgHelper类,主要提供高清晰缩略图生成,由于在之前的实际操作过程中存在一些问题,最近有了点时间,于是重新拾起来再改进一下,顺便研究一下GDI+。
问题一:产品搜索列表展示,每个产品显示的图片大小为100x100,缩略图生成是按比例缩小的,可能为100x100、100x90、90x100、90x90,为了显示美观,我们需要让该图片在100x100的区域垂直、左右居中显示,那么就需要使用样式来控制,这时WEB前端开发人员建议,是否可以给图片加一个透明的背景,即将按比例生成的缩略图放置在一个大小为100x100、背景透明的图片上。
问题二:需要在缩略图上打上水印,包括文字水印、图片水印。
问题三:需要实现文字、图片水印透明。
针对上述三个问题,解决方案如下,看代码:
MakeThumbnailBase
接下来还会针对在线图片切割做一个实例给大家。
问题一:产品搜索列表展示,每个产品显示的图片大小为100x100,缩略图生成是按比例缩小的,可能为100x100、100x90、90x100、90x90,为了显示美观,我们需要让该图片在100x100的区域垂直、左右居中显示,那么就需要使用样式来控制,这时WEB前端开发人员建议,是否可以给图片加一个透明的背景,即将按比例生成的缩略图放置在一个大小为100x100、背景透明的图片上。
问题二:需要在缩略图上打上水印,包括文字水印、图片水印。
问题三:需要实现文字、图片水印透明。
针对上述三个问题,解决方案如下,看代码:
MakeThumbnailBase
/// <summary> /// 生成高清晰缩略图基方法,图片按比例大小缩放,可以生成固定大小的图片,不足处以透明背景填充 /// </summary> /// <param name="image"></param> /// <param name="newFile"></param> /// <param name="maxWidth"></param> /// <param name="maxHeight"></param> /// <param name="Quality"></param> /// <param name="FixedSize">当此值为true时,生成固定大小图片时,不足处以透明背景填充</param> /// <param name="waterMark"></param> private static void MakeThumbnailBase(System.Drawing.Image image, string newFile, int maxWidth, int maxHeight, int Quality, bool FixedSize, WaterMark waterMark) { int OldWidth = image.Width;//图片实际宽度 int OldHeight = image.Height;//图片实际高度 int NewWidth = maxWidth; int NewHeight = maxHeight; int x = 0; int y = 0; string mode = string.Empty; if (OldWidth <= NewWidth && OldHeight <= NewHeight) { if (FixedSize) { x = (maxWidth - OldWidth) / 2; y = (maxHeight - OldHeight) / 2; } NewWidth = OldWidth; NewHeight = OldHeight; } else if (OldWidth > NewWidth && OldHeight < NewHeight) mode = "W"; else if (OldWidth < NewWidth && OldHeight > NewHeight) mode = "H"; else if (OldWidth >= NewWidth && OldHeight >= NewHeight) if (OldWidth * NewHeight > NewWidth * OldHeight) mode = "W"; else mode = "H"; switch (mode) { case "W"://指定宽,高按比例 NewHeight = OldHeight * NewWidth / OldWidth; if (FixedSize) y = (maxHeight - NewHeight) / 2; break; case "H"://指定高,宽按比例 NewWidth = OldWidth * NewHeight / OldHeight; if (FixedSize) x = (maxWidth - NewWidth) / 2; break; } Bitmap outBmp; if (FixedSize) outBmp = new Bitmap(maxWidth, maxHeight); else outBmp = new Bitmap(NewWidth, NewHeight); Graphics g = Graphics.FromImage(outBmp); // 设置画布描绘质量及背景 g.InterpolationMode = InterpolationMode.High; g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.Clear(System.Drawing.Color.Transparent); //在指定位置并且按指定大小绘制指定的Image的指定部分。 g.DrawImage(image, new System.Drawing.Rectangle(x, y, NewWidth, NewHeight), new System.Drawing.Rectangle(0, 0, OldWidth, OldHeight), GraphicsUnit.Pixel); #region 添加水印 //添加文字水印(可设文字透明度) if (waterMark == WaterMark.Both || waterMark == WaterMark.Text) { System.Drawing.Font _Font = new System.Drawing.Font(ConfigHelper.GetConfigValue("WaterMarkFontFimily"), (float)Convert.ToDouble(ConfigHelper.GetConfigValue("WaterMarkFontSize"))); //Color.FromArgb(a,r,g,b) 参数说明:a-透明度0-100,100表示不透明; r-红色; g-绿色; b-蓝色 string[] ArrARGB = ConfigHelper.GetConfigValue("WaterMarkARGB").Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); System.Drawing.Brush _Brush = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(int.Parse(ArrARGB[0]), int.Parse(ArrARGB[1]), int.Parse(ArrARGB[2]), int.Parse(ArrARGB[3]))); string strWaterMarkText = ConfigHelper.GetConfigValue("WaterMarkText"); //根据字体及字体大小获取字符串所占宽度及高度 SizeF _SizeF = g.MeasureString(strWaterMarkText, _Font); //设置水印位置 if (FixedSize) { x = (maxWidth - NewWidth) / 2; y = (maxHeight + NewHeight) / 2 - Convert.ToInt32(_SizeF.Height); } else { y = NewHeight - Convert.ToInt32(_SizeF.Height); } g.DrawString(strWaterMarkText, _Font, _Brush, x, y); } //添加图片水印(可设图片透明度) if (waterMark == WaterMark.Both || waterMark == WaterMark.Image) { System.Drawing.Image WaterMarkImage = System.Drawing.Image.FromFile(System.Web.HttpContext.Current.Server.MapPath(ConfigHelper.GetConfigValue("WaterMarkImg"))); System.Drawing.Imaging.ImageAttributes _ImageAttributes = new System.Drawing.Imaging.ImageAttributes(); //第四行第四个值用来设置透明度,值越大越不透明: 1为不透明、0为全透明 //正对角线的值分别代表红、绿、蓝、透明度、第五个值也没做太深入研究,想了解ColorMatrix即5x5矩阵可以在网上搜一下,这个矩阵的各个值的设置听说还申请了专利。 float[][] colorMatrixElements = { new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f}, new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f}, new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f}, new float[] {0.0f, 0.0f, 0.0f, (float)Convert.ToDouble(ConfigHelper.GetConfigValue("WaterMarkImgAlpha")), 0.0f}, new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f} }; System.Drawing.Imaging.ColorMatrix colorMatrix = new System.Drawing.Imaging.ColorMatrix(colorMatrixElements); _ImageAttributes.SetColorMatrix(colorMatrix, System.Drawing.Imaging.ColorMatrixFlag.Default, System.Drawing.Imaging.ColorAdjustType.Bitmap); //设置水印位置 if (FixedSize) { x = (maxWidth + NewWidth - 2 * WaterMarkImage.Width) / 2; y = (maxHeight + NewHeight - 2 * WaterMarkImage.Height) / 2; } else { x = NewWidth - WaterMarkImage.Width; y = NewHeight - WaterMarkImage.Height; } g.DrawImage(WaterMarkImage, new System.Drawing.Rectangle(x, y, WaterMarkImage.Width, WaterMarkImage.Height), 0, 0, WaterMarkImage.Width, WaterMarkImage.Height, System.Drawing.GraphicsUnit.Pixel, _ImageAttributes); WaterMarkImage.Dispose(); _ImageAttributes.Dispose(); } #endregion #region 知识补充 //g.DrawArc 绘制一段弧线,它表示由一对坐标、宽度和高度指定的椭圆部分。 //g.DrawBezier 绘制由4个Point结构定义的贝塞尔样条。 //g.DrawBeziers 用Point结构数组绘制一系列贝塞尔样条。 //g.DrawClosedCurve 绘制由Point结构的数组定义的闭合基数样条。 //g.DrawCurve 绘制经过一组指定的Point结构的基数样条。 //g.DrawEllipse 绘制一个由边框(该边框由一对坐标、高度和宽度指定)定义的椭圆。 //g.DrawIcon 在指定坐标处绘制由指定的 Icon 表示的图像。 //g.DrawIconUnstretched 绘制指定的 Icon 表示的图像,而不缩放该图像。 //g.DrawImage 在指定位置并且按原始大小绘制指定的 Image。 //g.DrawImageUnscaled 在由坐标对指定的位置,使用图像的原始物理大小绘制指定的图像。 //g.DrawImageUnscaledAndClipped 在不进行缩放的情况下绘制指定的图像,并在需要时剪辑该图像以适合指定的矩形。 //g.DrawLine 绘制一条连接由坐标对指定的两个点的线条。 //g.DrawLines 绘制一系列连接一组 Point 结构的线段。 //g.DrawPath //g.DrawPie 绘制一个扇形,该形状由一个坐标对、宽度、高度以及两条射线所指定的椭圆定义。 //g.DrawPolygon 绘制由一组 Point 结构定义的多边形。 //g.DrawRectangle 绘制由坐标对、宽度和高度指定的矩形。 //g.DrawRectangles 绘制一系列由 Rectangle 结构指定的矩形。 //g.DrawString 在指定位置并且用指定的 Brush 和 Font 对象绘制指定的文本字符串. #endregion //设置图片压缩质量 EncoderParameters _EncoderParameters = new EncoderParameters(1); EncoderParameter _EncoderParameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Quality < 30 ? 100 : Quality); _EncoderParameters.Param[0] = _EncoderParameter; //设定图片保存格式(固定大小时必须保存为png图片,否则无法保证背景透明) ImageCodecInfo _ImageCodecInfo = null; if (FixedSize) _ImageCodecInfo = GetImageCodecInfo("PNG"); else _ImageCodecInfo = GetImageCodecInfo(image.RawFormat.Guid); //保存图片 if (_ImageCodecInfo == null) outBmp.Save(newFile, ImageFormat.Png); else outBmp.Save(newFile, _ImageCodecInfo, _EncoderParameters); g.Dispose(); image.Dispose(); outBmp.Dispose(); } /// <summary> /// 根据FormatDescription获取ImageCodeInfo /// </summary> /// <param name="strFormatDescription"></param> /// <returns></returns> private static ImageCodecInfo GetImageCodecInfo(string strFormatDescription) { ImageCodecInfo _ImageCodecInfo = null; ImageCodecInfo[] ArrImageCodecInfo = ImageCodecInfo.GetImageEncoders(); foreach (var obj in ArrImageCodecInfo) { if (obj.FormatDescription == strFormatDescription.ToUpper()) { _ImageCodecInfo = obj; break; } } return _ImageCodecInfo; } /// <summary> /// 根据Guid获取ImageCodeInfo /// </summary> /// <param name="_Guid"></param> /// <returns></returns> private static ImageCodecInfo GetImageCodecInfo(Guid _Guid) { ImageCodecInfo _ImageCodecInfo = null; ImageCodecInfo[] ArrImageCodecInfo = ImageCodecInfo.GetImageEncoders(); foreach (var obj in ArrImageCodecInfo) { if (obj.FormatID == _Guid) { _ImageCodecInfo = obj; break; } } return _ImageCodecInfo; } public enum WaterMark { None, Text, Image, Both }
接下来还会针对在线图片切割做一个实例给大家。
相关文章推荐
- 生成高清缩略图; 添加图片、文字水印; 图片、文字水印透明
- asp.net 生成缩略图、为图片添加文字水印、图片水印等功能
- asp.net 生成缩略图、为图片添加文字水印、图片水印等功能
- struts2上传文件、生成缩略图、添加文字和图片水印
- struts2实现上传文件、生成缩略图、添加文字和图片水印
- 生成缩略图、为图片添加文字水印、图片水印的类
- 上传图片 并生成缩略图 并添加文字水印
- C#文件上传生成缩略图及添加文字和图片水印
- c# 添加图片水印,可以指定水印位置+生成缩略图
- 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
- 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
- 使用ASP.net(C#)批量上传图片并自动生成缩略图,文字水印图,图片水印图
- 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
- 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
- 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
- asp.net生成缩略图,添加图片水印的类
- [转]使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
- 用AspJpeg调整文字水印透明,生成图片水印的效果
- c# 添加图片水印,可以指定水印位置+生成缩略图
- 使用ASP.net(C#)批量上传图片并自动生成缩略图,文字水印图,图片水印图