第二十一讲 IHttpHandler处理程序

这篇博客介绍了如何使用IHttpHandler接口在ASP.NET中实现图片水印效果。通过创建一个ASHX文件,处理HTTP请求,判断图片是否存在,加载图片到内存,然后在源图片上绘制水印,最后保存并输出带水印的图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要内容
    使用IHttpHandler实现水印效果
    动态添加数字水印效果

    1. 创建一个 一般处理程序(.ashx)格式的文件
        它的contex参数对象基本是个万能对象了,需要调用的Server对象,Request对象等都是通过点出来的。

        在此文件中,就初级来说,目前我知道的就是老师的这些,主要处理的一个方法就是从IHttpHandler接口继承过来的:
        public void ProcessRequest(HttpContext context)方法。

        在这个方法中,如果要使用asp.net对象的话,需要用参数context来引用。

    2. 获取要处理的图片
        如何开始Handler1.ashx的功能呢?
        先把图片传过来:
        创建一个方法,在这个方法中,将图片名字做一个参数,在页面加载时,通过get方法传递到"Handler1.ashx?isbnImage="+图片名。再由Handler1.ashx这个处理程序对图片进行处理。如下代码:

        //获取图片名称,以连接的方式发送到.ashx处理程序中,这里Handler1.ashx就相当于一个页面
        public string GetUrl(string isbn)
        {
            return "Handler1.ashx?isbnImage=" + isbn;
        }

        在前端:由原来的:<%#Eval("isbn","~/images/{0}.jpg") %>
        改写成:<%# GetUrl(Eval("isbn").ToString()) %>



    
    3. 使用System.IO;这个类库中的File.Exists()方法来判断这个文件是否存在。方法的参数必须是个文件路径,且是绝对路径。

    4. context.Server.MapPath()方法映射文件路径,即将一个虚拟路径转换成绝对路径。

    5. 加载一个图片Image image=Image.FromFile(图片路径);
    Image这个类是存储在system.Drawing命名空间中的
    为什么要使用这个类?
        因为两个图片(被贴的源图片和水印图片)都是存储在物理磁盘上的,如果要对它们进行操作,则需要加载到内存当中来进行

    6. 贴水印前的绘制图片
        Graphics g =Graphics.FromImage(image);//先绘制源图片
        g.DrawImage();//在源图片上绘制水印图片上去,它有多个参数

        DrawImage()这方法的作用是,在指定的位置指定区域内绘制
            参数1是Image对象
            参数2是Rectangle矩形对象,矩形对象的绘制有4个参数,x方向的位置,y方向的位置,宽度和高度。这里的位置是相对于源图片的左上角的。

        如实现源代码:
        public void ProcessRequest(HttpContext context)
        {
            //将默认显示的图片和水印图片的路径定义好
            string defaults="~image/default.jpg";
            string waterMark="~/images/waterMark.jpg";

           //水印效果的实现
            Image image;
            string isbn = context.Server.MapPath("~images/" + context.Request.QueryString["isbnImage"].ToString() + ".jpg");//将文件的虚拟路径转换成绝对路径
            //判断文件是否存在(这是物理路径下的文件是否存在)
            if (File.Exists(isbn))
            {
                //如果此文件在路径下的文件夹中存在则为true,就可以为这个图片贴水印了
                //因为被贴水印的源图片和水印图片存储在物理磁盘上,所以要先将它加载到内存中
                image = Image.FromFile(isbn);
                Image waterMarkImage = Image.FromFile(context.Server.MapPath(waterMark));

                //绘制图片
                Graphics g = Graphics.FromImage(image);//绘制被贴水印的源图片
                g.DrawImage(waterMarkImage, new Rectangle(image.Width - waterMarkImage.Width, image.Height - waterMarkImage.Height, waterMarkImage.Width, waterMarkImage.Height));

                //接下来别忘记释放内存,绘图工具,内存对象image,waterMarkImage
                g.Dispose();
                waterMarkImage.Dispose();
                //image.Dispose();//这里因为还有个否定条件要用到,先不释放

            }
            else {
                //如果此文件在路径下的文件夹中存在不存在则为false, 否则就使用默认的图片
                image = Image.FromFile(context.Server.MapPath(defaults));
            }
            //最后要保存贴好水印的图片,save方法:一个二进制输出流到HTTP,一个是输入的文件格式
            image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            //这里image对象就用完了,收工,释放内存资源
            image.Dispose();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值