c# 添加图片水印,可以指定水印位置+生成缩略图

图片上传函数,进行判断是否加水印,做出两种处理方式:

/**//// <summary>

/// 上传图片代码

/// </summary>

/// <param name="image_file">HtmlInputFile控件</param>
   /// <param name="ImgPath">存放的文件夹绝对位置</param>

/// <param name="ImgLink">生成的图片的名称带后缀</param>

/// <returns></returns>
     public bool UpPic(System.Web.UI.HtmlControls.HtmlInputFile image_file,string ImgPath,string ImgLink )
        {
             if(image_file.PostedFile.FileName!=null && image_file.PostedFile.FileName.Trim()!="")
            {
                try
                {
                  if( !System.IO.Directory.Exists(ImgPath))
                    {
                  System.IO.Directory.CreateDirectory( ImgPath);
               }
               //生成缩略图
                 this.GreateMiniImage((ImgPath+ "\\"+"old_"+ImgLink),(ImgPath+ "\\"+"mini_"+ImgLink),50,50);
                   //如果显示水印
                  if(ShowWatermark)
                     {
                       image_file.PostedFile.SaveAs(ImgPath+ "\\" +"old_"+ImgLink);
                        //加水印
                         this.addWaterMark((ImgPath+ "\\"+"old_"+ImgLink),(ImgPath+ "\\"+ImgLink));
                 }
                    else
                    {
                      image_file.PostedFile.SaveAs(ImgPath+ "\\" +ImgLink);
                  }
                    return true;
               }
                catch
                 {
                   return false;
              }
            }
           else
      {
               return false;
           }
      }

加水印的函数如下:
   填加图片函数,需要下面两个函数的支持,当然也可以写到一起,不过那看起来就很冗长了。

/**//// <summary>
           /// 添加图片水印
           /// </summary>
            /// <param name="oldpath">原图片绝对地址</param>
            /// <param name="newpath">新图片放置的绝对地址</param>
        private void addWaterMark(string oldpath,string newpath)
        {
            try
            {
               System.Drawing.Image image = System.Drawing.Image.FromFile(oldpath);
             Bitmap b = new Bitmap(image.Width, image.Height,PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(b);
                 g.Clear(Color.White);
                 g.SmoothingMode = SmoothingMode.HighQuality;
                 g.InterpolationMode = InterpolationMode.High;
             g.DrawImage(image, 0, 0, image.Width, image.Height);
                if(如果需要填加水印)
                {
                   switch(水印类型)
                    {
     //是图片的话               
                              case "WM_IMAGE":
              this.addWatermarkImage( g,Page.Server.MapPath(Watermarkimgpath),WatermarkPosition,image.Width,image.Height);
                            break;
   //如果是文字                    
                                  case "WM_TEXT":
      this.addWatermarkText( g, WatermarkText,WatermarkPosition
                                 ,image.Width,image.Height);
                             break;
                    }
                b.Save(newpath);
                  b.Dispose();
                 image.Dispose();
                 }
             }
            catch
            {

if(File.Exists(oldpath))
                {
                     File.Delete(oldpath);
                }
            }
            finally
            {
               if(File.Exists(oldpath))
                {
                   File.Delete(oldpath);
               }
          }
     }

加水印文字 /**//// <summary>
       ///  加水印文字
         /// </summary>
         /// <param name="picture">imge 对象</param>
         /// <param name="_watermarkText">水印文字内容</param>
        /// <param name="_watermarkPosition">水印位置</param>
         /// <param name="_width">被加水印图片的宽</param>
         /// <param name="_height">被加水印图片的高</param>
          private void addWatermarkText( Graphics picture,string _watermarkText,string _watermarkPosition,int _width,int _height)
        {
           int[] sizes = new int[]{16,14,12,10,8,6,4};
           Font crFont = null;
             SizeF crSize = new    SizeF();
            for (int i=0 ;i<7; i++)
            {
                crFont = new Font("arial", sizes[i], FontStyle.Bold);
                crSize = picture.MeasureString(_watermarkText, crFont);
                if((ushort)crSize.Width < (ushort)_width)
                     break;
            }
            float xpos = 0;
            float ypos = 0;
           switch(_watermarkPosition)
            {
                case "WM_TOP_LEFT":
                     xpos = ((float)_width * (float).01) + (crSize.Width / 2);
                     ypos = (float)_height * (float).01;
                     break;
                case "WM_TOP_RIGHT":
                    xpos = ((float)_width * (float).99) - (crSize.Width / 2);
                    ypos = (float)_height * (float).01;
                    break;
                case "WM_BOTTOM_RIGHT":
                   xpos = ((float)_width * (float).99) - (crSize.Width / 2);
                    ypos = ((float)_height * (float).99) - crSize.Height;
                     break;
                 case "WM_BOTTOM_LEFT":
                    xpos = ((float)_width * (float).01) + (crSize.Width / 2);
                     ypos = ((float)_height * (float).99) - crSize.Height;
                    break;
            }
             StringFormat StrFormat = new StringFormat();
             StrFormat.Alignment = StringAlignment.Center;
            SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0,0));
            picture.DrawString(_watermarkText, crFont, semiTransBrush2, xpos+1, ypos+1, StrFormat);
           SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));
           picture.DrawString(_watermarkText, crFont, semiTransBrush, xpos, ypos, StrFormat);
         semiTransBrush2.Dispose();
      semiTransBrush.Dispose();
      }

