#.NET使用HttpHandle对象实现水印和验证码

Posted 爱喝可乐的阿囧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#.NET使用HttpHandle对象实现水印和验证码相关的知识,希望对你有一定的参考价值。

水印

创建项目,创建前端网页

创建一个项目WebWate,在其中创建一个WebForm:WebForm1.aspx
为了方便看效果我们就在页面上防两个img来显示图片,代码如下:

<body>
    <form id="form1" runat="server">
        <div>
            <img src="images/1.jpg" />
            <img src="images/2.jpg" />
        </div>
    </form>
</body>

在项目文件中新建一个文件夹images来放所有图片

创建HttpHandle类

接下来,创建一个HttpHandle类,并实现IHttpHandle接口,代码如下:

public class HttpHandle : IHttpHandler
    {
        public bool IsReusable => false;

        public void ProcessRequest(HttpContext context)
        {
            throw new NotImplementedException();
        }
   	}

接下来,编辑主要代码(注释在代码里):

        public void ProcessRequest(HttpContext context)
        {
            //获取源文件物理路径
            string filename = context.Request.PhysicalPath;
            //创建画板
            Bitmap b = new Bitmap(filename);
            //拿到画笔
            Graphics g = Graphics.FromImage(b);
            //拿到准备画的图片
            Image i = Image.FromFile(context.Server.MapPath("~/images/囧.png"));
            //将图片画上去
            g.DrawImage(i, new Point(b.Width - i.Width, b.Height - i.Height));
            //画好之后保存
            b.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            //返回画好的图片
            context.Response.WriteFile(filename);
        }

ps:g.DrawImage(i, new Point(b.Width - i.Width, b.Height - i.Height))这里
new Point()是设置水印的位置,我这里使用的是画板的宽度减去水印图片的宽度以及画板的高度减去水印图片的高度,这样的话水印就可以设置在图片的右下角

配置Web.config

写完HttpHandle类后要记得配置Web.config文件,要不然无效哦,代码如下:

<configuration>
  <system.webServer>
    <handlers>
      <add name="h1" path="images/*" verb="*" type="WebWate.HttpHandle"/>
    </handlers>
  </system.webServer>
</configuration>

以下就是我的效果图
效果图

验证码

创建项目,创建前端网页

创建一个项目:WebCode,在其中创建一个WebForm:WebForm1.aspx
在前端网页中我们只需要任意放一个img即可,这里我们的主要目的是实现效果,前端代码如下:

<body>
    <form id="form1" runat="server">
        <div>
            <img src="images/1,jpg" />
        </div>
    </form>
</body>

在项目中建一个文件夹images来放所有的图片

创建HttpHandle类

接下来建一个HttpHandle类,并实现IHttpHandle接口,代码如下:

public class HttpHandle : IHttpHandler
    {
        public bool IsReusable => throw new NotImplementedException();

        public void ProcessRequest(HttpContext context)
        {
            throw new NotImplementedException();
        }
    }

ps:记得把public bool IsReusable => throw new NotImplementedException();的throw new NotImplementedException();改成false或者true
接下来就是编写主要代码,代码如下(注释在代码里):

public void ProcessRequest(HttpContext context)
        {
            //拿数组装所有字母和数字
            string[] text = {"1","2","3","4","5","6","7","8","9","0","q","w","e","r","t","y"
            ,"u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m","Q","W","E","R","T","Y"
            ,"U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M"};
            //随机数
            Random r = new Random();
            //声明装五个字符的数组
            string[] te = new string[5];
            //声明一个字符串来拼接上5个字符,方便用来保存和调用
            string code = "";
            //获取五个随机加载的字符
            for (int i = 0; i < 5; i++)
            {
                te[i] = text[r.Next(0, text.Length - 1)];
                code += te[i];
            }
            //将code全部变成小写保存到session里
            context.Session["co"] = code.ToLower();
            //创建一个画板,设置宽高
            Bitmap b = new Bitmap(125, 40);
            //拿数组装一些字体
            string[] font = { "宋体", "Arial", "微软雅黑", "Verdana", "Comic Sans MS" };
            //画笔颜色(字体颜色)
            Brush[] color = { Brushes.Red, Brushes.Blue, Brushes.Pink };
            //拿到画笔
            Graphics g = Graphics.FromImage(b);
            //清除画板,填充颜色
            g.Clear(Color.Green);
            //设置x轴
            int x = 0;
            //通过for循环一个字一个字的画上去
            for (int i = 0; i < 5; i++)
            {
                //在画板上画字(字符,new Font(字体,大小,样式),画笔颜色,位置)
                g.DrawString(te[i], new Font(font[r.Next(0, font.Length - 1)], r.Next(20, 25), FontStyle.Bold), color[r.Next(0, color.Length)], new Point(x, 0));
                //每加一个字,x轴就加20,往右边推
                x += 20;
            }
            //保存到画板
            b.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        }

其中定义了一个字符串code来保存随机抽取的字符,最终拼接成一个字符串,并且将这个字符串全部转化成小写储存到session中,方便后期进行比对。!!!注意要使用Session要引用using System.Web.SessionState;还要实现IRequiresSessionState接口!!!
字体和颜色什么的都可以根据自己的需求来设置,在里面g.DrawString()中的参数我都是通过前面定义的数组来拿值的,都是通Random随机获得其中的某个值。

配置Web.config

接下来别忘了配置Web.config,代码如下:

<configuration>
  <system.webServer>
    <handlers>
      <add verb="*" name="h1" path="images/*" type="WebCode.HttpHandle"/>
    </handlers>
  </system.webServer>
</configuration>

下面是我的运行结果:
运行效果

以上就是我本次的全部内容,希望能够帮助到大家~
如果哪里有不对的地方请随时联系我,我会加以改正~

以上是关于#.NET使用HttpHandle对象实现水印和验证码的主要内容,如果未能解决你的问题,请参考以下文章

#.NET使用HttpHandle对象实现水印和验证码

#.NET使用HttpHandle对象实现水印和验证码

C#.NET windows控件实现水印

Java 实现图片水印

java 实现图片水印

用Java实现RSA加解密及签名和验签——.pem文件格式秘钥