您的位置:首页 > 编程语言 > ASP

ASP.NET图片加水印的实现代码

2010-06-09 10:58 561 查看
]# using System;
# using System.Collections.Generic;
# using System.Text;
#
# using System.IO;
# using System.Drawing;
# using System.Drawing.Imaging;
# using System.Drawing.Drawing2D;
#
# namespace DocMIS.AppConfig
# {
#     /**//// < summary>
#     /// 水印位置
#     /// < /summary>
#     public enum ImagePosition
#     {
#         /**//// < summary>
#         /// 左上
#         /// < /summary>
#         LeftTop,
#         /**//// < summary>
#         /// 左下
#         /// < /summary>
#         LeftBottom,
#         /**//// < summary>
#         /// 右上
#         /// < /summary>
#         RightTop,
#         /**//// < summary>
#         /// 右下
#         /// < /summary>
#         RigthBottom,
#         /**//// < summary>
#         /// 顶部居中
#         /// < /summary>
#         TopMiddle,
#         /**//// < summary>
#         /// 底部居中
#         /// < /summary>
#         BottomMiddle,
#         /**//// < summary>
#         /// 中心
#         /// < /summary>
#         Center
#     }
#
#     /**//// < summary>
#     /// 图像操作类(主要用于给图片加上透明文字水印)
#     /// < /summary>
#     class ImageWater_Word
#     {
#         private string _ErrMsg;
#         #region 出错信息
#         /**//// < summary>
#         /// 出错信息
#         /// < /summary>
#         public string ErrMsg
#         {
#             get { return _ErrMsg; }
#             set { _ErrMsg = value; }
#         }
#         #endregion
#
#
#         #region 将文件转换成流
#         //public byte[] SetImageToByteArray(string fileName, ref string fileSize)
#         /**//// < summary>
#         /// 将文件转换成流
#         /// < /summary>
#         /// < param name="fileName">文件全路径< /param>
#         /// < returns>< /returns>
#         private byte[] SetImageToByteArray(string fileName)
#         {
#             byte[] image = null;
#             try
#             {
#                 FileStream fs = new FileStream(fileName, FileMode.Open);
#                 FileInfo fileInfo = new FileInfo(fileName);
#                 //fileSize = Convert.ToDecimal(fileInfo.Length / 1024).ToString("f2") + " K";
#                 int streamLength = (int)fs.Length;
#                 image = new byte[streamLength];
#                 fs.Read(image, 0, streamLength);
#                 fs.Close();
#                 return image;
#             }
#             catch
#             {
#                 return image;
#             }
#         }
#         #endregion
#
#         #region 将byte转换成MemoryStream类型
#         /**//// < summary>
#         /// ASP.NET图片加水印:将byte转换成MemoryStream类型
#         /// < /summary>
#         /// < param name="mybyte">byte[]变量< /param>
#         /// < returns>< /returns>
#         private MemoryStream ByteToStream(byte[] mybyte)
#         {
#             MemoryStream mymemorystream = new MemoryStream(mybyte, 0, mybyte.Length);
#             return mymemorystream;
#         }
#         #endregion
#
#         #region 将byte转换成Image文件
#         /**//// < summary>
#         /// ASP.NET图片加水印:将byte转换成Image文件
#         /// < /summary>
#         /// < param name="mybyte">byte[]变量< /param>
#         /// < returns>< /returns>
#         private System.Drawing.Image SetByteToImage(byte[] mybyte)
#         {
#             System.Drawing.Image image;
#             MemoryStream mymemorystream = new MemoryStream(mybyte, 0, mybyte.Length);
#             image = System.Drawing.Image.FromStream(mymemorystream);
#             return image;
#         }
#         #endregion
#
#
#         #region 批量在图片上添加透明水印文字
#         /**//// < summary>
#         /// ASP.NET图片加水印:批量在图片上添加透明水印文字
#         /// < /summary>
#         /// < param name="arrsourcePicture">原来图片地址(路径+文件名)< /param>
#         /// < param name="waterWords">需要添加到图片上的文字< /param>
#         /// < param name="alpha">透明度(0.1~1.0之间)< /param>
#         /// < param name="position">文字显示的位置< /param>
#         /// < param name="fRewrite">是否覆盖原图片(如果不覆盖,那么将在同目录下生成一个文件名带0607的文件)< /param>
#         /// < returns>< /returns>
#         public bool DrawWords(string[] arrsourcePicture, string waterWords, float alpha, ImagePosition position, bool fRewrite)
#         {
#             foreach (string imgPath in arrsourcePicture)
#             {
#                 if (!DrawWords(imgPath, waterWords, alpha, position, fRewrite))
#                 {
#                     _ErrMsg += "——处理文件:" + imgPath + " 时出错。";
#                     return false;
#                 }
#             }
#             return true;
#         }
#         #endregion
#
#         #region 在图片上添加透明水印文字
#         /**//// < summary>
#         /// ASP.NET图片加水印:在图片上添加透明水印文字
#         /// < /summary>
#         /// < param name="sourcePicture">原来图片地址(路径+文件名)< /param>
#         /// < param name="waterWords">需要添加到图片上的文字< /param>
#         /// < param name="alpha">透明度(0.1~1.0之间)< /param>
#         /// < param name="position">文字显示的位置< /param>
#         /// < param name="fRewrite">是否覆盖原图片(如果不覆盖,那么将在同目录下生成一个文件名带0607的文件)< /param>
#         /// < returns>< /returns>
#         public bool DrawWords(string sourcePicture, string waterWords, float alpha, ImagePosition position, bool fRewrite)
#         {
#             if (!System.IO.File.Exists(sourcePicture))
#             {
#                 _ErrMsg = "文件不存在!";
#                 return false;
#             }
#             string fileExtension = System.IO.Path.GetExtension(sourcePicture).ToLower();
#             if (fileExtension != ".gif" && fileExtension != ".jpg" && fileExtension != ".png" && fileExtension != ".bmp")
#             {
#                 _ErrMsg = "不是图片文件!";
#                 return false;
#             }
#
#             Image imgPhoto = null;
#             Bitmap bmPhoto = null;
#             Graphics grPhoto = null;
#             try
#             {
#                 //创建一个图片对象用来装载要被添加水印的图片
#                 imgPhoto = Image.FromStream(ByteToStream(SetImageToByteArray(sourcePicture)));
#
#                 //获取图片的宽和高
#                 int phWidth = imgPhoto.Width;
#                 int phHeight = imgPhoto.Height;
#
#                 //建立一个bitmap,和我们需要加水印的图片一样大小
#                 bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Format24bppRgb);
#
#                 //SetResolution:设置此 Bitmap 的分辨率
#                 //这里直接将我们需要添加水印的图片的分辨率赋给了bitmap
#                 bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
#
#                 //Graphics:封装一个 GDI+ 绘图图面。
#                 grPhoto = Graphics.FromImage(bmPhoto);
#
#                 //设置图形的品质
#                 grPhoto.SmoothingMode = SmoothingMode.AntiAlias;
#
#                 //将我们要添加水印的图片按照原始大小描绘(复制)到图形中
#                 grPhoto.DrawImage(
#                  imgPhoto,                                           //   要添加水印的图片
#                  new Rectangle(0, 0, phWidth, phHeight), //  根据要添加的水印图片的宽和高
#                  0,                                                     //  X方向从0点开始描绘
#                  0,                                                     // Y方向
#                  phWidth,                                            //  X方向描绘长度
#                  phHeight,                                           //  Y方向描绘长度
#                  GraphicsUnit.Pixel);                              // 描绘的单位,这里用的是像素
#
#                 //根据图片的大小我们来确定添加上去的文字的大小
#                 //在这里我们定义一个数组来确定
#                 int[] sizes = new int[] { 48, 36, 28, 24, 16, 14, 12, 10 };
#
#                 //字体
#                 Font crFont = null;
#                 //矩形的宽度和高度,SizeF有三个属性,分别为Height高,width宽,IsEmpty是否为空
#                 SizeF crSize = new SizeF();
#
#                 //利用一个循环语句来选择我们要添加文字的型号
#                 //直到它的长度比图片的宽度小
#                 for (int i = 0; i <  sizes.Length; i++)
#                 {
#                     crFont = new Font("arial", sizes[i], FontStyle.Bold);
#
#                     //测量用指定的 Font 对象绘制并用指定的 StringFormat 对象格式化的指定字符串。
#                     crSize = grPhoto.MeasureString(waterWords, crFont);
#
#                     // ushort 关键字表示一种整数数据类型
#                     if ((ushort)crSize.Width <  (ushort)phWidth)
#                         break;
#                 }
#
#                 //截边5%的距离,定义文字显示(由于不同的图片显示的高和宽不同,所以按百分比截取)
#                 int yPixlesFromBottom = (int)(phHeight * .05);
#
#                 //定义在图片上文字的位置
#                 float wmHeight = crSize.Height;
#                 float wmWidth = crSize.Width;
#
#                 float xPosOfWm;
#                 float yPosOfWm;
#
#                 //设置水印的位置
#                 switch (position)
#                 {
#                     case ImagePosition.BottomMiddle:
#                         xPosOfWm = phWidth / 2;
#                         yPosOfWm = phHeight - wmHeight - 10;
#                         break;
#                     case ImagePosition.Center:
#                         xPosOfWm = phWidth / 2;
#                         yPosOfWm = phHeight / 2;
#                         break;
#                     case ImagePosition.LeftBottom:
#                         xPosOfWm = wmWidth;
#                         yPosOfWm = phHeight - wmHeight - 10;
#                         break;
#                     case ImagePosition.LeftTop:
#                         xPosOfWm = wmWidth / 2;
#                         yPosOfWm = wmHeight / 2;
#                         break;
#                     case ImagePosition.RightTop:
#                         xPosOfWm = phWidth - wmWidth - 10;
#                         yPosOfWm = wmHeight;
#                         break;
#                     case ImagePosition.RigthBottom:
#                         xPosOfWm = phWidth - wmWidth - 10;
#                         yPosOfWm = phHeight - wmHeight - 10;
#                         break;
#                     case ImagePosition.TopMiddle:
#                         xPosOfWm = phWidth / 2;
#                         yPosOfWm = wmWidth;
#                         break;
#                     default:
#                         xPosOfWm = wmWidth;
#                         yPosOfWm = phHeight - wmHeight - 10;
#                         break;
#                 }
#                 //封装文本布局信息(如对齐、文字方向和 Tab 停靠位),显示操作(如省略号插入和国家标准 (National) 数字替换)和 OpenType 功能。
#                 StringFormat StrFormat = new StringFormat();
#
#                 //定义需要印的文字居中对齐
#                 StrFormat.Alignment = StringAlignment.Center;
#
#                 //SolidBrush:定义单色画笔。画笔用于填充图形形状,如矩形、椭圆、扇形、多边形和封闭路径。
#                 //这个画笔为描绘阴影的画笔,呈灰色
#                 int m_alpha = Convert.ToInt32(256 * alpha);
#                 SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(m_alpha, 0, 0, 0));
#
#                 //描绘文字信息,这个图层向右和向下偏移一个像素,表示阴影效果
#                 //DrawString 在指定矩形并且用指定的 Brush 和 Font 对象绘制指定的文本字符串。
#                 grPhoto.DrawString(waterWords,                                    //string of text
#                                            crFont,                                         //font
#                                            semiTransBrush2,                            //Brush
#                                            new PointF(xPosOfWm + 1, yPosOfWm + 1),  //Position
#                                            StrFormat);
#
#                 //从四个 ARGB 分量(alpha、红色、绿色和蓝色)值创建 Color 结构,这里设置透明度为153
#                 //这个画笔为描绘正式文字的笔刷,呈白色
#                 SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));
#
#                 //第二次绘制这个图形,建立在第一次描绘的基础上
#                 grPhoto.DrawString(waterWords,                 //string of text
#                                            crFont,                                   //font
#                                            semiTransBrush,                           //Brush
#                                            new PointF(xPosOfWm, yPosOfWm),  //Position
#                                            StrFormat);
#
#                 //imgPhoto是我们建立的用来装载最终图形的Image对象
#                 //bmPhoto是我们用来制作图形的容器,为Bitmap对象
#                 imgPhoto = bmPhoto;
#                 //释放资源,将定义的Graphics实例grPhoto释放,grPhoto功德圆满
#                 //grPhoto.Dispose();
#
#                 //将grPhoto保存
#                 if (fRewrite)
#                 {
#                     imgPhoto.Save(sourcePicture);
#                 }
#                 else
#                 {
#                     // 目标图片名称及全路径
#                     string targetImage = sourcePicture.Replace(System.IO.Path.GetExtension(sourcePicture), "") + "_0607" + fileExtension;
#                     imgPhoto.Save(targetImage);
#                 }
#                 //imgPhoto.Dispose();
#                 return true;
#             }
#             catch (Exception ex)
#             {
#                 _ErrMsg = ex.Message;
#                 return false;
#             }
#             finally
#             {
#                 if (imgPhoto != null)
#                     imgPhoto.Dispose();
#                 if (bmPhoto != null)
#                     bmPhoto.Dispose();
#                 if (grPhoto != null)
#                     grPhoto.Dispose();
#             }
#
#
#         }
#         #endregion
#
#     }
# }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: