动态加入水印图片方法
2010-11-11 15:50
549 查看
对于水印图片 一般的操作时: 在图片上传的时候就加上水印. 而对于一个常常改变的水印标志的项目中或者是用户有这个需求要更改水印的话 我建议在最初的时候做一个 可以更改的 水印 让水印也动起来.
实现原理: 每一张图片请求一个程序[类] 在类中得到这个图片绘制水印输出图片--其实这个实现过程和 动态产生一个验证码是一样的.
基体流程 配置伪静态页面. 是什么意思呢? 要每一张图片请求同一个程序 如果程序已经写好了 最好的办法是 配置伪静态的方式配置图片的访问路径 到 这个类中
下面就是ini文件中配置的转发方式
RewriteRule ^/images/(.*)/Products/(.*).jpg/Handler/WaterHandler.ashx?url=/images/$1/Products/$2.jpg [I,L]
大家肯定知道这个是 转发的一种方式 如果不知道的朋友可以访问:http://www.docin.com/p-64011495.html 地址 看看 什么是:IIRf
这样的话 通过这个转发机制 就程序或者说是流程可以到 WaterHandler.ashx 类中 具体的怎样实现输出 一个图片呢
具体的代码是:
这样就可以输出一张有水印的图片了.而且这个水印是动图的 位置 大小 图片 都可以改了
但是 这样肯定是有一个问题的:资源问题. 每一张图片都是会请求这个对象的 当然对资源也有浪费!
实现原理: 每一张图片请求一个程序[类] 在类中得到这个图片绘制水印输出图片--其实这个实现过程和 动态产生一个验证码是一样的.
基体流程 配置伪静态页面. 是什么意思呢? 要每一张图片请求同一个程序 如果程序已经写好了 最好的办法是 配置伪静态的方式配置图片的访问路径 到 这个类中
下面就是ini文件中配置的转发方式
RewriteRule ^/images/(.*)/Products/(.*).jpg/Handler/WaterHandler.ashx?url=/images/$1/Products/$2.jpg [I,L]
大家肯定知道这个是 转发的一种方式 如果不知道的朋友可以访问:http://www.docin.com/p-64011495.html 地址 看看 什么是:IIRf
这样的话 通过这个转发机制 就程序或者说是流程可以到 WaterHandler.ashx 类中 具体的怎样实现输出 一个图片呢
具体的代码是:
] public class WaterHandler : IHttpHandler { private System.Web.HttpRequest Request; private System.Web.HttpResponse Response; private System.Web.HttpServerUtility Server; public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { Request = context.Request; Response = context.Response; Server = context.Server; string url = ""; if (Request.QueryString["url"] != null) url = Request.QueryString["url"]; string filename = System.IO.Path.GetFileNameWithoutExtension(url); filename = System.Text.RegularExpressions.Regex.Replace(filename, @"/D", ""); DateTime createTime = new DateTime(); string strTime = ""; if (filename.Length >= 8) { strTime = filename.Substring(0, 8); string strTemp = String.Format("{0}-{1}-{2}", strTime.Substring(0, 4), strTime.Substring(4, 2), strTime.Substring(6, 2)); DateTime.TryParse(strTemp, out createTime); } // DateTime beforeTime = DateTime.Parse(System.Configuration.ConfigurationManager.AppSettings["newImageTime"].ToString()); if (createTime > beforeTime) { CreateWaterImage(url); } else { NormalImage(url); } } public void CreateWaterImage(string url) { System.Drawing.Image pic = System.Drawing.Image.FromFile(Server.MapPath(url)); //查找水印图片 System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(Server.MapPath(System.Configuration.ConfigurationManager.AppSettings["watemarkPic"])); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(pic); if (pic != null) { //计算水印的大小 int wWidth = watermarkImage.Width; int wHeight = watermarkImage.Height; if (wWidth > pic.Width / 2) { wWidth = pic.Width / 2; wHeight = wHeight / (watermarkImage.Width / watermarkImage.Height); } //计算水印的坐标 //int wX = pic.Width - wWidth - 30; int wX = pic.Width - wWidth; int wY = pic.Height - wHeight; //设置成:高清、平滑 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //添加水印到图片上 //g.DrawImage(watermarkImage, wWidth, wheight); g.DrawImage(watermarkImage, wX, wY, wWidth, wHeight); g.Dispose(); //将标上水印的图片保存到输出流 pic.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); pic.Dispose(); watermarkImage.Dispose(); //设置响应类型。标明类型为.jpg,如果不加,使用IE浏览不会有问题,用FireFox就会是乱码 Response.ContentType = "image/jpeg"; Response.Flush(); Response.End(); } } private bool Check_ExtendName(string extendName) { string[] extendNames = { ".jpg", ".jpge", ".gif", ".bmp", ".png" }; foreach (string extName in extendNames) { if (extendName.Trim().ToLower() == extName.Trim()) { return true; } } return false; } public void NormalImage(string url) { System.Drawing.Image pic = System.Drawing.Image.FromFile(Server.MapPath(url)); pic.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); pic.Dispose(); //设置响应类型。标明类型为.jpg,如果不加,使用IE浏览不会有问题,用FireFox就会是乱码 Response.ContentType = "image/jpeg"; Response.Flush(); Response.End(); } }
这样就可以输出一张有水印的图片了.而且这个水印是动图的 位置 大小 图片 都可以改了
但是 这样肯定是有一个问题的:资源问题. 每一张图片都是会请求这个对象的 当然对资源也有浪费!
相关文章推荐
- asp.net通过实现IHttpHandler接口方法给图片添加水印图片(动态添加,不破坏原图片,但是耗资源)
- 对图片加入特定水印的方法
- asp.net下用Aspose.Words for .NET动态生成word文档中的图片或水印的方法(转)
- asp.net下用Aspose.Words for .NET动态生成word文档中的图片或水印的方法
- 【iPhone Development】对图片加入特定水印的方法
- asp.net下用Aspose.Words for .NET动态生成word文档中的图片或水印的方法
- asp.net如何给每张图片动态添加水印方法(一)
- asp.net如何给每张图片动态添加水印方法(二)
- 关于Unity3D中Resources动态加载NGUI图片的方法!!!
- 获取动态加载的图片大小的正确方法
- 微信公众平台接口 动态生成html图片预览无法使用jquery事件的解决方法
- Android实现Listview异步加载网络图片并动态更新的方法
- 关于Unity3D中Resources动态加载NGUI图片的方法!!!
- iOS 给图片加水印(合并两张图片的方法)
- php给图片添加文字水印方法汇总
- struts中利用jquery的$.ajax方法来动态获得图片以及信息
- javascript动态改变img的src属性图片不显示的解决方法
- 用asp水印图片代码和方法
- ios 给图片上加水印的方法