zoukankan      html  css  js  c++  java
  • 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
                {
                    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 (!System.IO.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 (System.IO.File.Exists(ImageToBePainted))
                        System.IO.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 = 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();
            }

        }
    }

  • 相关阅读:
    WebService发布服务例子
    webservice调用天气服务
    java.lang.IllegalArgumentException: java.util.zip.ZipException: invalid LOC header (bad signature)异常解决方法
    newSingleThreadScheduledExecutor连续关闭造成 java.util.concurrent.RejectedExecutionException
    自定义栈Stack 和 队列Queue
    log4j笔记----输出格式
    「newbee-mall新蜂商城开源啦」SpringBoot+MyBatis开发JavaWeb线上商城项目
    十三的博文作品
    Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简述及技术选型介绍
    「newbee-mall新蜂商城开源啦」 前后端分离的 Vue 版本即将开源
  • 原文地址:https://www.cnblogs.com/bicabo/p/1438039.html
Copyright © 2011-2022 走看看