图片处理类,自动加水印

  1. using System;
  2. using System.IO;
  3. using System.Collections;
  4. using System.Drawing;
  5. using System.Drawing.Drawing2D;
  6. using System.Drawing.Imaging; 
  7. namespace dog
  8. {
  9.     public enum MarkType
  10.     {
  11.         Text,Image
  12.     }
  13.     public enum ImagePosition
  14.     {
  15.         /// <summary>
  16.         /// 左上角
  17.         /// </summary>
  18.         WMP_Left_Top,
  19.         /// <summary>
  20.         /// 左下角
  21.         /// </summary>
  22.         WMP_Left_Bottom,
  23.         /// <summary>
  24.         /// 右上角
  25.         /// </summary>
  26.         WMP_Right_Top,
  27.         /// <summary>
  28.         /// 右下角
  29.         /// </summary>
  30.         WMP_Right_Bottom,
  31.         /// <summary>
  32.         /// 中间
  33.         /// </summary>
  34.         WMP_Center
  35.         
  36.     };
  37.     /**//// <summary>
  38.     /// 给图片添加水印得类得描述
  39.     /// </summary>
  40.     public class WaterMark
  41.     {
  42.         //---------------------成员变量---------------------#region ---------------------成员变量---------------------        
  43.         private string _text="";
  44.         private string _imgPath="";
  45.         private int _markX=0;
  46.         private int _markY=0;
  47.         private float _transparency=1;
  48.         private string _fontFamily="宋体";
  49.         private Color _textColor=Color.Black;
  50.         private bool _textbold=false;
  51.         int[] sizes=new int[]{72,64,48,32,24,16,8,6,4,2,1};
  52.         private Image _image=null;
  53.         private Image _markedIamge=null;
  54.         private MarkType _markType=MarkType.Text;
  55.         private ImagePosition _ImagePosition=ImagePosition.WMP_Center; 
  56.         #region
  57.         /// <summary>
  58.         /// 实例化一个水印类
  59.         /// </summary>
  60.         public WaterMark()
  61.         {
  62.             
  63.         }
  64.         /**//// <summary>
  65.         /// 初始化一个只添加文字水印得实例
  66.         /// </summary>
  67.         /// <param name="text">水印文字</param>
  68.         /// <param name="fontFamily">文字字体</param>
  69.         /// <param name="bold">是否粗体</param>
  70.         /// <param name="color">字体颜色</param>
  71.         /// <param name="markX">标记位置横坐标</param>
  72.         /// <param name="markY">标记位置纵坐标</param>
  73.         public WaterMark(string text,string fontFamily,bool bold,Color color,int markX,int markY)
  74.         {    
  75.             this._markType=MarkType.Text;
  76.             this._text=text;
  77.             this._fontFamily=fontFamily;
  78.             this._textbold=bold;
  79.             this._textColor=color;
  80.             this._markX=markX;
  81.             this._markY=MarkY;
  82.             this.Mark();
  83.         }
  84.         /**//// <summary>
  85.         /// 实例化一个只添加图片水印得实例
  86.         /// </summary>
  87.         /// <param name="imagePath">水印图片路径</param>
  88.         /// <param name="tranparence">透明度</param>
  89.         /// <param name="markX">标记位置横坐标</param>
  90.         /// <param name="markY">标记位置纵坐标</param>
  91.         public WaterMark(string imagePath,float tranparence,int markX,int markY)
  92.         {
  93.             this._markType=MarkType.Image;        
  94.             this._imgPath=imagePath;
  95.             this._markX=markX;
  96.             this._markY=MarkY;
  97.             this._transparency=tranparence;
  98.             this.Mark();
  99.         }
  100.         #endregion
  101.         #region
  102.         /// <summary>
  103.         /// 水印类型
  104.         /// </summary>
  105.         public MarkType WaterMarkType
  106.         {
  107.             get
  108.             {
  109.                 return _markType;
  110.             }
  111.             set
  112.             {
  113.                 _markType=value;
  114.             }
  115.         }     
  116.         /**//// <summary>
  117.         /// 水印文字在文字中的位置
  118.         /// </summary>
  119.         public ImagePosition ImagePositiontype
  120.         {
  121.             get
  122.             {
  123.                 return _ImagePosition;
  124.             }
  125.             set
  126.             {
  127.                 _ImagePosition=value;
  128.             }
  129.         }        
  130.         /**//// <summary>
  131.         /// 文字水印得内容
  132.         /// </summary>
  133.         public string Text
  134.         {
  135.             get{return _text;}
  136.             set{_text=value;}
  137.         }
  138.         /**//// <summary>
  139.         /// 水印图片得路径
  140.         /// </summary>
  141.         public string WaterImagePath
  142.         {
  143.             get
  144.             {
  145.                 return _imgPath;
  146.             }
  147.             set
  148.             {
  149.                 this._imgPath=value;
  150.             }
  151.         }
  152.         /**//// <summary>
  153.         /// 水印图片
  154.         /// </summary>
  155.         public Image WaterImage
  156.         {
  157.             get
  158.             {
  159.                 try
  160.                 {
  161.                     return Image.FromFile(this.WaterImagePath);
  162.                 }
  163.                 catch
  164.                 {
  165.                     return null;
  166.                 }
  167.             }            
  168.         }
  169.         /**//// <summary>
  170.         /// 添加水印位置得横坐标
  171.         /// </summary>
  172.         public int MarkX
  173.         {
  174.             get{return _markX;}
  175.             set{_markX=value;}
  176.         }
  177.         /**//// <summary>
  178.         /// 添加水印位置得纵坐标
  179.         /// </summary>
  180.         public int MarkY
  181.         {
  182.             get{return _markY;}
  183.             set{_markY=value;}
  184.         }
  185.         /**//// <summary>
  186.         /// 水印得透明度
  187.         /// </summary>
  188.         public float Transparency
  189.         {
  190.             get
  191.             {
  192.                 if(_transparency>1.0f)
  193.                 {
  194.                     _transparency=1.0f;
  195.                 }
  196.                 return _transparency;}
  197.             set{_transparency=value;}
  198.         }
  199.         /**//// <summary>
  200.         /// 水印文字得颜色
  201.         /// </summary>
  202.         public Color TextColor
  203.         {
  204.             get{return _textColor;}
  205.             set{_textColor=value;}
  206.         }
  207.         /**//// <summary>
  208.         /// 水印文字得字体
  209.         /// </summary>
  210.         public string TextFontFamilyStr
  211.         {
  212.             get{return _fontFamily;}
  213.             set{_fontFamily=value;}
  214.         }
  215.         public FontFamily TextFontFamily
  216.         {
  217.             get{return new FontFamily(this.TextFontFamilyStr);}
  218.         }
  219.         /**//// <summary>
  220.         /// 水印文字是否加粗
  221.         /// </summary>
  222.         public bool Bold
  223.         {
  224.             get{return _textbold;}
  225.             set{_textbold=value;}
  226.         }
  227.         /**//// <summary>
  228.         /// 原图
  229.         /// </summary>
  230.       public Image SourceImage
  231.         {
  232.           get
  233.           {
  234.               return _image;
  235.           }
  236.           set
  237.           {
  238.               _image=value;
  239.           }
  240.         }
  241.         /**//// <summary>
  242.         /// 加过水印之后得图
  243.         /// </summary>
  244.         public Image MarkedImage
  245.         {
  246.             get
  247.             {
  248.                 return this._markedIamge;
  249.             }            
  250.         }
  251.         #endregion
  252.         #region
  253.     //  ---------------------方法事件---------------------#region ---------------------方法事件---------------------
  254.         public Image Mark(Image img,MarkType markType,string text,Image waterImg,bool bold,Color textColor,float transparence,FontFamily fontFamily,ImagePosition ImagePosition )
  255.         {
  256.             //首先先判断该图片是否是 gif动画,如果为gif动画不对图片进行改动
  257.             int markx=0;
  258.             int marky=0;
  259.         
  260.             foreach(Guid guid in img.FrameDimensionsList)
  261.             {
  262.                 FrameDimension dimension= new FrameDimension(guid);
  263.                 if(img.GetFrameCount(dimension)>1)
  264.                 {
  265.                     return img;
  266.                 }
  267.             }
  268.                 
  269.             try
  270.             {
  271.                 //添加文字水印
  272.                 if(markType==MarkType.Text)
  273.                 {
  274.                     //根据源图片生成新的Bitmap对象作为作图区,为了给gif图片添加水印,才有此周折
  275.                     Bitmap newBitmap=new Bitmap(img.Width,img.Height,PixelFormat.Format24bppRgb); 
  276.                     //设置新建位图得分辨率
  277.                     newBitmap.SetResolution(img.HorizontalResolution,img.VerticalResolution);
  278.                     //创建Graphics对象,以对该位图进行操作
  279.                     Graphics g = Graphics.FromImage(newBitmap);
  280.                     //
  281.                     
  282.                     //消除锯齿
  283.                     g.SmoothingMode=SmoothingMode.AntiAlias;
  284.                     //将原图拷贝到作图区
  285.                     g.DrawImage(img,new Rectangle(0,0,img.Width,img.Height),0,0,img.Width,img.Height,GraphicsUnit.Pixel);
  286.                     //声明字体对象
  287.                     Font cFont = null;
  288.                     //用来测试水印文本长度得尺子
  289.                     SizeF size=new SizeF();
  290.                     //探测出一个适合图片大小得字体大小,以适应水印文字大小得自适应
  291.                     for(int i=0;i<6;i++)
  292.                     {
  293.                         //创建一个字体对象
  294.                         cFont= new Font(fontFamily,sizes[i]);
  295.                         //是否加粗
  296.                         if(!bold)
  297.                         {
  298.                             cFont= new Font(fontFamily,sizes[i],FontStyle.Regular);
  299.                         }
  300.                         else
  301.                         {
  302.                             cFont=new Font(fontFamily,sizes[i],FontStyle.Bold);
  303.                         }
  304.                         //测量文本大小
  305.                         size=g.MeasureString(this.Text,cFont);
  306.                         //匹配第一个符合要求得字体大小
  307.                         if((ushort)size.Width<(ushort)img.Width)
  308.                         {
  309.                             break;
  310.                         }
  311.                     }
  312.                     //创建刷子对象,准备给图片写上文字
  313.                     markx=Convert.ToInt32((img.Width/2)-(size.Width/2.0));
  314.                     marky=Convert.ToInt32((img.Height/2)-(size.Height/2.0));
  315.                     Brush brush= new SolidBrush(System.Drawing.Color.FromArgb(70,textColor));
  316.                     //在指定得位置写上文字
  317.                     g.DrawString(text,cFont,brush,markx,marky);
  318.                     
  319.                     //释放Graphics对象
  320.                     g.Dispose();   
  321.                     //将生成得图片读入MemoryStream
  322.                     System.IO.MemoryStream ms = new System.IO.MemoryStream();
  323.                     newBitmap.Save(ms,ImageFormat.Jpeg);
  324.                     //重新生成Image对象
  325.                     img=System.Drawing.Image.FromStream(ms);    
  326.                     //返回新的Image对象
  327.                     
  328.                     cFont.Dispose(); 
  329.                     brush.Dispose(); 
  330.                     return img;
  331.                 }
  332.                     //添加图像水印
  333.                 else if(markType==MarkType.Image)
  334.                 {
  335.                     //获得水印图像
  336.                     Image markImg = waterImg;
  337.                     //创建颜色矩阵
  338.                     float[][] ptsArray ={ 
  339.                                             new float[] {1, 0, 0, 0, 0},
  340.                                             new float[] {0, 1, 0, 0, 0},
  341.                                             new float[] {0, 0, 1, 0, 0},
  342.                                             new float[] {0, 0, 0, transparence, 0}, //注意:此处为0.0f为完全透明,1.0f为完全不透明
  343.                                             new float[] {0, 0, 0, 0, 1}}; 
  344.                     ColorMatrix colorMatrix= new ColorMatrix(ptsArray);
  345.                     //新建一个Image属性
  346.                     ImageAttributes imageAttributes= new ImageAttributes();
  347.                     //将颜色矩阵添加到属性
  348.                     imageAttributes.SetColorMatrix(colorMatrix,ColorMatrixFlag.Default,
  349.                         ColorAdjustType.Default);
  350.                     //生成位图作图区
  351.                     Bitmap newBitmap=new Bitmap(img.Width,img.Height,PixelFormat.Format24bppRgb);
  352.                     //设置分辨率
  353.                     newBitmap.SetResolution(img.HorizontalResolution,img.VerticalResolution);
  354.                     //创建Graphics
  355.                     Graphics g = Graphics.FromImage(newBitmap);
  356.                     //消除锯齿
  357.                     g.SmoothingMode=SmoothingMode.AntiAlias;
  358.                     //拷贝原图到作图区
  359.                     g.DrawImage(img,new Rectangle(0,0,img.Width,img.Height),0,0,img.Width,img.Height,GraphicsUnit.Pixel);
  360.                     //如果原图过小
  361.                     if(markImg.Width>img.Width||markImg.Height>img.Height)
  362.                     {
  363.                         System.Drawing.Image.GetThumbnailImageAbort callb=null;
  364.                         //对水印图片生成缩略图,缩小到原图得1/4
  365.                         System.Drawing.Image new_img=markImg.GetThumbnailImage(img.Width/4,markImg.Height*img.Width/markImg.Width,callb,new System.IntPtr());
  366.                         //添加水印
  367.                         g.DrawImage(new_img,new Rectangle(markx,marky,new_img.Width,new_img.Height),0,0,new_img.Width,new_img.Height,GraphicsUnit.Pixel,imageAttributes);
  368.                         //释放缩略图
  369.                         new_img.Dispose();
  370.                         //释放Graphics
  371.                         g.Dispose();
  372.                         //将生成得图片读入MemoryStream
  373.                         System.IO.MemoryStream ms = new System.IO.MemoryStream();
  374.                         newBitmap.Save(ms,ImageFormat.Jpeg);
  375.           //返回新的Image对象
  376.                         img=Image.FromStream(ms);
  377.                         markImg.Dispose(); 
  378.                         imageAttributes.Dispose(); 
  379.     
  380.                         return img;
  381.                     }
  382.                         //原图足够大
  383.                     else
  384.                     {
  385.                         //添加水印
  386.                         g.DrawImage(markImg,new Rectangle(markx,marky,markImg.Width,markImg.Height),0,0,markImg.Width,markImg.Height,GraphicsUnit.Pixel,imageAttributes);
  387.                         //释放Graphics
  388.                         g.Dispose();
  389.                         //将生成得图片读入MemoryStream
  390.                         System.IO.MemoryStream ms = new System.IO.MemoryStream();
  391.                         newBitmap.Save(ms,ImageFormat.Jpeg);
  392.                         //返回新的Image对象
  393.                         img=Image.FromStream(ms);
  394.                         markImg.Dispose(); 
  395.                         imageAttributes.Dispose(); 
  396.                         return img;
  397.                     }                    
  398.                 }
  399.                 return img;
  400.             }
  401.             catch
  402.             {
  403.                 return img;   
  404.             }   
  405.         }
  406.         /**//// <summary>
  407.         /// 添加水印,此方法适用于gif格式得图片
  408.         /// </summary>
  409.         /// <param name="image">需要添加水印得图片</param>
  410.         /// <returns>添加水印之后得图片</returns>
  411.         
  412.         private void Mark()
  413.         {
  414.             this._markedIamge=Mark(this.SourceImage,this.WaterMarkType,this._text,this.WaterImage,this._textbold,this._textColor,this._transparency,this.TextFontFamily,this.ImagePositiontype );
  415.         }
  416.         #endregion        
  417.     }
  418. }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值