Sampson-Li
Sampson.Li学习经验总结博客 学历代表过去,能力代表现在.学习力代表未来!
//简单使用的水印类. 

public class WaterMark

    {
        private bool _textMark = false;
        private bool _imgMark = false;
        private string _text = "";
        private string _imgPath = "";
        private int _markX = 0;
        private int _markY = 0;
        private float _transparency = 1;
        private string _fontFamily = "宋体";
        private Color _textColor = Color.Black;
        private bool _textbold = false;
        int[] sizes = new int[] { 48, 32, 16, 8, 6, 4 };
        /// <summary>
        /// 实例化一个水印类
        /// </summary>
        public WaterMark()
        {
        }
        /// <summary>
        /// 初始化一个只添加文字水印得实例
        /// </summary>
        /// <param name="text">水印文字</param>
        /// <param name="fontFamily">文字字体</param>
        /// <param name="bold">是否粗体</param>
        /// <param name="color">字体颜色</param>
        /// <param name="markX">标记位置横坐标</param>
        /// <param name="markY">标记位置纵坐标</param>
        public WaterMark(string text, string fontFamily, bool bold, Color color, int markX, int markY)
        {
            this._imgMark = false;
            this._textMark = true;
            this._text = text;
            this._fontFamily = fontFamily;
            this._textbold = bold;
            this._textColor = color;
            this._markX = markX;
            this._markY = MarkY;
        }
        /// <summary>
        /// 实例化一个只添加图片水印得实例
        /// </summary>
        /// <param name="imagePath">水印图片路径</param>
        /// <param name="tranparence">透明度</param>
        /// <param name="markX">标记位置横坐标</param>
        /// <param name="markY">标记位置纵坐标</param>
        public WaterMark(string imagePath, float tranparence, int markX, int markY)
        {
            this._textMark = false;
            this._imgMark = true;
            this._imgPath = imagePath;
            this._markX = markX;
            this._markY = MarkY;
            this._transparency = tranparence;
        }
        /// <summary>
        /// 是否添加文字水印
        /// </summary>
        public bool TextMark
        {
            get { return _textMark; }
            set { _textMark = value; }
        }
        /// <summary>
        /// 是否添加图片水印
        /// </summary>
        public bool ImageMark
        {
            get { return _imgMark; }
            set { _imgMark = value; }
        }
        /// <summary>
        /// 文字水印得内容
        /// </summary>
        public string Text
        {
            get { return _text; }
            set { _text = value; }
        }
        /// <summary>
        /// 图片水印得图片地址
        /// </summary>
        public string ImagePath
        {
            get { return _imgPath; }
            set { _imgPath = value; }
        }
        /// <summary>
        /// 添加水印位置得横坐标
        /// </summary>
        public int MarkX
        {
            get { return _markX; }
            set { _markX = value; }
        }
        /// <summary>
        /// 添加水印位置得纵坐标
        /// </summary>
        public int MarkY
        {
            get { return _markY; }
            set { _markY = value; }
        }
        /// <summary>
        /// 水印得透明度
        /// </summary>
        public float Transparency
        {
            get
            {
                if (_transparency > 1.0f)
                {
                    _transparency = 1.0f;
                }
                return _transparency;
            }
            set { _transparency = value; }
        }
        /// <summary>
        /// 水印文字得颜色
        /// </summary>
        public Color TextColor
        {
            get { return _textColor; }
            set { _textColor = value; }
        }
        /// <summary>
        /// 水印文字得字体
        /// </summary>
        public string TextFontFamily
        {
            get { return _fontFamily; }
            set { _fontFamily = value; }
        }
        /// <summary>
        /// 水印文字是否加粗
        /// </summary>
        public bool Bold
        {
            get { return _textbold; }
            set { _textbold = value; }
        }
        /// <summary>
        /// 添加水印,此方法适用于gif格式得图片
        /// </summary>
        /// <param name="image">需要添加水印得图片</param>
        /// <returns>添加水印之后得图片</returns>
        public Image Mark(Image img)
        {
            try
            {
                //添加文字水印
                if (this.TextMark)
                {
                    //根据源图片生成新的Bitmap对象作为作图区,为了给gif图片添加水印,才有此周折
                    Bitmap newBitmap = new Bitmap(img.Width, img.Height, PixelFormat.Format24bppRgb);
                    //设置新建位图得分辨率
                    newBitmap.SetResolution(img.HorizontalResolution, img.VerticalResolution);
                    //创建Graphics对象,以对该位图进行操作
                    Graphics g = Graphics.FromImage(newBitmap);
                    //消除锯齿
                    g.SmoothingMode = SmoothingMode.AntiAlias;
                    //将原图拷贝到作图区
                    g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
                    //声明字体对象
                    Font cFont = null;
                    //用来测试水印文本长度得尺子
                    SizeF size = new SizeF();
                    //探测出一个适合图片大小得字体大小,以适应水印文字大小得自适应
                    for (int i = 0; i < 6; i++)
                    {
                        //创建一个字体对象
                        cFont = new Font(this.TextFontFamily, sizes[i]);
                        //是否加粗
                        if (!this.Bold)
                        {
                            cFont = new Font(this.TextFontFamily, sizes[i], FontStyle.Regular);
                        }
                        else
                        {
                            cFont = new Font(this.TextFontFamily, sizes[i], FontStyle.Bold);
                        }
                        //测量文本大小
                        size = g.MeasureString(this.Text, cFont);
                        //匹配第一个符合要求得字体大小
                        if ((ushort)size.Width < (ushort)img.Width)
                        {
                            break;
                        }
                    }
                    //创建刷子对象,准备给图片写上文字
                    Brush brush = new SolidBrush(this.TextColor);
                    //在指定得位置写上文字
                    g.DrawString(this.Text, cFont, brush, this.MarkX, this.MarkY);
                    //释放Graphics对象
                    g.Dispose();
                    //将生成得图片读入MemoryStream
                    System.IO.MemoryStream ms = new System.IO.MemoryStream();
                    newBitmap.Save(ms, ImageFormat.Jpeg);
                    //重新生成Image对象
                    img = System.Drawing.Image.FromStream(ms);
                    //返回新的Image对象
                    return img;
                }
                //添加图像水印
                if (this.ImageMark)
                {
                    //获得水印图像
                    Image markImg = Image.FromFile(this.ImagePath);
                    //创建颜色矩阵
                    float[][] ptsArray ={ 
          new float[] {1, 0, 0, 0, 0},
          new float[] {0, 1, 0, 0, 0},
           new float[] {0, 0, 1, 0, 0},
          new float[] {0, 0, 0, this.Transparency, 0}, //注意:此处为0.0f为完全透明,1.0f为完全不透明
          new float[] {0, 0, 0, 0, 1}};
                    ColorMatrix colorMatrix = new ColorMatrix(ptsArray);
                    //新建一个Image属性
                    ImageAttributes imageAttributes = new ImageAttributes();
                    //将颜色矩阵添加到属性
                    imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default,
                     ColorAdjustType.Default);
                    //生成位图作图区
                    Bitmap newBitmap = new Bitmap(img.Width, img.Height, PixelFormat.Format24bppRgb);
                    //设置分辨率
                    newBitmap.SetResolution(img.HorizontalResolution, img.VerticalResolution);
                    //创建Graphics
                    Graphics g = Graphics.FromImage(newBitmap);
                    //消除锯齿
                    g.SmoothingMode = SmoothingMode.AntiAlias;
                    //拷贝原图到作图区
                    g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
                    //如果原图过小
                    if (markImg.Width > img.Width || markImg.Height > img.Height)
                    {
                        System.Drawing.Image.GetThumbnailImageAbort callb = null;
                        //对水印图片生成缩略图,缩小到原图得1/4
                        System.Drawing.Image new_img = markImg.GetThumbnailImage(img.Width / 4, markImg.Height * img.Width / markImg.Width, callb, new System.IntPtr());
                        //添加水印
                        g.DrawImage(new_img, new Rectangle(this.MarkX, this.MarkY, new_img.Width, new_img.Height), 0, 0, new_img.Width, new_img.Height, GraphicsUnit.Pixel, imageAttributes);
                        //释放缩略图
                        new_img.Dispose();
                        //释放Graphics
                        g.Dispose();
                        //将生成得图片读入MemoryStream
                        System.IO.MemoryStream ms = new System.IO.MemoryStream();
                        newBitmap.Save(ms, ImageFormat.Jpeg);
                        //返回新的Image对象
                        img = Image.FromStream(ms);
                        return img;
                    }
                    //原图足够大
                    else
                    {
                        //添加水印
                        g.DrawImage(markImg, new Rectangle(this.MarkX, this.MarkY, markImg.Width, markImg.Height), 0, 0, markImg.Width, markImg.Height, GraphicsUnit.Pixel, imageAttributes);
                        //释放Graphics
                        g.Dispose();
                        //将生成得图片读入MemoryStream
                        System.IO.MemoryStream ms = new System.IO.MemoryStream();
                        newBitmap.Save(ms, ImageFormat.Jpeg);
                        //返回新的Image对象
                        img = Image.FromStream(ms);
                        return img;
                    }
                }
                return img;
            }
            catch
            {
                return img;
            }
        }
    }
posted on 2011-11-07 11:53  Sampson  阅读(296)  评论(0编辑  收藏  举报