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

 c# 添加图片水印,可以指定水印位置+生成缩略图     
  早上,一哥儿发来添加图片水印的资料。有三个信息,如下:
            

xx 09:57:35
http://index.cnblogs.com/archive/2004/10/20/54498.aspx 
王二狗 09:57:51
好的,我看看 
  
xx 09:58:12
http://www.iyuanma.com/info/18/17026_200592663244.htm 
xx 10:07:00
http://www.codefans.com/CodeView/CodeView_12043.html 
xx 10:07:18
你看看现成的组件能不能用 
         
         几分钟后,我就发现第二个网址的内容是copy第一个的(也许是相反),真是天下文章一大抄。于是我对那条说有什么组件的东东很感兴趣,下下来一看,吐血,就是一段代码,完全copy第一个文章里的,什么组件啊。真是能欺骗人。
         算了,自己动手,丰衣十足。想起上个月做相册的开发,用到了Gallery开源项目的东西。那里面有填加水印的,并且功能比较强大,能设定位置。不像上面的资料不能调整水印位置,水印效果估计也不好,毕竟就那几行。其实后来我发现那段代码还是错的,调试通过不了,修改后才能用,至于错在那里在后面介绍。
         我们先看看哥儿给我的资料里的代码:
           原来的代码:


 1 private void Btn_Upload_Click(object sender, System.EventArgs e)
 2        {
 3            if(UploadFile.PostedFile.FileName.Trim()!="")
 4            {
 5                //上传文件
 6                string extension = Path.GetExtension(UploadFile.PostedFile.FileName).ToUpper();
 7                string fileName = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();
 8                string path = Server.MapPath(".") + "/UploadFile/" + fileName + extension;
 9                UploadFile.PostedFile.SaveAs(path);
10
11                //加文字水印,注意,这里的代码和以下加图片水印的代码不能共存
12                System.Drawing.Image image = System.Drawing.Image.FromFile(path);
13                Graphics g = Graphics.FromImage(image);
14                g.DrawImage(image, 0, 0, image.Width, image.Height);
15                Font f = new Font("Verdana", 32);
16                Brush b = new SolidBrush(Color.White);
17                string addText = AddText.Value.Trim();
18                g.DrawString(addText, f, b, 10, 10);
19                g.Dispose();
20
21                //加图片水印
22                System.Drawing.Image image = System.Drawing.Image.FromFile(path);
23                System.Drawing.Image copyImage = System.Drawing.Image.FromFile( Server.MapPath(".") + "/Alex.gif");
24                Graphics g = Graphics.FromImage(image);
25                g.DrawImage(copyImage, new Rectangle(image.Width-copyImage.Width, image.Height-copyImage.Height, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel);
26                g.Dispose();
27
28                //保存加水印过后的图片,删除原始图片
29                string newPath = Server.MapPath(".") + "/UploadFile/" + fileName + "_new" + extension;
30                image.Save(newPath);
31                image.Dispose();
32                if(File.Exists(path))
33                {
34                    File.Delete(path);
35                }
36
37                Response.Redirect(newPath);
38            }
39        }

         于是我把Gallery里的代码整理了下。如下:

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


 1    /**//// <summary>
 2        /// 上传图片代码
 3        /// </summary>
 4        /// <param name="image_file">HtmlInputFile控件</param>
 5        /// <param name="ImgPath">存放的文件夹绝对位置</param>
 6        /// <param name="ImgLink">生成的图片的名称带后缀</param>
 7        /// <returns></returns>
 8        public bool UpPic(System.Web.UI.HtmlControls.HtmlInputFile image_file,string ImgPath,string ImgLink )
 9        {
10            if(image_file.PostedFile.FileName!=null && image_file.PostedFile.FileName.Trim()!="")
11            {
12                try
13                {
14                    if( !System.IO.Directory.Exists(ImgPath))
15                    {
16                        System.IO.Directory.CreateDirectory( ImgPath);
17                    }
18                     //生成缩略图
                            this.GreateMiniImage((ImgPath+ "\\"+"old_"+ImgLink),(ImgPath+ "\\"+"mini_"+ImgLink),50,50);
19                    //如果显示水印
20                    if(ShowWatermark)
21                    {
22                        image_file.PostedFile.SaveAs(ImgPath+ "\\" +"old_"+ImgLink);
23                        //加水印
24                        this.addWaterMark((ImgPath+ "\\"+"old_"+ImgLink),(ImgPath+ "\\"+ImgLink));
25
26
27                    
28                    }
29                    else
30                    {
31                        image_file.PostedFile.SaveAs(ImgPath+ "\\" +ImgLink);
32                    
33                    
34                    }
35                    return true;
36                }
37
38                catch
39                {
40                    return false;
41                }
42            }
43            else
44            
45            {
46                return false;
47            }
48
49        }

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

添加图片水印
 1    /**//// <summary>
 2            /// 添加图片水印
 3            /// </summary>
 4            /// <param name="oldpath">原图片绝对地址</param>
 5            /// <param name="newpath">新图片放置的绝对地址</param>
 6        private void addWaterMark(string oldpath,string newpath)
 7        
 8        {
 9            try
10            {
11
12                System.Drawing.Image image = System.Drawing.Image.FromFile(oldpath);
13
14                Bitmap b = new Bitmap(image.Width, image.Height,PixelFormat.Format24bppRgb);
15                Graphics g = Graphics.FromImage(b);
16                g.Clear(Color.White);
17                g.SmoothingMode = SmoothingMode.HighQuality;
18                g.InterpolationMode = InterpolationMode.High;
19            
20                g.DrawImage(image, 0, 0, image.Width, image.Height);
21
22                if(如果需要填加水印)
23                {
24                    switch(水印类型)
25                    {
26    //是图片的话               
                                   case "WM_IMAGE":
27                            this.addWatermarkImage( g,Page.Server.MapPath(Watermarkimgpath),WatermarkPosition,image.Width,image.Height);
28                            break;
29    //如果是文字                    
                                   case "WM_TEXT":
30                            this.addWatermarkText( g, WatermarkText,WatermarkPosition
31                                ,image.Width,image.Height);
32                            break;
33                    }
34
35                    b.Save(newpath);
36                    b.Dispose();
37                    image.Dispose();
38                }
39
40            }
41            catch
42            {
43            
44                if(File.Exists(oldpath))
45                {
46                    File.Delete(oldpath);
47                }
48            }
49            finally
50            {
51                
52                if(File.Exists(oldpath))
53                {
54                    File.Delete(oldpath);
55                }
56            
57            
58            }
59        
60        
61
62
63
64        
65        }

  

加水印文字
 1/**//// <summary>
 2        ///  加水印文字
 3        /// </summary>
 4        /// <param name="picture">imge 对象</param>
 5        /// <param name="_watermarkText">水印文字内容</param>
 6        /// <param name="_watermarkPosition">水印位置</param>
 7        /// <param name="_width">被加水印图片的宽</param>
 8        /// <param name="_height">被加水印图片的高</param>
 9        private void addWatermarkText( Graphics picture,string _watermarkText,string _watermarkPosition,int _width,int _height)
10        {
11            int[] sizes = new int[]{16,14,12,10,8,6,4};
12            Font crFont = null;
13            SizeF crSize = new    SizeF();
14            for (int i=0 ;i<7; i++)
15            {
16                crFont = new Font("arial", sizes[i], FontStyle.Bold);
17                crSize = picture.MeasureString(_watermarkText, crFont);
18
19                if((ushort)crSize.Width < (ushort)_width)
20                    break;
21            }
22
23            float xpos = 0;
24            float ypos = 0;
25
26            switch(_watermarkPosition)
27            {
28                case "WM_TOP_LEFT":
29                    xpos = ((float)_width * (float).01) + (crSize.Width / 2);
30                    ypos = (float)_height * (float).01;
31                    break;
32                case "WM_TOP_RIGHT":
33                    xpos = ((float)_width * (float).99) - (crSize.Width / 2);
34                    ypos = (float)_height * (float).01;
35                    break;
36                case "WM_BOTTOM_RIGHT":
37                    xpos = ((float)_width * (float).99) - (crSize.Width / 2);
38                    ypos = ((float)_height * (float).99) - crSize.Height;
39                    break;
40                case "WM_BOTTOM_LEFT":
41                    xpos = ((float)_width * (float).01) + (crSize.Width / 2);
42                    ypos = ((float)_height * (float).99) - crSize.Height;
43                    break;
44            }
45
46            StringFormat StrFormat = new StringFormat();
47            StrFormat.Alignment = StringAlignment.Center;
48
49            SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0,0));
50            picture.DrawString(_watermarkText, crFont, semiTransBrush2, xpos+1, ypos+1, StrFormat);
51
52            SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));
53            picture.DrawString(_watermarkText, crFont, semiTransBrush, xpos, ypos, StrFormat);
54
55
56            semiTransBrush2.Dispose();
57            semiTransBrush.Dispose();
58
59
60
61        }

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

