在上一篇文章介绍了指定图片文件,给指定的文件添加水印

  • 在本文中将加水印应用于项目中,在用户上传图片文件时,为图片加相应的水印
  • 仍然使用一般处理程序(.ashx)

用户都是通过上传控件,将图片文件添加进数据库和对应的存储文件夹中
因此,此项功能必须具备这样的流程
文件上传控件接收获取控件中文件的名称实例化画布对象写入水印内容释放画布保存绘制后的图片文件输出图片向用户展示停止http响应

此项中加一项小功能

System.Guid.NewGuid() 格式化
解决用户在上传时遇到同名文件上传失败的问题
记得要 ToString() 转下哟

显示页面就用标签代替服务器控件(用法一样

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="给图片加水印.WebForm2" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form id="form1" runat="server" action="Handler2.ashx" method="post" enctype="multipart/form-data">
<div>
<input type="file" name="filew" />
<input type="submit" name="sub" value="上传图片" />
</div>
</form>
</body>
</html>

以表单的方式进行数据提交(可以无缝切换到服务器

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web;

namespace 给图片加水印
{
/// <summary>
/// Handler2 的摘要说明
/// </summary>
public class Handler2 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//获取上传的文件
HttpPostedFile file = context.Request.Files[0];
if (file.ContentLength > 0)
{
//对上传的文件进行检测(是否是需要的图片类型)
//(判断后缀名)获取上传文件的名称(包含的后缀名)1.jpg
string filename = Path.GetFileName(file.FileName);
//获取上传文件的后缀名.jpg
string fileExit = Path.GetExtension(filename);
//判断后缀名是否为.jpg
if (fileExit == ".jpg" || fileExit == ".png")
{
//对上传文件进行重命名
string newfilename = Guid.NewGuid().ToString();
//将上传的文件放在目录下
string dirupload = "~/ImgUpLoad/";
//创建文件夹(判断磁盘上是否有现在的路径,没有就创建一个)
if (!Directory.Exists(context.Request.MapPath(dirupload)))
{
Directory.CreateDirectory(context.Request.MapPath(dirupload));
}
//找到文件的完整路径
string allDir = dirupload + newfilename + fileExit;
//保存路径
file.SaveAs(context.Request.MapPath(allDir));
//创建图片水印
//创建一个Image
using (Image tp = Image.FromFile(context.Request.MapPath(allDir)))
{
//创建画布
using (Bitmap map = new Bitmap(tp.Width, tp.Height))
{
//创建画笔
using (Graphics grap = Graphics.FromImage(map))
{
//在指定的位置上绘制
grap.DrawImage(tp, 0, 0, tp.Width, tp.Height);
//创建字体对象
Font ft = new Font("微软雅黑", 18);
//指定绘制的字符串
grap.DrawString("新鲜美淘网", ft, Brushes.Black, new Point(map.Width - 150, map.Height - ft.Height));
//
string WYImagename = Guid.NewGuid().ToString();
map.Save(context.Request.MapPath("/ImgUpLoad/" + WYImagename + ".jpg"), ImageFormat.Jpeg);

//输出
context.Response.Write("<html><body><img src='/ImgUpLoad/" + WYImagename + ".jpg' /></body></html>");
context.Response.ContentType = "text/html";
}
}
//释放图片
tp.Dispose();
}
}
}
//停止http的响应
context.Response.End();
}

public bool IsReusable
{
get
{
return false;
}
}
}
}
赘述下 System.Guid.NewGuid()为什么可以保证文件名不重
string str = System.Guid.NewGuid().ToString();

一般这样使用,不必考虑下面的格式使用方式

概念:

       GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) 。 GUID是一个通过特定算法产生的二进制长度为128位的数字标识符,用于指示产品的唯一性。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。
       在 Windows 平台上,GUID 广泛应用于微软的产品中,用于标识如如注册表项、类及接口标识、数据库、系统目录等对象。

格式:

GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个32位十六进制数。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。

System.Guid.NewGuid().ToString(“N”); 32位字符串
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

System.Guid.NewGuid().ToString(“D”); 连字符分隔的32位字符串
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

System.Guid.NewGuid().ToString(“B”); 在大括号中、由连字符分隔的32位字符串
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

System.Guid.NewGuid().ToString(“P”); 在圆括号中、由连字符分隔的32位字符串
(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)