如何利用HttpModule和HttpHandler对象给图片添加水印和验证码的获取

一、如何给图片添加水印

上回我们讲到使用HttpModule和HttpHandler对象防盗链,给图片加水印原理是一样的。
1.创建第一个网站,准备其图片资源
2.在网站中添加HttpHandler类,继承IHttpHandler接口,编写水印功能。

1>代码如下:

 //获取要添加图片的路径
            string path = context.Request.PhysicalPath;
            System.Drawing.Image Cover;
            //判断请求的物理路径是否存在
            if (File.Exists(path))
            {
                //加载图片文件
                Cover = Image.FromFile(path);
                //定义画布
                Graphics graphics = Graphics.FromImage(Cover);
                //加水印
                graphics.DrawString("小贺专属", new Font("微软雅黑", 20), Brushes.Red, Cover.Width - 125, Cover.Height - 15);
                //释放画布
                graphics.Dispose();

            }
            else
            {
                //如果图片不存在的话则显示默认图片
                Cover = Image.FromFile(pic2);
            }
            //设置输出的图片格式
            context.Response.ContentType = "image/jepg";
            //将修改的图片存入输出流
            Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            //释放图片
            Cover.Dispose();
            //终止输出
            context.Response.End();

2>配置相关配置文件:

 <system.webServer>
    <handlers>
      <add verb="*" path="images/*" type="test.Class1" name="sd"/>
    </handlers>
  </system.webServer>

有时,为了防止恶意破解密码、刷票、论坛灌水、刷页等恶意的网络行为:有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断地登录尝试。所以,我们使用验证码来防止黑客盗取密码。

二、如何产生验证码
步骤:

1.web作用域:PageContext (page域) 、request 、session 、servletContext(application域)
2.使用HttpHandler生成把验证码
3.把验证码存到session作用域
4.提交程序,获取用户提交验证码
5.用户验证码与session作用域对比

代码如下:

 //生成随机数对象:
            Random random = new Random();
            string str = "123456789qweqwertyuiopasdfghjklzxcvbnm";
            string num = null;
            for (int i = 0; i < 5; i++)
            {
                num += str[random.Next(0, str.Length)];
            }
            //将验证码保存到session
            context.Session["code"] = num.ToLower();
            CreateImages(context, num);
        }
        public void CreateImages(HttpContext context, string checkCode)
        {
            int iwidth = (int)(checkCode.Length * 13);
            Bitmap bitmp = new Bitmap(iwidth, 22);
            Graphics graphics = Graphics.FromImage(bitmp);
            graphics.Clear(Color.White);
            //定义颜色
            Color[] c = new Color[] { Color.Blue, Color.Brown, Color.Red, Color.Purple };
            //定义字体
            string[] s = { "宋体", "微软雅黑" };
            Random rand = new Random();
            //随机输出噪点
            for(int i = 0; i < 50; i++)
            {
                int x = rand.Next(bitmp.Width);
                int y= rand.Next(bitmp.Height);
                graphics.DrawRectangle(new Pen(Color.LightCyan, 0), x, y, 1, 1);
            }
            //输出不同字体和颜色的验证码字符
            for(int i = 0; i < checkCode.Length; i++)
            {
                int cindex = rand.Next(7);
                int findex= rand.Next(5);
                Font f =  new Font(s[findex], 10, FontStyle.Bold);
                Brush b = new SolidBrush(c[cindex]);
                int ii = 4;
                if ((i + 1) % 2 == 0)
                {
                    ii = 2;
                }
                graphics.DrawString(checkCode.Substring(i, 1), f, b, 2 + (i * 12), ii);
                
            }
            //画一个边框
            graphics.DrawRectangle(new Pen(ColorTranslator.FromHtml("#CCCCCC"), 0), 0, 0, bitmp.Width - 1, bitmp.Height - 1);
            //输出到浏览器
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            bitmp.Save(ms, ImageFormat.Jpeg);
            context.Response.ClearContent();
            context.Response.ContentType = "image/gif";
            context.Response.BinaryWrite(ms.ToArray());
            graphics.Dispose();
            bitmp.Dispose();
        }

噪点(noise)主要是指CCD(CMOS)将光线作为接收信号并输出的过程中所产生的图像中的粗糙部分,也指图像中不该出现的外来像素,通常由电子干扰产生。
看起来就像图像被弄脏了,布满一些细小的糙点。平时拍摄的数码照片如果用个人电脑将拍摄到的高画质图像缩小以后再看的话,也许就注意不到。不过,如果将原图像放大,那么就会出现本来没有的颜色(假色),这种假色就是图像噪音。如图:

如何利用HttpModule和HttpHandler对象给图片添加水印和验证码的获取

而这里噪点就是在验证码图片上,一些指定颜色的点,干扰程序自动分析验证码像素。

上一篇:【总结系列】互联网服务端技术体系:高性能之数据库索引


下一篇:在 ASP.NET WebForms/MVC 中利用 HttpModule 添加全局站点统计(CNZZ、百度统计、Google Analytics等)脚本