水印图片
  1  /**//// <summary>
  2        ///  加水印图片
  3        /// </summary>
  4        /// <param name="picture">imge 对象</param>
  5        /// <param name="WaterMarkPicPath">水印图片的地址</param>
  6        /// <param name="_watermarkPosition">水印位置</param>
  7        /// <param name="_width">被加水印图片的宽</param>
  8        /// <param name="_height">被加水印图片的高</param>
  9        private void addWatermarkImage( Graphics picture,string WaterMarkPicPath,string _watermarkPosition,int _width,int _height)
 10        {
 11            Image watermark = new Bitmap(WaterMarkPicPath);
 12
 13            ImageAttributes imageAttributes = new ImageAttributes();
 14            ColorMap colorMap = new ColorMap();
 15
 16            colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
 17            colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
 18            ColorMap[] remapTable = {colorMap};
 19
 20            imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
 21
 22            float[][] colorMatrixElements = {
 23                                                new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f},
 24                                                new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f},
 25                                                new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f},
 26                                                new float[] {0.0f,  0.0f,  0.0f,  0.3f, 0.0f},
 27                                                new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}
 28                                            };
 29
 30            ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
 31
 32            imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
 33
 34            int xpos = 0;
 35            int ypos = 0;
 36            int WatermarkWidth=0;
 37            int WatermarkHeight=0;
 38            double bl=1d;
 39            //计算水印图片的比率
 40            //取背景的1/4宽度来比较
 41            if((_width>watermark.Width*4)&&(_height>watermark.Height*4))
 42            {
 43                bl=1;
 44            }
 45            else if((_width>watermark.Width*4)&&(_height<watermark.Height*4))
 46            {
 47                bl=Convert.ToDouble(_height/4)/Convert.ToDouble(watermark.Height);
 48            
 49            }else
 50            
 51            if((_width<watermark.Width*4)&&(_height>watermark.Height*4))
 52            {
 53                bl=Convert.ToDouble(_width/4)/Convert.ToDouble(watermark.Width);
 54            }
 55            else
 56            {
 57                if((_width*watermark.Height)>(_height*watermark.Width))
 58                {
 59                    bl=Convert.ToDouble(_height/4)/Convert.ToDouble(watermark.Height);
 60                    
 61                }
 62                else
 63                {
 64                    bl=Convert.ToDouble(_width/4)/Convert.ToDouble(watermark.Width);
 65                    
 66                }
 67            
 68            }
 69
 70            WatermarkWidth=Convert.ToInt32(watermark.Width*bl);
 71            WatermarkHeight=Convert.ToInt32(watermark.Height*bl);
 72
 73            
 74
 75            switch(_watermarkPosition)
 76            {
 77                case "WM_TOP_LEFT":
 78                    xpos = 10;
 79                    ypos = 10;
 80                    break;
 81                case "WM_TOP_RIGHT":
 82                    xpos = _width - WatermarkWidth - 10;
 83                    ypos = 10;
 84                    break;
 85                case "WM_BOTTOM_RIGHT":
 86                    xpos = _width - WatermarkWidth - 10;
 87                    ypos = _height -WatermarkHeight - 10;
 88                    break;
 89                case "WM_BOTTOM_LEFT":
 90                    xpos = 10;
 91                    ypos = _height - WatermarkHeight - 10;
 92                    break;
 93            }
 94
 95            picture.DrawImage(watermark, new Rectangle(xpos, ypos, WatermarkWidth, WatermarkHeight), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);
 96
 97
 98            watermark.Dispose();
 99            imageAttributes.Dispose();
