asp.net如何在图片上加水印文字

来源:互联网 发布:管理科学就业前景知乎 编辑:程序博客网 时间:2024/04/29 02:08

为了保证网站图片的版权性和网络推广的可能性,有的客户可能需要在网站的图片上加上公司名称的水印。下面的代码就是介绍如何在图片上加上水印文字。

 

第一步,添加一个一般处理程序(Handler),本例是ImageHandler

using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Net.Mime;using System.IO;using System.Drawing;using System.Drawing.Imaging;using System.Drawing.Drawing2D;/// <summary>/// Summary description for ImageHandler/// </summary>public class ImageHandler : IHttpHandler{    public ImageHandler()    {    }    public string GetContentType(String path)    {        switch (Path.GetExtension(path))        {            case ".bmp": return "Image/bmp";            case ".gif": return "Image/gif";            case ".jpg": return "Image/jpeg";            case ".png": return "Image/png";            default: break;        }        return String.Empty;    }    public ImageFormat GetImageFormat(String path)    {        switch (Path.GetExtension(path).ToLower())        {            case ".bmp": return ImageFormat.Bmp;            case ".gif": return ImageFormat.Gif;            case ".jpg": return ImageFormat.Jpeg;            case ".png": return ImageFormat.Png;            default: return null;        }    }    protected byte[] WatermarkImage(HttpContext context)    {        byte[] imageBytes = null;        if (File.Exists(context.Request.PhysicalPath))        {            // Normally you'd put this in a config file somewhere.            string watermark = "世复检测";            Image image = Image.FromFile(context.Request.PhysicalPath);            Graphics graphic;            if (image.PixelFormat != PixelFormat.Indexed && image.PixelFormat != PixelFormat.Format8bppIndexed && image.PixelFormat != PixelFormat.Format4bppIndexed && image.PixelFormat != PixelFormat.Format1bppIndexed)            {                // Graphic is not a Indexed (GIF) image                graphic = Graphics.FromImage(image);            }            else            {                /* Cannot create a graphics object from an indexed (GIF) image.                  * So we're going to copy the image into a new bitmap so                  * we can work with it. */                Bitmap indexedImage = new Bitmap(image);                graphic = Graphics.FromImage(indexedImage);                // Draw the contents of the original bitmap onto the new bitmap.                 graphic.DrawImage(image, 0, 0, image.Width, image.Height);                image = indexedImage;            }            graphic.SmoothingMode = SmoothingMode.AntiAlias & SmoothingMode.HighQuality;            Font myFont = new Font("Arial", 15);            SolidBrush brush = new SolidBrush(Color.FromArgb(255, Color.Red));            /* This gets the size of the graphic so we can determine              * the loop counts and placement of the watermarked text. */            SizeF textSize = graphic.MeasureString(watermark, myFont);            //// Write the text across the image.             //for (int y = 0; y < image.Height; y++)            //{            //    for (int x = 0; x < image.Width; x++)            //    {            //        PointF pointF = new PointF(x, y);            //        graphic.DrawString(watermark, myFont, brush, pointF);            //        x += Convert.ToInt32(textSize.Width);            //    }            //    y += Convert.ToInt32(textSize.Height);            //}            // Write the text at the right bottom of the image.             for (int y = image.Height-25; y < image.Height; y++)            {                for (int x = image.Width-100; x < image.Width; x++)                {                    PointF pointF = new PointF(x, y);                    graphic.DrawString(watermark, myFont, brush, pointF);                    x += Convert.ToInt32(textSize.Width);                }                y += Convert.ToInt32(textSize.Height);            }            using (MemoryStream memoryStream = new MemoryStream())            {                image.Save(memoryStream, GetImageFormat(context.Request.PhysicalPath));                imageBytes = memoryStream.ToArray();            }        }        return imageBytes;    }    #region IHttpHandler Members    public bool IsReusable    {        get { return false; }    }    public void ProcessRequest(HttpContext context)    {        context.Response.Clear();        context.Response.ContentType = GetContentType(context.Request.PhysicalPath);        byte[] imageBytes = WatermarkImage(context);        if (imageBytes != null)        {            context.Response.OutputStream.Write(imageBytes, 0, imageBytes.Length);        }        else        {            // No bytes = no image which equals NO FILE.                // Therefore send a 404 - not found response.             context.Response.StatusCode = 404;        }        context.Response.End();    }    #endregion}


第二步,在web.config里添加如下代码:

    <httpHandlers>      <!--<add verb="GET" type="ImageHandler" path="*.jpg,*.png,*.gif,*.bmp"/>-->      <add verb="GET" type="ImageHandler" path="Uploads/*/*.jpg"/>          </httpHandlers>


第三步,调试在每一个图片的右下角显示红色的“世复检测”四个字。

0 0
原创粉丝点击