NET GDI+ 给图片添加水印

来源:互联网 发布:joo yeon seo 编辑:程序博客网 时间:2024/05/16 14:00
using System;using System.Drawing;using System.Drawing.Imaging;using System.Drawing.Drawing2D;public class ImageWaterMark{    /// <summary>    /// 图片水印    /// 如: ImageWaterMark.AddImageSignPic(System.Drawing.Image.FromFile(System.Web.HttpContext.Current.Server.MapPath("~/UpLoadFile/") + "原图.jpg"),    ///        System.Web.HttpContext.Current.Server.MapPath("~/UpLoadFile/") + "新生成带水印的图.jpg",    ///       System.Web.HttpContext.Current.Server.MapPath("~/UpLoadFile/") + "水印.png", 3, 80, 6);    /// </summary>    /// <param name="img">图片</param>    /// <param name="filename">保存文件名</param>    /// <param name="watermarkFilename">水印文件名</param>    /// <param name="watermarkStatus">图片水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中  9=右下</param>    /// <param name="quality">附加水印图片质量,0-100</param>    /// <param name="watermarkTransparency">水印的透明度 1--10 10为不透明</param>    public static void AddImageSignPic(Image img, string filename, string watermarkFilename, int watermarkStatus, int quality, int watermarkTransparency)    {        Graphics g = Graphics.FromImage(img);        //设置高质量插值法        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;        //设置高质量,低速度呈现平滑程度        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;        Image watermark = new Bitmap(watermarkFilename);        if (watermark.Height >= img.Height || watermark.Width >= img.Width)        {            return;        }        ImageAttributes imageAttributes = new ImageAttributes();        ColorMap colorMap = new ColorMap();        colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);        colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);        ColorMap[] remapTable = { colorMap };        imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);        float transparency = 0.5F;        if (watermarkTransparency >= 1 && watermarkTransparency <= 10)        {            transparency = (watermarkTransparency / 10.0F);        }        float[][] colorMatrixElements = {                                                new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f},                                                new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f},                                                new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f},                                                new float[] {0.0f,  0.0f,  0.0f,  transparency, 0.0f},                                                new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}                                            };        ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);        imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);        int xpos = 0;        int ypos = 0;        switch (watermarkStatus)        {            case 1:                xpos = (int)(img.Width * (float).01);                ypos = (int)(img.Height * (float).01);                break;            case 2:                xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));                ypos = (int)(img.Height * (float).01);                break;            case 3:                xpos = (int)((img.Width * (float).99) - (watermark.Width));                ypos = (int)(img.Height * (float).01);                break;            case 4:                xpos = (int)(img.Width * (float).01);                ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));                break;            case 5:                xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));                ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));                break;            case 6:                xpos = (int)((img.Width * (float).99) - (watermark.Width));                ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));                break;            case 7:                xpos = (int)(img.Width * (float).01);                ypos = (int)((img.Height * (float).99) - watermark.Height);                break;            case 8:                xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));                ypos = (int)((img.Height * (float).99) - watermark.Height);                break;            case 9:                xpos = (int)((img.Width * (float).99) - (watermark.Width));                ypos = (int)((img.Height * (float).99) - watermark.Height);                break;        }        g.DrawImage(watermark, new Rectangle(xpos, ypos, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);        //g.DrawImage(watermark, new System.Drawing.Rectangle(xpos, ypos, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, System.Drawing.GraphicsUnit.Pixel);        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();        ImageCodecInfo ici = null;        foreach (ImageCodecInfo codec in codecs)        {            if (codec.MimeType.IndexOf("jpeg") > -1)            {                ici = codec;            }        }        EncoderParameters encoderParams = new EncoderParameters();        long[] qualityParam = new long[1];        if (quality < 0 || quality > 100)        {            quality = 80;        }        qualityParam[0] = quality;        EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);        encoderParams.Param[0] = encoderParam;        if (ici != null)        {            img.Save(filename, ici, encoderParams);        }        else        {            img.Save(filename);        }        g.Dispose();        img.Dispose();        watermark.Dispose();        imageAttributes.Dispose();    }    /// <summary>    /// 文字水印    /// 如:ImageWaterMark.AddImageSignText(System.Drawing.Image.FromFile(System.Web.HttpContext.Current.Server.MapPath("~/UpLoadFile/") + "原图.jpg"),    ///    System.Web.HttpContext.Current.Server.MapPath("~/UpLoadFile/") + "新生成的文字水印图片.jpg", "水印测试", 3, 100, "宋体", 12);    /// </summary>    /// <param name="img">图片</param>    /// <param name="filename">保存文件名</param>    /// <param name="watermarkText">水印文字</param>    /// <param name="watermarkStatus">图片水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中  9=右下</param>    /// <param name="quality">附加水印图片质量,0-100</param>    /// <param name="fontname">字体</param>    /// <param name="fontsize">字体大小</param>    public static void AddImageSignText(Image img, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize)    {        Graphics g = Graphics.FromImage(img);        Font drawFont = new Font(fontname, fontsize, FontStyle.Regular, GraphicsUnit.Pixel);        SizeF crSize;        crSize = g.MeasureString(watermarkText, drawFont);        float xpos = 0;        float ypos = 0;        switch (watermarkStatus)        {            case 1:                xpos = (float)img.Width * (float).01;                ypos = (float)img.Height * (float).01;                break;            case 2:                xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);                ypos = (float)img.Height * (float).01;                break;            case 3:                xpos = ((float)img.Width * (float).99) - crSize.Width;                ypos = (float)img.Height * (float).01;                break;            case 4:                xpos = (float)img.Width * (float).01;                ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);                break;            case 5:                xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);                ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);                break;            case 6:                xpos = ((float)img.Width * (float).99) - crSize.Width;                ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);                break;            case 7:                xpos = (float)img.Width * (float).01;                ypos = ((float)img.Height * (float).99) - crSize.Height;                break;            case 8:                xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);                ypos = ((float)img.Height * (float).99) - crSize.Height;                break;            case 9:                xpos = ((float)img.Width * (float).99) - crSize.Width;                ypos = ((float)img.Height * (float).99) - crSize.Height;                break;        }        g.DrawString(watermarkText, drawFont, new SolidBrush(Color.White), xpos + 1, ypos + 1);        g.DrawString(watermarkText, drawFont, new SolidBrush(Color.Black), xpos, ypos);        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();        ImageCodecInfo ici = null;        foreach (ImageCodecInfo codec in codecs)        {            if (codec.MimeType.IndexOf("jpeg") > -1)            {                ici = codec;            }        }        EncoderParameters encoderParams = new EncoderParameters();        long[] qualityParam = new long[1];        if (quality < 0 || quality > 100)        {            quality = 80;        }        qualityParam[0] = quality;        EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);        encoderParams.Param[0] = encoderParam;        if (ici != null)        {            img.Save(filename, ici, encoderParams);        }        else        {            img.Save(filename);        }        g.Dispose();        //bmp.Dispose();        img.Dispose();    }}


原创粉丝点击