主要用到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 上传图片添加半透明图片或者文字水印的方法的更多相关文章

  1. PHP给图片加文字水印

    <?php /*给图片加文字水印的方法*/ $dst_path = 'http://f4.topitme.com/4/15/11/1166351597fe111154l.jpg'; $dst = ...

  2. javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  3. Java图片加文字水印

    Java图片加文字水印 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.I ...

  4. C#给图片加文字水印

    public class TxtWaterMark { public enum WaterPositionMode { LeftTop,//左上 LeftBottom,//左下 RightTop,// ...

  5. php给图片加入文字水印

    PHP对图片的操作用到GD库.这里我们介绍怎样给图片加入文字水印. 大致分为四步: 1.打开图片 2.操作图片 3.输出图片 4.销毁图片 以下我们上代码来详细解说每步的实现过程: <? php ...

  6. PHP图片加文字水印和图片水印方法

    文字水印 $dst_path = 'dst.jpg'; //创建图片的实例$dst = imagecreatefromstring(file_get_contents($dst_path)); //打 ...

  7. iOS中用UIWebView的loadHTMLString后图片和文字失调解决方法

    iOS中用UIWebView的loadHTMLString后图片和文字失调,图片过大,超过屏幕,文字太小.或者图片太小.文字太大,总之就是不协调. 我们的需求是让图片的大小跟着屏幕的变化而变化.就是动 ...

  8. ASP.NET 上传图片添加文字、Logo水印

    http://www.cnblogs.com/xvqm00/archive/2010/06/22/1762783.html

  9. PHP图片加文字水印和图片水印方法(鉴于李老师博客因没加水印被盗,特搜集的办法。希望能有用!)

    $dst_path = 'dst.jpg'; //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dst_path)); //打上文字 ...

随机推荐

  1. L014-oldboy-mysql-dba-lesson14

          L014-oldboy-mysql-dba-lesson14             来自为知笔记(Wiz) 附件列表

  2. VIM小技巧之文件名补全

    恩,这两天在看<简明Python教程>,那里面作者建议写代码的时候前面的注释写上文件名,写上调用的解释器,比如这样: 恩,然后我当然不可能每回新建一个文件,就要在开头写上一大串东西啊,vi ...

  3. SequoiaDB数据库集群部署

    一般在多机环境下部署数据库的集群模式是比较繁琐的,下面我来分享一个如何通过shell脚本的方式简单.方便地部署我们的集群. 首先,我们要给机器配置信任关系,这样我们就无需手动的输入密码来执行ssh和s ...

  4. 冒泡排序(Bubble Sort)

    常见的排序算法有Bubble Sort.Merge Sort.Quick Sort 等,所有排序算的基本法思想都是把一个无限大的数据规模通过算法一步步缩小,指导最后完成排序. 这里分享一下Buuble ...

  5. 关于iOS6应用中第三方类库不支持armv7s的问题解决

    今天编译ios6+cocos2d v2 .1 beta2制作的游戏,出现下面的错误: ld: file is universal (3 slices) but does not contain a(n ...

  6. 下拉刷新--第三方开源--PullToRefresh

    效果预览图: 下载地址:https://github.com/chrisbanes/Android-PullToRefresh activity_main.xml: <RelativeLayou ...

  7. 1105. Spiral Matrix (25)

    This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasi ...

  8. PAT乙级真题1016.部分A+B(15)(2016-4-28)

    原题: 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA ...

  9. Java方法重载

    Java允许一个类中定义多个方法,只要参数列表不同就行了.如果同一个类中包含了两个或者两个以上的方法的方法名相同,但形参列表不同,则被称为方法重载. /* 参数类型不同的重载 */ public cl ...

  10. linux总线、设备和设备驱动的关系

    之一:bus_type 总线是处理器和一个或多个设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟"platform"总线.可以通过ls -l /sys/bu ...