ASP.NET图片加水印的实现代码(C#)

开发 后端
本文提供了一段ASP.NET图片加水印的实现代码(C#)。代码实现的水印为透明文字水印,可以定义文字水印的位置和透明度。

本文介绍ASP.NET图片加水印的方法。水印为透明文字水印,可以定义文字水印的位置和透明度。

代码分几个部分,请查看代码中的注释。

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. using System.IO;  
  6. using System.Drawing;  
  7. using System.Drawing.Imaging;  
  8. using System.Drawing.Drawing2D;  
  9.  
  10. namespace DocMIS.AppConfig  
  11. {  
  12.     /**//// < summary>  
  13.     /// 水印位置  
  14.     /// < /summary>  
  15.     public enum ImagePosition  
  16.     {  
  17.         /**//// < summary>  
  18.         /// 左上  
  19.         /// < /summary>  
  20.         LeftTop,  
  21.         /**//// < summary>  
  22.         /// 左下  
  23.         /// < /summary>  
  24.         LeftBottom,  
  25.         /**//// < summary>  
  26.         /// 右上  
  27.         /// < /summary>  
  28.         RightTop,  
  29.         /**//// < summary>  
  30.         /// 右下  
  31.         /// < /summary>  
  32.         RigthBottom,  
  33.         /**//// < summary>  
  34.         /// 顶部居中  
  35.         /// < /summary>  
  36.         TopMiddle,  
  37.         /**//// < summary>  
  38.         /// 底部居中  
  39.         /// < /summary>  
  40.         BottomMiddle,  
  41.         /**//// < summary>  
  42.         /// 中心  
  43.         /// < /summary>  
  44.         Center   
  45.     }  
  46.  
  47.     /**//// < summary>  
  48.     /// 图像操作类(主要用于给图片加上透明文字水印)  
  49.     /// < /summary>  
  50.     class ImageWater_Word  
  51.     {  
  52.         private string _ErrMsg;  
  53.         #region 出错信息  
  54.         /**//// < summary>  
  55.         /// 出错信息  
  56.         /// < /summary>  
  57.         public string ErrMsg  
  58.         {  
  59.             get { return _ErrMsg; }  
  60.             set { _ErrMsg = value; }  
  61.         }  
  62.         #endregion  
  63.  
  64.  
  65.         #region 将文件转换成流  
  66.         //public byte[] SetImageToByteArray(string fileName, ref string fileSize)  
  67.         /**//// < summary>  
  68.         /// 将文件转换成流  
  69.         /// < /summary>  
  70.         /// < param name="fileName">文件全路径< /param>  
  71.         /// < returns>< /returns>  
  72.         private byte[] SetImageToByteArray(string fileName)  
  73.         {  
  74.             byte[] image = null;  
  75.             try 
  76.             {  
  77.                 FileStream fs = new FileStream(fileName, FileMode.Open);  
  78.                 FileInfo fileInfo = new FileInfo(fileName);  
  79.                 //fileSize = Convert.ToDecimal(fileInfo.Length / 1024).ToString("f2") + " K";  
  80.                 int streamLength = (int)fs.Length;  
  81.                 image = new byte[streamLength];  
  82.                 fs.Read(image, 0, streamLength);  
  83.                 fs.Close();  
  84.                 return image;  
  85.             }  
  86.             catch 
  87.             {  
  88.                 return image;  
  89.             }  
  90.         }  
  91.         #endregion  
  92.  
  93.         #region 将byte转换成MemoryStream类型  
  94.         /**//// < summary>  
  95.         /// ASP.NET图片加水印:将byte转换成MemoryStream类型  
  96.         /// < /summary>  
  97.         /// < param name="mybyte">byte[]变量< /param>  
  98.         /// < returns>< /returns>  
  99.         private MemoryStream ByteToStream(byte[] mybyte)  
  100.         {  
  101.             MemoryStream mymemorystream = new MemoryStream(mybyte, 0, mybyte.Length);  
  102.             return mymemorystream;  
  103.         }  
  104.         #endregion  
  105.  
  106.         #region 将byte转换成Image文件  
  107.         /**//// < summary>  
  108.         /// ASP.NET图片加水印:将byte转换成Image文件  
  109.         /// < /summary>  
  110.         /// < param name="mybyte">byte[]变量< /param>  
  111.         /// < returns>< /returns>  
  112.         private System.Drawing.Image SetByteToImage(byte[] mybyte)  
  113.         {  
  114.             System.Drawing.Image image;  
  115.             MemoryStream mymemorystream = new MemoryStream(mybyte, 0, mybyte.Length);  
  116.             image = System.Drawing.Image.FromStream(mymemorystream);  
  117.             return image;  
  118.         }  
  119.         #endregion  
  120.  
  121.  
  122.         #region 批量在图片上添加透明水印文字  
  123.         /**//// < summary>  
  124.         /// ASP.NET图片加水印:批量在图片上添加透明水印文字  
  125.         /// < /summary>  
  126.         /// < param name="arrsourcePicture">原来图片地址(路径+文件名)< /param>  
  127.         /// < param name="waterWords">需要添加到图片上的文字< /param>  
  128.         /// < param name="alpha">透明度(0.1~1.0之间)< /param>  
  129.         /// < param name="position">文字显示的位置< /param>  
  130.         /// < param name="fRewrite">是否覆盖原图片(如果不覆盖,那么将在同目录下生成一个文件名带0607的文件)< /param>  
  131.         /// < returns>< /returns>  
  132.         public bool DrawWords(string[] arrsourcePicture, string waterWords, float alpha, ImagePosition position, bool fRewrite)  
  133.         {  
  134.             foreach (string imgPath in arrsourcePicture)  
  135.             {  
  136.                 if (!DrawWords(imgPath, waterWords, alpha, position, fRewrite))  
  137.                 {  
  138.                     _ErrMsg += "——处理文件:" + imgPath + " 时出错。";  
  139.                     return false;  
  140.                 }  
  141.             }  
  142.             return true;  
  143.         }  
  144.         #endregion  
  145.  
  146.         #region 在图片上添加透明水印文字  
  147.         /**//// < summary>  
  148.         /// ASP.NET图片加水印:在图片上添加透明水印文字  
  149.         /// < /summary>  
  150.         /// < param name="sourcePicture">原来图片地址(路径+文件名)< /param>  
  151.         /// < param name="waterWords">需要添加到图片上的文字< /param>  
  152.         /// < param name="alpha">透明度(0.1~1.0之间)< /param>  
  153.         /// < param name="position">文字显示的位置< /param>  
  154.         /// < param name="fRewrite">是否覆盖原图片(如果不覆盖,那么将在同目录下生成一个文件名带0607的文件)< /param>  
  155.         /// < returns>< /returns>  
  156.         public bool DrawWords(string sourcePicture, string waterWords, float alpha, ImagePosition position, bool fRewrite)  
  157.         {  
  158.             if (!System.IO.File.Exists(sourcePicture))  
  159.             {  
  160.                 _ErrMsg = "文件不存在!";  
  161.                 return false;  
  162.             }  
  163.             string fileExtension = System.IO.Path.GetExtension(sourcePicture).ToLower();  
  164.             if (fileExtension != ".gif" && fileExtension != ".jpg" && fileExtension != ".png" && fileExtension != ".bmp")  
  165.             {  
  166.                 _ErrMsg = "不是图片文件!";  
  167.                 return false;  
  168.             }  
  169.  
  170.             Image imgPhoto = null;  
  171.             Bitmap bmPhoto = null;  
  172.             Graphics grPhoto = null;  
  173.             try 
  174.             {  
  175.                 //创建一个图片对象用来装载要被添加水印的图片  
  176.                 imgPhoto = Image.FromStream(ByteToStream(SetImageToByteArray(sourcePicture)));  
  177.  
  178.                 //获取图片的宽和高  
  179.                 int phWidth = imgPhoto.Width;  
  180.                 int phHeight = imgPhoto.Height;  
  181.  
  182.                 //建立一个bitmap,和我们需要加水印的图片一样大小  
  183.                 bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Format24bppRgb);  
  184.  
  185.                 //SetResolution:设置此 Bitmap 的分辨率  
  186.                 //这里直接将我们需要添加水印的图片的分辨率赋给了bitmap  
  187.                 bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);  
  188.  
  189.                 //Graphics:封装一个 GDI+ 绘图图面。  
  190.                 grPhoto = Graphics.FromImage(bmPhoto);  
  191.  
  192.                 //设置图形的品质  
  193.                 grPhoto.SmoothingMode = SmoothingMode.AntiAlias;  
  194.  
  195.                 //将我们要添加水印的图片按照原始大小描绘(复制)到图形中  
  196.                 grPhoto.DrawImage(  
  197.                  imgPhoto,                                           //   要添加水印的图片  
  198.                  new Rectangle(0, 0, phWidth, phHeight), //  根据要添加的水印图片的宽和高  
  199.                  0,                                                     //  X方向从0点开始描绘  
  200.                  0,                                                     // Y方向   
  201.                  phWidth,                                            //  X方向描绘长度  
  202.                  phHeight,                                           //  Y方向描绘长度  
  203.                  GraphicsUnit.Pixel);                              // 描绘的单位,这里用的是像素  
  204.  
  205.                 //根据图片的大小我们来确定添加上去的文字的大小  
  206.                 //在这里我们定义一个数组来确定  
  207.                 int[] sizes = new int[] { 48, 36, 28, 24, 16, 14, 12, 10 };  
  208.  
  209.                 //字体  
  210.                 Font crFont = null;  
  211.                 //矩形的宽度和高度,SizeF有三个属性,分别为Height高,width宽,IsEmpty是否为空  
  212.                 SizeF crSize = new SizeF();  
  213.  
  214.                 //利用一个循环语句来选择我们要添加文字的型号  
  215.                 //直到它的长度比图片的宽度小  
  216.                 for (int i = 0; i <  sizes.Length; i++)  
  217.                 {  
  218.                     crFont = new Font("arial", sizes[i], FontStyle.Bold);  
  219.  
  220.                     //测量用指定的 Font 对象绘制并用指定的 StringFormat 对象格式化的指定字符串。  
  221.                     crSize = grPhoto.MeasureString(waterWords, crFont);  
  222.  
  223.                     // ushort 关键字表示一种整数数据类型  
  224.                     if ((ushort)crSize.Width <  (ushort)phWidth)  
  225.                         break;  
  226.                 }  
  227.  
  228.                 //截边5%的距离,定义文字显示(由于不同的图片显示的高和宽不同,所以按百分比截取)  
  229.                 int yPixlesFromBottom = (int)(phHeight * .05);  
  230.  
  231.                 //定义在图片上文字的位置  
  232.                 float wmHeight = crSize.Height;  
  233.                 float wmWidth = crSize.Width;  
  234.  
  235.                 float xPosOfWm;  
  236.                 float yPosOfWm;  
  237.  
  238.                 //设置水印的位置  
  239.                 switch (position)  
  240.                 {  
  241.                     case ImagePosition.BottomMiddle:  
  242.                         xPosOfWm = phWidth / 2;  
  243.                         yPosOfWm = phHeight - wmHeight - 10;  
  244.                         break;  
  245.                     case ImagePosition.Center:  
  246.                         xPosOfWm = phWidth / 2;  
  247.                         yPosOfWm = phHeight / 2;  
  248.                         break;  
  249.                     case ImagePosition.LeftBottom:  
  250.                         xPosOfWm = wmWidth;  
  251.                         yPosOfWm = phHeight - wmHeight - 10;  
  252.                         break;  
  253.                     case ImagePosition.LeftTop:  
  254.                         xPosOfWm = wmWidth / 2;  
  255.                         yPosOfWm = wmHeight / 2;  
  256.                         break;  
  257.                     case ImagePosition.RightTop:  
  258.                         xPosOfWm = phWidth - wmWidth - 10;  
  259.                         yPosOfWm = wmHeight;  
  260.                         break;  
  261.                     case ImagePosition.RigthBottom:  
  262.                         xPosOfWm = phWidth - wmWidth - 10;  
  263.                         yPosOfWm = phHeight - wmHeight - 10;  
  264.                         break;  
  265.                     case ImagePosition.TopMiddle:  
  266.                         xPosOfWm = phWidth / 2;  
  267.                         yPosOfWm = wmWidth;  
  268.                         break;  
  269.                     default:  
  270.                         xPosOfWm = wmWidth;  
  271.                         yPosOfWm = phHeight - wmHeight - 10;  
  272.                         break;  
  273.                 }  
  274.                 //封装文本布局信息(如对齐、文字方向和 Tab 停靠位),显示操作(如省略号插入和国家标准 (National) 数字替换)和 OpenType 功能。  
  275.                 StringFormat StrFormat = new StringFormat();  
  276.  
  277.                 //定义需要印的文字居中对齐  
  278.                 StrFormat.Alignment = StringAlignment.Center;  
  279.  
  280.                 //SolidBrush:定义单色画笔。画笔用于填充图形形状,如矩形、椭圆、扇形、多边形和封闭路径。  
  281.                 //这个画笔为描绘阴影的画笔,呈灰色  
  282.                 int m_alpha = Convert.ToInt32(256 * alpha);  
  283.                 SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(m_alpha, 0, 0, 0));  
  284.  
  285.                 //描绘文字信息,这个图层向右和向下偏移一个像素,表示阴影效果  
  286.                 //DrawString 在指定矩形并且用指定的 Brush 和 Font 对象绘制指定的文本字符串。  
  287.                 grPhoto.DrawString(waterWords,                                    //string of text  
  288.                                            crFont,                                         //font  
  289.                                            semiTransBrush2,                            //Brush  
  290.                                            new PointF(xPosOfWm + 1, yPosOfWm + 1),  //Position  
  291.                                            StrFormat);  
  292.  
  293.                 //从四个 ARGB 分量(alpha、红色、绿色和蓝色)值创建 Color 结构,这里设置透明度为153  
  294.                 //这个画笔为描绘正式文字的笔刷,呈白色  
  295.                 SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));  
  296.  
  297.                 //第二次绘制这个图形,建立在第一次描绘的基础上  
  298.                 grPhoto.DrawString(waterWords,                 //string of text  
  299.                                            crFont,                                   //font  
  300.                                            semiTransBrush,                           //Brush  
  301.                                            new PointF(xPosOfWm, yPosOfWm),  //Position  
  302.                                            StrFormat);  
  303.  
  304.                 //imgPhoto是我们建立的用来装载最终图形的Image对象  
  305.                 //bmPhoto是我们用来制作图形的容器,为Bitmap对象  
  306.                 imgPhoto = bmPhoto;  
  307.                 //释放资源,将定义的Graphics实例grPhoto释放,grPhoto功德圆满  
  308.                 //grPhoto.Dispose();  
  309.  
  310.                 //将grPhoto保存  
  311.                 if (fRewrite)  
  312.                 {  
  313.                     imgPhoto.Save(sourcePicture);  
  314.                 }  
  315.                 else 
  316.                 {  
  317.                     // 目标图片名称及全路径  
  318.                     string targetImage = sourcePicture.Replace(System.IO.Path.GetExtension(sourcePicture), "") + "_0607" + fileExtension;  
  319.                     imgPhoto.Save(targetImage);  
  320.                 }  
  321.                 //imgPhoto.Dispose();  
  322.                 return true;  
  323.             }  
  324.             catch (Exception ex)  
  325.             {  
  326.                 _ErrMsg = ex.Message;  
  327.                 return false;  
  328.             }  
  329.             finally 
  330.             {  
  331.                 if (imgPhoto != null)  
  332.                     imgPhoto.Dispose();  
  333.                 if (bmPhoto != null)  
  334.                     bmPhoto.Dispose();  
  335.                 if (grPhoto != null)  
  336.                     grPhoto.Dispose();  
  337.             }  
  338.  
  339.  
  340.         }  
  341.         #endregion  
  342.  
  343.     }  
  344. }  
  345.  