//代码已经修改,可以按比率还填加图片水印,不过如果背景图片和水印图片太不成比率的话(指水印图片要大于背景图片的1/4),出来的效果不是很好。

水印图片  /**//// <summary>
        ///  加水印图片
        /// </summary>
         /// <param name="picture">imge 对象</param>
         /// <param name="WaterMarkPicPath">水印图片的地址</param>
        /// <param name="_watermarkPosition">水印位置</param>
        /// <param name="_width">被加水印图片的宽</param>
         /// <param name="_height">被加水印图片的高</param>
        private void addWatermarkImage( Graphics picture,string WaterMarkPicPath,string _watermarkPosition,int _width,int _height)
       {
           Image watermark = new Bitmap(WaterMarkPicPath);
            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[][] 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,  0.3f, 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;
             int WatermarkWidth=0;
             int WatermarkHeight=0;
            double bl=1d;
             //计算水印图片的比率
             //取背景的1/4宽度来比较
             if((_width>watermark.Width*4)&&(_height>watermark.Height*4))
             {
                bl=1;
            }
           else if((_width>watermark.Width*4)&&(_height<watermark.Height*4))
            {
                 bl=Convert.ToDouble(_height/4)/Convert.ToDouble(watermark.Height);
            }else
            if((_width<watermark.Width*4)&&(_height>watermark.Height*4))
            {
                 bl=Convert.ToDouble(_width/4)/Convert.ToDouble(watermark.Width);
            }
            else
             {
                if((_width*watermark.Height)>(_height*watermark.Width))
                {
                    bl=Convert.ToDouble(_height/4)/Convert.ToDouble(watermark.Height);
                }
                else
                {
                    bl=Convert.ToDouble(_width/4)/Convert.ToDouble(watermark.Width);
               }
            }
        WatermarkWidth=Convert.ToInt32(watermark.Width*bl);
           WatermarkHeight=Convert.ToInt32(watermark.Height*bl);
         switch(_watermarkPosition)
            {
                case "WM_TOP_LEFT":
                   xpos = 10;
                     ypos = 10;
                     break;
                case "WM_TOP_RIGHT":
                     xpos = _width - WatermarkWidth - 10;
                   ypos = 10;
                    break;
                  case "WM_BOTTOM_RIGHT":
                    xpos = _width - WatermarkWidth - 10;
                     ypos = _height -WatermarkHeight - 10;
                   break;
                case "WM_BOTTOM_LEFT":
                      xpos = 10;
                     ypos = _height - WatermarkHeight - 10;
                     break;
            }
        picture.DrawImage(watermark, new Rectangle(xpos, ypos, WatermarkWidth, WatermarkHeight), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);
             watermark.Dispose();
            imageAttributes.Dispose();
        }

生成缩略图函数

/**//// <summary>
        /// 生成缩略图
          /// </summary>
         /// <param name="oldpath">原图片地址</param>
         /// <param name="newpath">新图片地址</param>
         /// <param name="tWidth">缩略图的宽</param>
         /// <param name="tHeight">缩略图的高</param>
        private void  GreateMiniImage(string oldpath,string newpath,int tWidth, int tHeight)
        {
            try
             {
              System.Drawing.Image image = System.Drawing.Image.FromFile(oldpath);
                 double bl=1d;
                 if((image.Width<=image.Height)&&(tWidth>=tHeight))
                {
                    bl=Convert.ToDouble(image.Height)/Convert.ToDouble(tHeight);
                }
                else if((image.Width>image.Height)&&(tWidth<tHeight))
                {
                     bl=Convert.ToDouble(image.Width)/Convert.ToDouble(tWidth);
               }
                else
                  if((image.Width<=image.Height)&&(tWidth<=tHeight))
                {
                  if(image.Height/tHeight>=image.Width/tWidth)
                    {
                       bl=Convert.ToDouble(image.Width)/Convert.ToDouble(tWidth);
                 }
                   else
                    {
                     bl=Convert.ToDouble(image.Height)/Convert.ToDouble(tHeight);
                    }
                }
               else
                 {
                    if(image.Height/tHeight>=image.Width/tWidth)
                    {
                       bl=Convert.ToDouble(image.Height)/Convert.ToDouble(tHeight);
                   }
                  else
                     {
                      bl=Convert.ToDouble(image.Width)/Convert.ToDouble(tWidth);
                    }
              }
              Bitmap b = new Bitmap(image ,Convert.ToInt32(image.Width/bl), Convert.ToInt32(image.Height/bl));
                 b.Save(newpath);
                b.Dispose();
                image.Dispose();
        }
            catch{}

}

