zoukankan      html  css  js  c++  java
  • 不错.net图片水印类

    using System;
     using System.Drawing;
    using System.Drawing.Imaging;
     using System.IO;
     using System.Drawing.Drawing2D;

     namespace JillZhang
     {
      /// <summary>
      /// 给图片添加水印得类得描述
     /// </summary>
      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;   
       }   
     }
      
     }
    }

     
     

  • 相关阅读:
    1509 -- Glass Beads POJ
    1043: [HAOI2008]下落的圆盘
    面向对象的特性一:封装性
    java的值传递机制
    可变参数的形参方法
    方法的重载
    类及对象
    面向对象
    数组的常用算法问题
    数组的常见异常
  • 原文地址:https://www.cnblogs.com/yeye518/p/2231689.html
Copyright © 2011-2022 走看看