目录
在照片上添加水印
在项目中创建TestHandler类,该类实现IHttpModule接口
public class TestHandler: IHttpHandler
{
public bool IsReusable => throw new NotImplementedException();
public void ProcessRequest(HttpContext context)
{
throw new NotImplementedException();
}
}
声明一个变量存在水印和图片不存在,默认显示的图片
//水印图片
private const string WATERMARK_URL = "~/images/logo.png";
//图片不存在,默认显示的图片
private const string DEFAULTIMAGE_URL = "~/images/wyz.jpg";
获取到用户请求图片的路径
//获取到用户请求图片的路径
string filePath = context.Request.PhysicalPath;
System.Drawing.Image Cover;
如何添加水印
先要将我们获取到的图片放到画布上,然后往在画布上的图片添加水印,最后将图片输出:
//加载文件
Cover = Image.FromFile(filePath);
//加载水印图片
Image watermark = Image.FromFile(context.Server.MapPath(WATERMARK_URL));
//实例化画布
Graphics graphics = Graphics.FromImage(Cover);
//水印 水印位置
graphics.DrawImage(watermark, new Rectangle(100, 100, 200, 200));
//释放画布
graphics.Dispose();
//释放水印图片
watermark.Dispose();
//设置输出格式
context.Response.ContentType = "images/jpeg";
//将图片存放输出流
Cover.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
Cover.Dispose();
context.Response.End();
完整代码:
public class TestHandler : IHttpHandler
{
public bool IsReusable => false;
//水印图片
private const string WATERMARK_URL = "~/images/logo.png";
//图片不存在,默认显示的图片
private const string DEFAULTIMAGE_URL = "~/images/王彦祖.jpg";
public void ProcessRequest(HttpContext context)
{
//获取到用户请求图片的路径
string filePath = context.Request.PhysicalPath;
System.Drawing.Image Cover;
//判断请求的物理路径中是否存在文件
if (File.Exists(filePath))
{
//加载文件
Cover = Image.FromFile(filePath);
//加载水印图片
Image watermark = Image.FromFile(context.Server.MapPath(WATERMARK_URL));
//实例化画布
Graphics graphics = Graphics.FromImage(Cover);
//水印 水印位置
graphics.DrawImage(watermark, new Rectangle(100, 100, 200, 200));
//释放画布
graphics.Dispose();
//释放水印图片
watermark.Dispose();
}
else
{
//加载默认图片
Cover = Image.FromFile(context.Request.MapPath(DEFAULTIMAGE_URL));
}
//设置输出格式
context.Response.ContentType = "images/jpeg";
//将图片存放输出流
Cover.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
Cover.Dispose();
context.Response.End();
}
}
在web.config中配置相关配置文件:
<configuration>
<system.webServer>
<handlers>
<add verb="*" path="images/*" name="h1" type="watermark.TestHandler"/>
</handlers>
</system.webServer>
</configuration>
在web窗体页面只要有一个image控件向服务器请求图片就会加上水印
<div>
<asp:Image ID="Image1" runat="server" ImageUrl="~/images/nvshen1.jpg" />
</div>
水印效果:
制作验证码
验证码和水印差不多就是在一个空白在画布添加验证码
先创建VerofocatopmCpde类,该类实现IHttpModule接口和该类实现IHttpModule接口
public class VerofocatopmCpde : IHttpHandler, IRequiresSessionState
{
public bool IsReusable => throw new NotImplementedException();
public void ProcessRequest(HttpContext context)
{
throw new NotImplementedException();
}
}
public class VerofocatopmCpde : IHttpHandler, IRequiresSessionState
{
public bool IsReusable => false;
//生成随机数对象
private Random RandomSeed = new Random();
public void ProcessRequest(HttpContext context)
{
Random r = new Random();
//提供验证码使用的字符
string strWord = "1234567890ABCDEFGHIJKLMNOPQRSTWUVXYZabcdefghyjklmnopqrstwuvxyz";
//声明一个装载验证码的变量
string NumStr = null;
string N=null;
//创建一个画板,设置宽高
Bitmap b = new Bitmap(125, 40);
//拿数组装一些字体
string[] font = { "宋体", "Arial", "微软雅黑", "Verdana", "Comic Sans MS" };
//画笔颜色(字体颜色)
Brush[] color = { Brushes.Red, Brushes.Blue, Brushes.Pink,Brushes.Yellow,Brushes.Orange};
//拿到画笔
Graphics g = Graphics.FromImage(b);
//清除画板,填充颜色
g.Clear(Color.Green);
//设置x轴
int x = 0;
for (int i = 0; i < 5; i++)
{
//生成随机验证码字符
N = strWord[RandomSeed.Next(0, strWord.Length)].ToString();
//在画板上画字(字符,new Font(字体,大小,样式),画笔颜色,位置)
g.DrawString(N, 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;
//将随机生成的字符拼接为字符串,形成验证码
NumStr += N;
}
//将验证码保存到Session中用于后面对比
context.Session["vcode"] = NumStr.ToLower();
//保存到画板
b.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
验证码效果: