C# 给站点指定位置的某种格式的图片添加水印

复制代码 代码如下:

  using System;

  using System.Data;

  using System.Configuration;

  using System.Web;

  using System.Web.Security;

  using System.Web.UI;

  using System.Web.UI.WebControls;

  using System.Web.UI.WebControls.WebParts;

  using System.Web.UI.HtmlControls;

  using System.Drawing;

  namespace Chen

  {

  /// <summary>

  /// HandlerImageOpener 的摘要说明

  /// </summary>

  public class HandlerImageOpener : IHttpHandler

  {

  public HandlerImageOpener()

  {

  //

  // TODO: 在此处添加构造函数逻辑

  //

  }

  private string _path = "";

  /// <summary>

  /// 水印图片路径

  /// </summary>

  public string PngPath

  {

  get

  {

  if (_path == "")

  {

  _path = System.Web.HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["WatermarkedImagePath"]);

  }

  return _path;

  }

  }

  /// <summary>

  /// 为图片加水印并写入到Response.OutputStream

  /// </summary>

  /// <param name="hc">上下文对象</param>

  public void GetNewBitMap(HttpContext hc)

  {

  // 加载原图片

  //System.Web.HttpContext.Current.Response.Write(System.Drawing.Image.FromFile(hc.Request.PhysicalPath));

  //System.Web.HttpContext.Current.Response.End();

  Bitmap oldBmp = new Bitmap(System.Drawing.Image.FromFile(hc.Request.PhysicalPath));

  int newWidth = oldBmp.Width;

  int newHeight = oldBmp.Height;

  if (oldBmp != null)

  {

  // 绑定画板

  Graphics grap = Graphics.FromImage(oldBmp);

  // 加载水印图片

  Bitmap bt = new Bitmap(PngPath);

  // 水印位置控制

  int pH = GetNewPoint(newHeight, bt.Height, true);

  int pW = GetNewPoint(newWidth, bt.Width, false);

  if (newHeight < pH * 8)

  pH = pH / 2;

  if (newWidth < pW)

  pW = pW / 2 / 2;

  int pX = newHeight - pH;

  int pY = newWidth - pW - 3;

  // 添加水印

  grap.DrawImage(bt, pY, pX, pW, pH);

  // 写入到输出流

  oldBmp.Save(hc.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

  }

  }

  // 控制宽高

  private int GetNewPoint(int oldP, int newP, bool isW)

  {

  int p = 4;

  if (isW)

  {

  p = 16;

  }

  if (oldP < (newP * p))

  {

  newP /= 2;

  if (oldP < (newP * p))

  {

  GetNewPoint(oldP, newP, isW);

  }

  }

  return newP;

  }

  #region IHttpHandler 成员

  bool IHttpHandler.IsReusable

  {

  get { return true; }

  }

  void IHttpHandler.ProcessRequest(HttpContext context)

  {

  GetNewBitMap(context);

  }

  #endregion

  }

  }

  生成.dll文件后在web.config 中配置

  <!--水印图片路径-->

  <appSettings>

  <add key="WatermarkedImagePath" value="~/logo.gif"/>

  </appSettings>

  <!--引用处理函数 path为需要加水印图片的目录-->

  <httpHandlers>

  <add type="Chen.HandlerImageOpener, Chen" verb="*" path="image/*.jpg,image/*.gif,image/*.png,image/*.bmp" />

  </httpHandlers>