ASP.NET 上传图片添加文字、Logo水印
2016-04-27 15:52
751 查看
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; /// <summary> /// Helper 的摘要说明 /// </summary> public class Helper { public class UpLoadHelper { #region 添加文字水印 /// <summary> /// 添加文字水印 /// </summary> /// <param name="text">水印文字</param> /// <param name="file">图片文件</param> public static void AttachText(string text, string file) { if (string.IsNullOrEmpty(text)) { return; } if (!File.Exists(file)) { return; } FileInfo oFile = new FileInfo(file); string strTempFile = Path.Combine(oFile.DirectoryName, Guid.NewGuid().ToString() + oFile.Extension); oFile.CopyTo(strTempFile); Image img = Image.FromFile(strTempFile); ImageFormat thisFormat = img.RawFormat; int nHeight = img.Height; int nWidth = img.Width; Bitmap outBmp = new Bitmap(nWidth, nHeight); Graphics g = Graphics.FromImage(outBmp); g.Clear(Color.White); // 设置画布的描绘质量 g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(img, new Rectangle(0, 0, nWidth, nHeight), 0, 0, nWidth, nHeight, GraphicsUnit.Pixel); 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++) { //设置字体,这里是用arial,黑体 crFont = new Font("arial", sizes[i], FontStyle.Bold); //Measure the Copyright string in this Font crSize = g.MeasureString(text, crFont); if ((ushort)crSize.Width < (ushort)nWidth) { break; } } //因为图片的高度可能不尽相同, 所以定义了 //从图片底部算起预留了5%的空间 int yPixlesFromBottom = (int)(nHeight * .08); //现在使用版权信息字符串的高度来确定要绘制的图像的字符串的y坐标 float yPosFromBottom = ((nHeight - yPixlesFromBottom) - (crSize.Height / 2)); //计算x坐标 float xCenterOfImg = (nWidth / 2); //把文本布局设置为居中 StringFormat StrFormat = new StringFormat(); StrFormat.Alignment = StringAlignment.Center; //通过Brush来设置黑色半透明 SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0, 0)); //绘制版权字符串 g.DrawString(text, //版权字符串文本 crFont, //字体 semiTransBrush2, //Brush new PointF(xCenterOfImg + 1, yPosFromBottom + 1), //位置 StrFormat); //设置成白色半透明 SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255)); //第二次绘制版权字符串来创建阴影效果 //记住移动文本的位置1像素 g.DrawString(text, //版权文本 crFont, //字体 semiTransBrush, //Brush new PointF(xCenterOfImg, yPosFromBottom), //位置 StrFormat); g.Dispose(); // 以下代码为保存图片时,设置压缩质量 EncoderParameters encoderParams = new EncoderParameters(); long[] quality = new long[1]; quality[0] = 100; EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); encoderParams.Param[0] = encoderParam; //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。 ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo jpegICI = null; for (int x = 0; x < arrayICI.Length; x++) { if (arrayICI[x].FormatDescription.Equals("JPEG")) { jpegICI = arrayICI[x];//设置JPEG编码 break; } } if (jpegICI != null) { outBmp.Save(file, jpegICI, encoderParams); } else { outBmp.Save(file, thisFormat); } img.Dispose(); outBmp.Dispose(); File.Delete(strTempFile); } #endregion } }
页面调用:Helper.UpLoadHelper.AttachText("水印文字", FileUpload1.PostedFile.FileName);
2,
/// <summary> /// 增加图片文字水印 /// </summary> /// <param name="filename">文件名</param> /// <param name="watermarkText">水印文字</param> /// <param name="watermarkStatus">图片水印位置</param> /// <param name="quality">附加图片质量,1是 0不是</param> public static void AddImageSignText(Image img, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize) { //System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(img); // .FromFile(filename); Graphics g = Graphics.FromImage(img); Font drawFont = new Font(fontname, fontsize, FontStyle.Regular, GraphicsUnit.Pixel); SizeF crSize; crSize = g.MeasureString(watermarkText, drawFont); float xpos = 0; float ypos = 0; switch (watermarkStatus) { case 1: xpos = (float)img.Width * (float).01; ypos = (float)img.Height * (float).01; break; case 2: xpos = ((float)img.Width * (float).50) - (crSize.Width / 2); ypos = (float)img.Height * (float).01; break; case 3: xpos = ((float)img.Width * (float).99) - crSize.Width; ypos = (float)img.Height * (float).01; break; case 4: xpos = (float)img.Width * (float).01; ypos = ((float)img.Height * (float).50) - (crSize.Height / 2); break; case 5: xpos = ((float)img.Width * (float).50) - (crSize.Width / 2); ypos = ((float)img.Height * (float).50) - (crSize.Height / 2); break; case 6: xpos = ((float)img.Width * (float).99) - crSize.Width; ypos = ((float)img.Height * (float).50) - (crSize.Height / 2); break; case 7: xpos = (float)img.Width * (float).01; ypos = ((float)img.Height * (float).99) - crSize.Height; break; case 8: xpos = ((float)img.Width * (float).50) - (crSize.Width / 2); ypos = ((float)img.Height * (float).99) - crSize.Height; break; case 9: xpos = ((float)img.Width * (float).99) - crSize.Width; ypos = ((float)img.Height * (float).99) - crSize.Height; break; } // System.Drawing.StringFormat StrFormat = new System.Drawing.StringFormat(); // StrFormat.Alignment = System.Drawing.StringAlignment.Center; // // g.DrawString(watermarkText, drawFont, new System.Drawing.SolidBrush(System.Drawing.Color.White), xpos + 1, ypos + 1, StrFormat); // g.DrawString(watermarkText, drawFont, new System.Drawing.SolidBrush(System.Drawing.Color.Black), xpos, ypos, StrFormat); g.DrawString(watermarkText, drawFont, new SolidBrush(Color.White), xpos + 1, ypos + 1); g.DrawString(watermarkText, drawFont, new SolidBrush(Color.Black), xpos, ypos); ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo ici = null; foreach (ImageCodecInfo codec in codecs) { if (codec.MimeType.IndexOf("jpeg") > -1) { ici = codec; } } EncoderParameters encoderParams = new EncoderParameters(); long[] qualityParam = new long[1]; if (quality < 0 || quality > 100) { quality = 80; } qualityParam[0] = quality; EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam); encoderParams.Param[0] = encoderParam; if (ici != null) { img.Save(filename, ici, encoderParams); } else { img.Save(filename); } g.Dispose(); //bmp.Dispose(); img.Dispose(); }
页面调用:、
Image img = Image.FromStream(this.FileUpload1.PostedFile.InputStream);
Helper.UpLoadHelper.AddImageSignText(img, FileUpload1.PostedFile.FileName, "水印文字", 1, 100, "宋体", 20);
3,加上LOGO图片水印
/// <summary> /// 加上logo图片水印 /// </summary> /// <param name="FilePath">源图片地址</param> /// <param name="SavePath">图片保存路径</param> public static void AddWaterMark(string FilePath, string SavePath,string logoPath) { Bitmap bitmap = new Bitmap(FilePath); Graphics g = Graphics.FromImage(bitmap); System.Drawing.Image logo = System.Drawing.Image.FromFile(logoPath);//加载logo图片 if (bitmap.Width < logo.Width || bitmap.Height <= logo.Height) return; //下面定义一个矩形区域,以后在这个矩形里画上透明背景和白色字体 float rectWidth = (float)logo.Width; float rectHeight = (float)logo.Height; float rectX = bitmap.Width - rectWidth; float rectY = bitmap.Height - rectHeight; //声明矩形域 RectangleF textArea = new RectangleF(rectX, rectY, rectWidth, rectHeight); g.DrawImage(logo, textArea); MemoryStream ms = new MemoryStream(); //保存为Jpg类型 bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); g.Dispose(); bitmap.Dispose(); logo.Dispose(); FileStream fs = new FileStream(SavePath, FileMode.OpenOrCreate); fs.Write(ms.ToArray(), 0, ms.ToArray().Length); fs.Close(); }
页面调用:
Helper.UpLoadHelper.AddWaterMark(FileUpload1.PostedFile.FileName, Server.MapPath("~/images/aa.jpg"), FileUpload2.PostedFile.FileName);
相关文章推荐
- 【中国互联网不眠夜】Struts2漏洞百出,OneRASP鼎力相助
- 【中国互联网不眠夜】Struts2漏洞百出,OneRASP鼎力相助
- 【中国互联网不眠夜】Struts2漏洞百出,OneRASP鼎力相助
- 构建高性能ASP.NET应用的几点建议
- 使用veil-evasion+metasploit生成基于python的后门软件
- 【ASP.NET MVC 回顾】HtmlHepler应用-分页组件
- 什么是ASP?如何打开ASP文件
- ASP.NET: Bind Dropdownlist With Images
- asp.net下ajax.ajaxMethod使用方法
- ireport jasperreport学习笔记(1)
- asp.net web api - 使用多个Xml文件显示帮助文档
- ASP.NET WebForm 通过 PagedDataSource 实现 Repeater 的分页
- 在ASP.NET 2.0中操作数据之一:创建一个数据访问层
- Datatables 在asp.net mvc中的使用
- ASP.NET MVC数组模型绑定
- asp.net 后台执行js
- ASP.NET-常用正则表达式
- Asp.net页面中调用soapheader进行验证的操作步骤
- spring使用aspectj开发的增强类型注解和aspectj在spring中用到的切点函数
- ASP.NET中 ObjectDataSource控件的DataObjectTypeName属性