c# 添加图片水印,可以指定水印位置+生成缩略图相关推荐

  1. c# 添加图片水印,可以指定水印位置+生成缩略图[付上帅图1,2,3,4]

    早上,一哥儿发来添加图片水印的资料.有三个信息,如下:              xx 09:57:35 http://index.cnblogs.com/archive/2004/10/20/544 ...

  2. php 缩略图增加水印,php 图片上传代码(具有生成缩略图与增加水印功能)

    class upfile { public $filepath = "www.111com.net/"; //上传文件存放文件夹 public $filesize = 100000 ...

  3. Linux图片马PHP,php 根据请求生成缩略图片保存到Linux图片服务器的代码

    这个功能,有点类似图片站点分离的操作,就是将图片单独架设在一台服务器上,有兴趣的朋友,好好研究下吧. 代码如下: 复制代码 代码示例: /** * 缩略图片 Linux图片服务器 * edit www ...

  4. Android_Bitmap_图片的二次采样并生成缩略图

    首先尝试通过字节数组或者流,只去加载图片的外边缘,此时必须指定BitmapFactory.Options 的inJustDecodeBounds成员名,将其只为true,一旦设置为true,Bitma ...

  5. Android之通过ContentResolver获取手机图片和视频的路径和生成缩略图和缩略图路径

    1 问题 获取手机所有图片和视频的路径和生成图片和视频的缩略图和缩略图路径 生成缩略图我们用的系统函数 public static Bitmap getThumbnail(ContentResolve ...

  6. 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图

    本文借助vs2005中自带的FileUpload控件实现图片文件的上传并生成缩略图. 实现过程:选择图片上传成功后,取得已经存在服务器的文件生成缩略图,并且判断是否是图片类型的文件,这个的判断可以在程 ...

  7. 照片如何批量加水印怎么弄?图片如何批量加水印?

    很多电商老板给图片添加水印,不仅可以更好地保护图片版权,也可以到达宣传效果.如果一张一张的添加水印耗费大量时间,而且极大影响工作效率.图片如何批量加水印(https://www.yasuola.com ...

  8. web手势库AlloyFinger运用( 控制CANVAS中图片移动、缩放、旋转) - 可编辑图片指定区域位置

    注: 苹果手机升级IOS14.1系统后,出现图片写入不了CANVAS画布问题 解决方法:alloy_paper.js 文件查找代码: this.img.crossOrigin = "Anon ...

  9. android水印控件,Android图片添加文字水印并保存水印文字图片到指定文件

    Android图片添加文字水印并保存水印文字图片到指定文件package zhangphil.test;import android.graphics.Bitmap;import android.gr ...

最新文章

  1. 初识vue 2.0(5):使用props父子组件通信
  2. SparkSql官方文档中文翻译(java版本)
  3. 已知函数func的C语言代码框架,第三章习题-ddg..doc
  4. 9206-1117-课堂笔记
  5. macos下npm install 报错: fsevents .... permission denined
  6. 性能测试系列:Jmeter使用记录
  7. 转:基于用户投票的排名算法系列
  8. PHP网站安装程序制作的原理、步骤、注意事项和示例代码
  9. 计算机组成原理期末考试题库(超级多的那种)
  10. Office 2016中修改正文默认字体
  11. Unity RTS 策略游戏等建造系统仿照COC游戏的插件 - City Building Perfect Kit
  12. kindle paperwhite 使用说明
  13. win7由于无法确定计算机,nvme固态硬盘安装win7教程((解决硬盘无法识别)
  14. 如何使用计算机对文件修改密码,如何给文件夹设置一个密码?(电脑怎么给文件夹设置密码?)...
  15. 科技护肤品,买还是不买
  16. Pest incidence forecasting based on Internet of Things and Long Short-Term Memory Network 论文精读
  17. windows xp快捷键
  18. 大学生学C语言用什么笔记本电脑,有哪些适合大学生用的笔记本电脑
  19. LCC编译器的源程序分析(27)基本语句
  20. zxing 二维码生成深度定制

热门文章

  1. Maven提示Failed to execute goal on project itripbiz: Could not resolve dependencies for project org
  2. 知犀思维导图_知犀导图本地保存邀请码6个[未使用]需者自取.
  3. 90%的人都不知道如何正确关闭安卓偶现闪退的Bug
  4. React Native错误之 null is not an object (evaluating ‘_RNGestureHandlerModule.default.Direction)-坑
  5. 14_ue4进阶末日生存游戏开发[第一人称和第三人称的切换]
  6. 邓普顿教你逆向投资——错误定价+低价买入
  7. openlayers6【二十六】业务交互:Cluster 聚合标注控制,显示隐藏聚合标注
  8. 英语老师必读的英文原版_如何找到英语老师。 第2部分
  9. IPSEC 面试的几个小问题
  10. JavaCV音视频转单声道16位16K赫兹小端点pcm音频