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
    }
}

 

        DirectoryInfo imagesfile = new DirectoryInfo(Server.MapPath("~/image"));

        FileInfo[] fileinfo = imagesfile.GetFiles("*.*");

        foreach (FileInfo fi in fileinfo)

        {

            strpic += "<img src=/"../image/" + fi.Name + "/" />";

        }

 

生成.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>

 

在IIS中配置:

 

对站点击右键-->“属性“-->“主目录”-->“配置”-->并启用“缓存ISAPI扩展“.....“添加...“-->扩展名:.jpg;可执行文件:”C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll“-->“确定”

依次添加.gif,.png,.bmp等要加水印的图片

如果不设置,就按正常的显示。

如果设置,其它位置的该类型图片无法正常显示。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值