您的位置:首页 > 其它

动态加入水印图片方法

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 类中 具体的怎样实现输出 一个图片呢

具体的代码是:
]  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();
}
}


这样就可以输出一张有水印的图片了.而且这个水印是动图的 位置 大小 图片 都可以改了

但是 这样肯定是有一个问题的:资源问题. 每一张图片都是会请求这个对象的 当然对资源也有浪费!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: