• 转:图片水印 http://www.cnblogs.com/xiaoge_com/archive/2009/09/10/1564216.html


    WatermarkPainter类如下:

    /* ***********************************************
    * Author:          1987raymond
    * Team:            Juice Sharing
    * Created Time:    2009-3-11 13:33:13
    * CopyRight:       Juice Sharing 团队版权所有 保留一切权利
    * NameSpace:       Juice.Common.Drawing
    * Class/Interface: 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
                {
                    if (m_WatermarkAlpha > 255)
                        m_WatermarkAlpha = 255;
                    else if (m_WatermarkAlpha < 0)
                        m_WatermarkAlpha = 0;
                    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, 0, 0, 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类

    /* ***********************************************
    * Author:          1987raymond
    * Team:            Juice Sharing
    * Created Time:    2009-3-11 15:15:16
    * CopyRight:       Juice Sharing 团队版权所有 保留一切权利
    * NameSpace:       Juice.Common.Drawing
    * Class/Interface: 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 = new Font("Arial Black", 14, 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 - 100;
                    f.Y = newImage.Height - Font.Height;
                    if (f.X < 0)
                    {
                        ///自动调整字体的大小
                        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.PostedFile.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)
        {
            using (TextWatermarkPainter painter = new TextWatermarkPainter(filePath, 80, watermaterText))
            {
                painter.FontColor = System.Drawing.Color.DarkGreen;
                painter.PaintWaterMark();
            }

        }
    }

  • 相关阅读:
    Intellij Idea 创建Web项目入门
    使用swagger作为restful api的doc文档生成
    SpringMVC中的参数绑定总结
    Spring注解@Resource和@Autowired区别对比
    java的(PO,VO,TO,BO,DAO,POJO)解释
    java有几种对象(PO,VO,DAO,BO,POJO)
    clone项目到本地
    修改虚拟机上Linux系统的IP地址
    虚拟机下CentOS 6.5配置IP地址的三种方法
    系统重启
  • 原文地址:https://www.cnblogs.com/qxw0816/p/1564243.html
Copyright © 2020-2023  润新知