100        }

   生成缩略图函数

生成缩略图
 1
 2        /**//// <summary>
 3        /// 生成缩略图
 4        /// </summary>
 5        /// <param name="oldpath">原图片地址</param>
 6        /// <param name="newpath">新图片地址</param>
 7        /// <param name="tWidth">缩略图的宽</param>
 8        /// <param name="tHeight">缩略图的高</param>
 9        private void  GreateMiniImage(string oldpath,string newpath,int tWidth, int tHeight)
10        {
11        
12            try
13            {
14
15                System.Drawing.Image image = System.Drawing.Image.FromFile(oldpath);
16                double bl=1d;
17                if((image.Width<=image.Height)&&(tWidth>=tHeight))
18                {
19                    bl=Convert.ToDouble(image.Height)/Convert.ToDouble(tHeight);
20                }
21                else if((image.Width>image.Height)&&(tWidth<tHeight))
22                {
23                    bl=Convert.ToDouble(image.Width)/Convert.ToDouble(tWidth);
24            
25                }
26                else
27            
28                    if((image.Width<=image.Height)&&(tWidth<=tHeight))
29                {
30                    if(image.Height/tHeight>=image.Width/tWidth)
31                    {
32                        bl=Convert.ToDouble(image.Width)/Convert.ToDouble(tWidth);
33                    
34                    }
35                    else
36                    {
37                        bl=Convert.ToDouble(image.Height)/Convert.ToDouble(tHeight);
38                    }
39                }
40                else
41                {
42                    if(image.Height/tHeight>=image.Width/tWidth)
43                    {
44                        bl=Convert.ToDouble(image.Height)/Convert.ToDouble(tHeight);
45                    
46                    }
47                    else
48                    {
49                        bl=Convert.ToDouble(image.Width)/Convert.ToDouble(tWidth);
50                    
51                    }
52            
53                }
54
55            
56                Bitmap b = new Bitmap(image ,Convert.ToInt32(image.Width/bl), Convert.ToInt32(image.Height/bl));
57
58                b.Save(newpath);
59                b.Dispose();
60                image.Dispose();
61                
62
63            }
64            catch
65            {
66            
67                
68            }
69            
70        }

     如果你能耐着心读到这里,你可以分辨一下,这两个加水印的函数和网上别人的代码有什么不同了。你也可以发现为什么网上的代码不能运行通过了。你只要动下小手,调试下就知道原因了。

     最后做得效果很好,附上帅图1,2,3
  带图片水印的。带文字水印

   你看看效果不错吧,这些水印都是设为放在右下角的。至于带图片的那张怎么位置不像在右下角,是因为背景图片太小,水印图片太大的原因。我只是随便做了下测试。新的效果图已经放上。
      如果你也是像我这样菜鸟的话,可能对你有点用处。大侠就不用看了。我写出来,其实是觉得网上连一些基础的代码都写的不好,还抄来抄去,更严重的是还是错误的。
     最新帅图:
     缩略图:
    由于原图太大上传不上来,只得把对比图发上来。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=826045