以上就是ASP.NET图片加水印并处理水印位置和透明度的实现代码。

本文来自wf5360308(峰)的博客。

【编辑推荐】

  1. ASP.NET(VB)应用之图片增加水印文字浅析
  2. ASP.NET注释使用技巧浅析
  3. ASP.NET trace的使用浅析
  4. ASP.NET trace在页面执行中的应用浅析
  5. ASP.NET Request对象的属性介绍
责任编辑:yangsai 来源: 百度空间
相关推荐

2009-07-29 16:06:42

图片增加水印

2009-08-12 14:10:37

asp.net分页代码

2009-07-15 18:25:52

ASP.NET控件数组

2009-08-20 10:13:49

ASP.NET和C#的

2009-08-03 14:33:02

.NET平台c#ASP.NET

2009-12-07 15:41:51

PHP图片加水印

2009-07-28 17:03:55

ASP.NET VB.

2016-09-06 21:09:35

Phpgd库图片水印

2009-08-10 17:17:10

ASP.NET安装部署

2015-06-23 16:47:53

ASP.NET

2009-08-05 16:59:55

ASP.NET组件设计

2009-08-13 17:52:27

C#数据采集

2012-04-06 13:52:58

ASP.NET

2009-08-04 11:29:14

HTML代码ASP.NET控件

2009-08-04 17:16:16

ASP.NET代码优化

2009-07-27 14:13:56

调用c#方法Java scriptASP.NET

2009-07-22 17:45:11

ASP.NET插件

2009-07-20 15:44:32

ASP.NET MVC

2015-03-03 13:15:19

ASP.NET大文件下载实现思路

2011-06-21 10:26:37

点赞
收藏

51CTO技术栈公众号