Asp.net 上传图片添加半透明图片或者文字水印的方法
主要用到System.Drawing 命名空间下的相关类,如Brush、Image、Bitmap、Graphics等等类
Image类可以从图片文件创建Image的实例,Bitmap可以从文件也可以从已有的Image对象创建实例,而Graphics类则是封装了对图像的相关操作,可以理解为一个绘图的面板,在这个面板里你可以添加文字,添加背景等等很多常规绘图软件具备的功能。
下面就怎样添加水印做简单的介绍:
在图片上写字
为了方便理解我把水印分为文字型的水印以及图片型的水印,它们都派生自WatermarkPainter基类,需要实现基类中的AddWatermark的方法,这个方法是用来具体的绘图用。
WatermarkPainter类如下:
using System.Drawing;
using System.IO;
using System.Text;
using System;
namespace Juice.Common.Drawing
{
/// <summary>
/// 图片水印绘制器
/// </summary>
public abstract class WatermarkPainter : IDisposable
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="rawImagePath"></param>
/// <param name="alpha"></param>
/// <param name="replaceRawImage"></param>
protected WatermarkPainter(string rawImagePath, int alpha, bool replaceRawImage)
{
ImageToBePainted = rawImagePath;
WatermarkAlpha = alpha;
ReplaceRawImage = replaceRawImage;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="rawImagePath"></param>
/// <param name="alpha"></param>
protected WatermarkPainter(string rawImagePath, int alpha)
: this(rawImagePath, alpha, true)
{ }
/// <summary>
/// 为临时存储文件添加的后缀
/// </summary>
private string m_TempFileSuffix = ".juice.watermark.temp";
/// <summary>
/// 水印的透明度
/// </summary>
private int m_WatermarkAlpha;
/// <summary>
/// 水印透明度
/// </summary>
public int WatermarkAlpha
{
get
{
)
m_WatermarkAlpha = ;
)
m_WatermarkAlpha = ;
return m_WatermarkAlpha;
}
set { m_WatermarkAlpha = value; }
}
private string m_ImageToBePainted;
/// <summary>
/// 添加水印的图片的物理路径
/// </summary>
public string ImageToBePainted
{
get { return m_ImageToBePainted; }
set { m_ImageToBePainted = value; }
}
private bool m_ReplaceRawImage;
/// <summary>
/// 是否用加了水印的图片替换原有的图片
/// </summary>
public bool ReplaceRawImage
{
get { return m_ReplaceRawImage; }
set { m_ReplaceRawImage = value; }
}
private string m_TempImagePath;
/// <summary>
/// 加了水印后的临时储存名称
/// </summary>
protected string TempImagePath
{
get
{
if (string.IsNullOrEmpty(this.m_TempImagePath))
{
StringBuilder s = new StringBuilder(ImageToBePainted);
s.Append(this.m_TempFileSuffix);
this.m_TempImagePath = s.ToString();
}
return m_TempImagePath;
}
set { m_TempImagePath = value; }
}
/// <summary>
/// 原始图像
/// </summary>
private Image m_RawImage;
/// <summary>
/// 为图片添加水印
/// </summary>
public void PaintWaterMark()
{
if (string.IsNullOrEmpty(ImageToBePainted))
return;
if (!File.Exists(ImageToBePainted))
throw new FileNotFoundException(string.Format("file {0} not found.", ImageToBePainted));
bool succeed;
if (m_RawImage == null)
m_RawImage = Image.FromFile(ImageToBePainted);
///原始的图片
using (Bitmap newImage = new Bitmap(m_RawImage.Width, m_RawImage.Height))
{
///创建绘制图片的图面
using (Graphics g = Graphics.FromImage(newImage))
{
g.DrawImage(m_RawImage, , , m_RawImage.Width, m_RawImage.Height);
///开始绘制水印
succeed = AddWatermark(g, newImage);
}
if (succeed)
///将图片保存到临时的文件
newImage.Save(TempImagePath);
if (m_RawImage != null)
m_RawImage.Dispose();
}
if (succeed && ReplaceRawImage)
{
//删除原来的文件
if (File.Exists(ImageToBePainted))
File.Delete(ImageToBePainted);
FileInfo info = new FileInfo(TempImagePath);
if (info.Exists)
{
info.MoveTo(ImageToBePainted);
}
}
}
/// <summary>
/// 添加水印,继承类可以用来添加自己的水印
/// </summary>
/// <param name="graphics"></param>
/// <param name="newImage"></param>
/// <returns></returns>
protected abstract bool AddWatermark(Graphics graphics, Bitmap newImage);
#region IDisposable 成员
public virtual void Dispose()
{
}
#endregion
}
}
文字型的水印的类是TextWatermarkPainter类
using System.Drawing;
using System.IO;
using System.Text;
using System;
namespace Juice.Common.Drawing
{
/// <summary>
/// 添加文字水印
/// </summary>
public sealed class TextWatermarkPainter : WatermarkPainter
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="rawImagePath"></param>
/// <param name="alpha"></param>
/// <param name="text"></param>
public TextWatermarkPainter(string rawImagePath, int alpha, string text)
: base(rawImagePath, alpha)
{
WatermarkText = text;
}
private Font m_Font;
/// <summary>
/// 水印文字的字体
/// </summary>
public Font Font
{
get
{
if (null == m_Font)
m_Font = , FontStyle.Bold, GraphicsUnit.Pixel);
return m_Font;
}
set { m_Font = value; }
}
private Color m_FontColor;
/// <summary>
/// 字体颜色
/// </summary>
public Color FontColor
{
get
{
if (m_FontColor == null)
m_FontColor = Color.DarkSeaGreen;
return m_FontColor;
}
set { m_FontColor = value; }
}
private string m_WatermarkText;
/// <summary>
/// 水印的文字
/// </summary>
public string WatermarkText
{
get { return m_WatermarkText; }
set { m_WatermarkText = value; }
}
/// <summary>
/// 实现添加水印的方法
/// </summary>
/// <param name="graphics"></param>
/// <param name="newImage"></param>
/// <returns></returns>
protected override bool AddWatermark(Graphics graphics, Bitmap newImage)
{
if (string.IsNullOrEmpty(WatermarkText))
return true;
using (SolidBrush brush = new SolidBrush(Color.FromArgb(WatermarkAlpha, FontColor.R, FontColor.G, FontColor.B)))
{
Font font;
///添加文字位置
PointF f = new PointF();
float totalWidth = Font.Size * WatermarkText.Length;
f.X = newImage.Width - totalWidth - ;
f.Y = newImage.Height - Font.Height;
)
{
///自动调整字体的大小
float width = newImage.Width / WatermarkText.Length;
font = new Font(Font.FontFamily, width, GraphicsUnit.Pixel);
}
else
font = Font;
graphics.DrawString(WatermarkText, font, brush, f);
}
return true;
}
#region IDisposable 成员
public override void Dispose()
{
Font.Dispose();
base.Dispose();
}
#endregion
}
}
下面是对文字型水印的测试:
default.aspx内容如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
水印文字:<asp:TextBox ID="watermarkTextBox" runat="server"></asp:TextBox><br />
选择上传图片:<asp:FileUpload ID="FileUpload1" runat="server" Width="189px" />
<br />
<asp:Button ID="uploadFileBtn" runat="server" Text="上传图片并且加文字水印"
onclick="uploadFileBtn_Click" />
<br />加了水印的图像如下:
<asp:Image ID="image" runat="server" />
</div>
</form>
</body>
</html>
default.aspx.cs代码如下:
using System;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Juice.Common.Drawing;
using System.Web.Hosting;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void uploadFileBtn_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.watermarkTextBox.Text))
return;
if (FileUpload1.HasFile)
{
string contentType = FileUpload1.PostedFile.ContentType;
if (contentType.StartsWith("image/"))
{
string filePath = Server.MapPath(string.Format("~/{0}", FileUpload1.FileName));
///保存文件
FileUpload1.SaveAs(filePath);
///加水印
this.AddWatermark(filePath, this.watermarkTextBox.Text);
image.ImageUrl = string.Format("~/{0}", FileUpload1.PostedFile.FileName);
}
}
}
/// <summary>
/// 添加水印
/// </summary>
/// <param name="filePath"></param>
/// <param name="watermaterText"></param>
private void AddWatermark(string filePath, string watermaterText)
{
, watermaterText))
{
painter.FontColor = System.Drawing.Color.DarkGreen;
painter.PaintWaterMark();
}
}
}
摘自:http://hi.baidu.com/bopdawpdarbenxq/item/419b367ee84445285d17895d
ps:如果想用的话,完全可以简写,就两个方法。但面向对象开发,有一特性就是:增加代码的复用。这段代码中保存图片时,应用了临时文件做中转,方法比较好。临时文件里保存着加水印图片的数据,删除原文件后,把临时文件里的数据保存到被删除图片的路径下,这样加了水印的图片就会替换没有加了水印的图片,这时程序运行完后,临时文件会被删除。当构造函数ReplaceRawImage改成false时,会发现临时文件没有被删除。
在图片上画公司的标识
ImageWatermarkPainter类
前台:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
水印文字:<asp:TextBox ID="watermarkTextBox" runat="server"></asp:TextBox><br />
选择上传图片:<asp:FileUpload ID="FileUpload1" runat="server" Width="189px" />
<br />
<asp:Button ID="uploadFileBtn" runat="server" Text="上传图片并且加文字水印"
onclick="uploadFileBtn_Click" />
<asp:Button ID="uploadAndAddImageBtn" runat="server" Text="上传图片并且添加半透明的图片水印"
onclick="uploadAndAddImageBtn_Click" />
<br />加了水印的图像如下:
<asp:Image ID="image" runat="server" />
</div>
</form>
</body>
</html>
页面后台代码
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void uploadFileBtn_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.watermarkTextBox.Text))
return;
if (FileUpload1.HasFile)
{
string contentType = FileUpload1.PostedFile.ContentType;
if (contentType.StartsWith("image/"))
{
string filePath = Server.MapPath(string.Format("~/{0}", Server.HtmlEncode(FileUpload1.PostedFile.FileName)));
///保存文件
FileUpload1.SaveAs(filePath);
///加水印
this.AddWatermark(filePath, this.watermarkTextBox.Text);
image.ImageUrl = string.Format("~/{0}", Server.HtmlEncode(FileUpload1.PostedFile.FileName));
}
}
}
/// <summary>
/// 添加水印
/// </summary>
/// <param name="filePath"></param>
/// <param name="watermaterText"></param>
private void AddWatermark(string filePath, string watermaterText)
{
, watermaterText))
{
painter.FontColor = System.Drawing.Color.DarkGreen;
painter.PaintWaterMark();
}
}
protected void uploadAndAddImageBtn_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
string contentType = FileUpload1.PostedFile.ContentType;
if (contentType.StartsWith("image/"))
{
string filePath = Server.MapPath(string.Format("~/{0}", Server.HtmlEncode(FileUpload1.PostedFile.FileName)));
///保存文件
FileUpload1.SaveAs(filePath);
///加水印
this.AddImageWatermark(filePath);
image.ImageUrl = string.Format("~/{0}", Server.HtmlEncode(FileUpload1.PostedFile.FileName));
}
}
}
/// <summary>
/// 添加图片水印
/// </summary>
/// <param name="filePath"></param>
private void AddImageWatermark(string filePath)
{
, Server.MapPath("~/watermark.gif")))
{
painter.PaintWaterMark();
}
}
}
View Cod
ps:在WatermarkPainter painter = new ImageWatermarkPainter(filePath, 180, Server.MapPath("~/watermark.gif")))处可以修改gif图片。
当然此方也可以用来合并两张图片。摘自:http://hi.baidu.com/bopdawpdarbenxq/item/d42103b3568f22a4ebba9341
Asp.net 上传图片添加半透明图片或者文字水印的方法的更多相关文章
- PHP给图片加文字水印
<?php /*给图片加文字水印的方法*/ $dst_path = 'http://f4.topitme.com/4/15/11/1166351597fe111154l.jpg'; $dst = ...
- javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- Java图片加文字水印
Java图片加文字水印 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.I ...
- C#给图片加文字水印
public class TxtWaterMark { public enum WaterPositionMode { LeftTop,//左上 LeftBottom,//左下 RightTop,// ...
- php给图片加入文字水印
PHP对图片的操作用到GD库.这里我们介绍怎样给图片加入文字水印. 大致分为四步: 1.打开图片 2.操作图片 3.输出图片 4.销毁图片 以下我们上代码来详细解说每步的实现过程: <? php ...
- PHP图片加文字水印和图片水印方法
文字水印 $dst_path = 'dst.jpg'; //创建图片的实例$dst = imagecreatefromstring(file_get_contents($dst_path)); //打 ...
- iOS中用UIWebView的loadHTMLString后图片和文字失调解决方法
iOS中用UIWebView的loadHTMLString后图片和文字失调,图片过大,超过屏幕,文字太小.或者图片太小.文字太大,总之就是不协调. 我们的需求是让图片的大小跟着屏幕的变化而变化.就是动 ...
- ASP.NET 上传图片添加文字、Logo水印
http://www.cnblogs.com/xvqm00/archive/2010/06/22/1762783.html
- PHP图片加文字水印和图片水印方法(鉴于李老师博客因没加水印被盗,特搜集的办法。希望能有用!)
$dst_path = 'dst.jpg'; //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dst_path)); //打上文字 ...
随机推荐
- linux下配置tomcat7 + solr4.9(续)--- 多核索引的配置
在上一篇文章中(详见http://www.cnblogs.com/bxljoy/p/3850263.html),我们已经介绍了tomcat+solr的索引服务器的配置,但是文中创建的服务器只能支持存储 ...
- c#读写注册表示例分享
c#读写注册表示例,示例中有详细注释. 代码: //写注册表RegistryKey regWrite;//往HKEY_CURRENT_USER主键里的Software子键下写一个名为“Test”的子键 ...
- Oracle内存管理理论篇二
目标 了解oracle内存管理方式 掌握ASMM管理方式 掌握AMM管理方式 监控内存使用 学习一个知识点时,最好先了解其历史.ORACLE近期的版本都对内存管理做了简化,从9i通过PGA_AGGRE ...
- python学习第六天
一. 模块介绍1. 模块的定义:用一堆代码实现了某个功能的代码集合 包的定义:本质就是一个目录(必须导游一个_init_.py文件),是用来从逻辑上组织模块的.2. 需要多个函数才能完成(函数 ...
- openerp经典收藏 深入理解工作流(Workflow)(转载)
深入理解工作流(Workflow) 原文:http://shine-it.net/index.php/topic,2494.0.html 一.工作流定义:<?xml version=" ...
- nginx搭建流媒体服务器的方法详解
一.FLV视频发布方式简介 FLV视频有两总发布方式 1. HTTP方式 这种方式要下载FLV视频文件到本地播放,一旦FLV视频文件下载完成,就不会消耗服务器的资源和带宽,但是拖动功能没有RTM ...
- parameter和argument的区别
根据网上一些资料,对parameter和argument的区别,做如下的简单说明.1. parameter是指函数定义中参数,而argument指的是函数调用时的实际参数.2. 简略描述为:param ...
- Visual Studio
1.必备神器http://www.cnblogs.com/stoneniqiu/p/3488546.html 2.常用快捷键http://www.cnblogs.com/TankXiao/p/3468 ...
- 第三章 DispatcherServlet详解
3.1.DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring Io ...
- 标签跳转break和continue
标签是后面跟有冒号的标识符,例如 label1: 在java中,标签起作用的唯一的地方刚好是在迭代语句之前. “刚好之前”的意思表明,在标签和迭代之间置入热和语句都不好. 而在迭代之前设置标签的唯一 ...