时间: 2024-10-24 22:29:31

[转]c# 添加图片水印,可以指定水印位置+生成缩略图的相关文章

按照指定大小,生成缩略图

缩略图 /* 说明:按照指定大小,生成缩略图 作者:Blue.Dream */using System;using System.Drawing;using System.Drawing.Imaging;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.IO; namespace test{ /// <summary> //

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

   代码如下 复制代码 class upfile {  public $filepath = "www.111cn.net/"; //上传文件存放文件夹  public $filesize = 1000000; //允许上传的大小  //如果要修改允许上传文件的类型  请搜索 [ switch ($upfiletype) { //文件类型  ]  public $reimagesize = array (   true, //是否生成缩略图   400, //缩略图宽   300,/

php图片上传类同时可生成缩略图与加水印

 代码如下 复制代码 class upimages {         var $annexfolder = "upload";//附件存放点,默认为:annex         var $smallfolder = "small";//缩略图存放路径,注:必须是放在 $annexfolder下的子目录,默认为:smallimg         var $markfolder = "mark";//水印图片存放处         var $upf

PHP+Ajax图片上传并且无刷新生成缩略图预览

XML/HTML Code  <div id="upload-wrapper">  <div align="center">    <form action="processupload.php" method="post" enctype="multipart/form-data" id="MyUploadForm">  <input name

php实现图片上传并利用ImageMagick生成缩略图_php技巧

使用ImageMagick,您可以轻松,更快地创建缩略图,比使用PHP的容易得多. <?php // Location to upload main image: $mainDir = $_SERVER['DOCUMENT_ROOT'].'/images/l/'; // Location to create the thumb image: $smalDir = $_SERVER['DOCUMENT_ROOT'].'/images/s/'; // Command to use: $command

PHP上传、生成缩略图、生成文字水印和图片水印

<?php/* '-##########################################-| '|     程序设计:(绿竹居)                | '|     MSN:[email]lzj_zhangjun@hotmail.com[/email]         | '|     Email:cszjun@gmail.com              | '|     结合自己以前做的上传和生成缩略和改编一个 '|     老前辈的生成图片水印做成这个     

gridview、图片-Gridview添加图片问题

问题描述 Gridview添加图片问题 gridview默认第一张图片的路径为空,点击添加图片,在arraylist 0 的位置添加图片地址,1的位置路径为空,可是第二张图片会引用第一张图片的路径,就好像没有刷新一样,求大神帮忙... 解决方案 gridview里面添加图片和文字[Android] 通过GridView仿微信动态添加本地图片 解决方案二: 贴一下我的代码![

PHP图片处理之使用imagecopy函数添加图片水印实例_php技巧

为图片添加水印也是图片处理中常见的功能.因为只要在页面中见到的图片都可以很轻松地拿到,你辛辛苦苦编辑的图片不想被别人不费吹灰之力拿走就用,所以为图片添加水印以确定版权,防止图片被盗用.制作水印可以使用文字(公司名称加网址),也可以使用图片(公司LOGO),图片水印效果更好一些,因为可以通过一些做图片软件进行美化.使用文字做水印,只需要在图片上画一些文字即可.如果制作图片水印,就需要先了解一下GD库中的imagecopy()函数,能复制图片的一部分.该函数的原型如下所示: 复制代码 代码如下: b

Word文档如何添加图片水印

  Word文档如何添加图片水印 1.打开需要添加图片水印的Word文档,接着点击工具栏的"页面布局"→"水印"→"自定义水印". 2.进入水印设置选项后点击"图片水印",然后选择相印的图片. 3.插入图片后我们还可以对图片水印的效果进行设置. 4.设置完毕返回文档即可看到添加图片水印后的效果.