当前位置: 移动技术网 > IT编程>开发语言>.net > asp .net实现给图片添加图片水印方法示例

asp .net实现给图片添加图片水印方法示例

2017年12月08日  | 移动技术网IT编程  | 我要评论
前言 本文主要给大家介绍的是asp .net实现给图片添加图片水印的方法,注意是图片水印,需要的朋友们可以参考学习,下面话不多说来看看详细的介绍吧。 方法如下 首先写

前言

本文主要给大家介绍的是asp .net实现给图片添加图片水印的方法,注意是图片水印,需要的朋友们可以参考学习,下面话不多说来看看详细的介绍吧。

方法如下

首先写好一个写入图片水印的类,先创建一个imagewriter类库   (该类中有包含枚举类型和方法)

using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.io;
using system.collections;
using system.drawing;
using system.drawing.drawing2d;
using system.drawing.imaging;
namespace imagewriter
{
 /// <summary>
 /// 图片处理类
 /// </summary>
 public class imagemanager
 {
 #region 变量声明开始
 /// <summary>
 /// 枚举: 水印位置
 /// </summary>
 public enum watermarkposition
 {
  /// <summary>
  /// 左上
  /// </summary>
  lefttop,
  /// <summary>
  /// 左中
  /// </summary>
  left,
  /// <summary>
  /// 左下
  /// </summary>
  leftbottom,
  /// <summary>
  /// 正上
  /// </summary>
  top,
  /// <summary>
  /// 正中
  /// </summary>
  center,
  /// <summary>
  /// 正下
  /// </summary>
  bottom,
  /// <summary>
  /// 右上
  /// </summary>
  righttop,
  /// <summary>
  /// 右中
  /// </summary>
  rightcenter,
  /// <summary>
  /// 右下
  /// </summary>
  rigthbottom
 }
 #endregion 变量声明结束
 #region 构造函数开始
 /// <summary>
 /// 构造函数: 默认
 /// </summary>
 public imagemanager()
 { }
 #endregion 构造函数结束
 #region 私有函数开始
 /// <summary>
 /// 获取: 图片去扩展名(包含完整路径及其文件名)小写字符串
 /// </summary>
 /// <param name="path">图片路径(包含完整路径,文件名及其扩展名): string</param>
 /// <returns>返回: 图片去扩展名(包含完整路径及其文件名)小写字符串: string</returns>
 private string getfilename(string path)
 {
  return path.remove(path.lastindexof('.')).tolower();
 }
 /// <summary>
 /// 获取: 图片以'.'开头的小写字符串扩展名
 /// </summary>
 /// <param name="path">图片路径(包含完整路径,文件名及其扩展名): string</param>
 /// <returns>返回: 图片以'.'开头的小写字符串扩展名: string</returns>
 private string getextension(string path)
 {
  return path.remove(0, path.lastindexof('.')).tolower();
 }
 /// <summary>
 /// 获取: 图片以 '.' 开头的小写字符串扩展名对应的 system.drawing.imaging.imageformat 对象
 /// </summary>
 /// <param name="format">以 '. '开头的小写字符串扩展名: string</param>
 /// <returns>返回: 图片以 '.' 开头的小写字符串扩展名对应的 system.drawing.imaging.imageformat 对象: system.drawing.imaging.imageformat</returns>
 private imageformat getimageformat(string format)
 {
  switch (format)
  {
  case ".bmp":
   return imageformat.bmp;
  case ".emf":
   return imageformat.emf;
  case ".exif":
   return imageformat.exif;
  case ".gif":
   return imageformat.gif;
  case ".ico":
   return imageformat.icon;
  case ".png":
   return imageformat.png;
  case ".tif":
   return imageformat.tiff;
  case ".tiff":
   return imageformat.tiff;
  case ".wmf":
   return imageformat.wmf;
  default:
   return imageformat.jpeg;
  }
 }
 /// <summary>
 /// 获取: 枚举 uinatlex.toolbox.imagemanager.watermarkposition 对应的 system.drawing.rectangle 对象
 /// </summary>
 /// <param name="positon">枚举 uinatlex.toolbox.imagemanager.watermarkposition: uinatlex.toolbox.imagemanager.watermarkposition</param>
 /// <param name="x">原图宽度: int</param>
 /// <param name="y">原图高度: int</param>
 /// <param name="x">水印宽度: int</param>
 /// <param name="y">水印高度: int</param>
 /// <param name="i">边距: int</param>
 /// <returns>返回: 枚举 uinatlex.toolbox.imagemanager.watermarkposition 对应的 system.drawing.rectangle 对象: system.drawing.rectangle</returns>
 private rectangle getwatermarkrectangle(watermarkposition positon, int x, int y, int x, int y, int i)
 {
  switch (positon)
  {
  case watermarkposition.lefttop:
   return new rectangle(i, i, x, y);
  case watermarkposition.left:
   return new rectangle(i, (y - y) / 2, x, y);
  case watermarkposition.leftbottom:
   return new rectangle(i, y - y - i, x, y);
  case watermarkposition.top:
   return new rectangle((x - x) / 2, i, x, y);
  case watermarkposition.center:
   return new rectangle((x - x) / 2, (y - y) / 2, x, y);
  case watermarkposition.bottom:
   return new rectangle((x - x) / 2, y - y - i, x, y);
  case watermarkposition.righttop:
   return new rectangle(x - x - i, i, x, y);
  case watermarkposition.rightcenter:
   return new rectangle(x - x - i, (y - y) / 2, x, y);
  default:
   return new rectangle(x - x - i, y - y - i, x, y);
  }
 }
 #endregion 私有函数结束
 #region 文字生成开始
 #endregion 文字生成结束
 #region 设置透明度开始
 /// <summary>
 /// 设置: 图片 system.drawing.bitmap 对象透明度
 /// </summary>
 /// <param name="sbitmap">图片 system.drawing.bitmap 对象: system.drawing.bitmap</param>
 /// <param name="transparence">水印透明度(值越高透明度越低,范围在0.0f~1.0f之间): float</param>
 /// <returns>图片 system.drawing.bitmap: system.drawing.bitmap</returns>
 public bitmap settransparence(bitmap bm, float transparence)
 {
  if (transparence == 0.0f || transparence == 1.0f)
  throw new argumentexception("透明度值只能在0.0f~1.0f之间");
  float[][] floatarray = 
  {
  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, transparence, 0.0f },
  new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } 
  };
  imageattributes imageattributes = new imageattributes();
  imageattributes.setcolormatrix(new colormatrix(floatarray), colormatrixflag.default, coloradjusttype.bitmap);
  bitmap bitmap = new bitmap(bm.width, bm.height);
  graphics graphics = graphics.fromimage(bitmap);
  graphics.drawimage(bm, new rectangle(0, 0, bm.width, bm.height), 0, 0, bm.width, bm.height, graphicsunit.pixel, imageattributes);
  graphics.dispose();
  imageattributes.dispose();
  bm.dispose();
  return bitmap;
 }
 /// <summary>
 /// 设置: 图片 system.drawing.bitmap 对象透明度
 /// </summary>
 /// <param name="readpath">图片路径(包含完整路径,文件名及其扩展名): string</param>
 /// <param name="transparence">水印透明度(值越高透明度越低,范围在0.0f~1.0f之间): float</param>
 /// <returns>图片 system.drawing.bitmap: system.drawing.bitmap</returns>
 public bitmap settransparence(string readpath, float transparence)
 {
  return settransparence(new bitmap(readpath), transparence);
 }
 #endregion 设置透明度结束
 #region 添加水印开始
 /// <summary>
 /// 生成: 原图绘制水印的 system.drawing.bitmap 对象
 /// </summary>
 /// <param name="sbitmap">原图 system.drawing.bitmap 对象: system.drawing.bitmap</param>
 /// <param name="wbitmap">水印 system.drawing.bitmap 对象: system.drawing.bitmap</param>
 /// <param name="position">枚举 uinatlex.toolbox.imagemanager.watermarkposition : uinatlex.toolbox.imagemanager.watermarkposition</param>
 /// <param name="margin">水印边距: int</param>
 /// <returns>返回: 原图绘制水印的 system.drawing.bitmap 对象 system.drawing.bitmap</returns>
 public bitmap createwatermark(bitmap sbitmap, bitmap wbitmap, watermarkposition position, int margin)
 {
  graphics graphics = graphics.fromimage(sbitmap);
  graphics.drawimage(wbitmap, getwatermarkrectangle(position, sbitmap.width, sbitmap.height, wbitmap.width, wbitmap.height, margin));
  graphics.dispose();
  wbitmap.dispose();
  return sbitmap;
 }
 #endregion 添加水印结束
 #region 图片切割开始
 #endregion 图片切割结束
 #region 图片缩放开始
 #endregion 图片缩放结束
 #region 保存图片到文件开始
 #region 普通保存开始
 /// <summary>
 /// 保存: system.drawing.bitmap 对象到图片文件
 /// </summary>
 /// <param name="bitmap">system.drawing.bitmap 对象: system.drawing.bitmap</param>
 /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param>
 public void save(bitmap bitmap, string writepath)
 {
  try
  {
  bitmap.save(writepath, getimageformat(getextension(writepath)));
  bitmap.dispose();
  }
  catch
  {
  throw new argumentexception("图片保存错误");
  }
 }
 /// <summary>
 /// 保存: 对象到图片文件
 /// </summary>
 /// <param name="readpath">原图路径(包含完整路径,文件名及其扩展名): string</param>
 /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param>
 public void save(string readpath, string writepath)
 {
  if (string.compare(readpath, writepath) == 0)
  throw new argumentexception("源图片与目标图片地址相同");
  try
  {
  save(new bitmap(readpath), writepath);
  }
  catch
  {
  throw new argumentexception("图片读取错误");
  }
 }
 #endregion 普通保存结束
 #region 文字绘图保存开始
 #endregion 文字绘图保存结束
 #region 透明度调整保存开始
 /// <summary>
 /// 保存: 设置透明度的对象到图片文件
 /// </summary>
 /// <param name="sbitmap">图片 system.drawing.bitmap 对象: system.drawing.bitmap</param>
 /// <param name="transparence">水印透明度(值越高透明度越低,范围在0.0f~1.0f之间): float</param>
 /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param>
 public void savetransparence(bitmap bitmap, float transparence, string writepath)
 {
  save(settransparence(bitmap, transparence), writepath);
 }
 /// <summary>
 /// 保存: 设置透明度的象到图片文件
 /// </summary>
 /// <param name="readpath">原图路径(包含完整路径,文件名及其扩展名): string</param>
 /// <param name="transparence">水印透明度(值越高透明度越低,范围在0.0f~1.0f之间): float</param>
 /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param>
 public void savetransparence(string readpath, float transparence, string writepath)
 {
  save(settransparence(readpath, transparence), writepath);
 }
 #endregion 透明度调整保存结束
 #region 水印图片保存开始
 /// <summary>
 /// 保存: 绘制水印的对象到图片文件
 /// </summary>
 /// <param name="sbitmap">原图 system.drawing.bitmap 对象: system.drawing.bitmap</param>
 /// <param name="wbitmap">水印 system.drawing.bitmap 对象: system.drawing.bitmap</param>
 /// <param name="position">枚举 uinatlex.toolbox.imagemanager.watermarkposition : uinatlex.toolbox.imagemanager.watermarkposition</param>
 /// <param name="margin">水印边距: int</param>
 /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param>
 public void savewatermark(bitmap sbitmap, bitmap wbitmap, watermarkposition position, int margin, string writepath)
 {
  save(createwatermark(sbitmap, wbitmap, position, margin), writepath);
 }
 /// <summary>
 /// 保存: 绘制水印的对象到图片文件
 /// </summary>
 /// <param name="readpath">图片路径(包含完整路径,文件名及其扩展名): string</param>
 /// <param name="watermarkpath">水印图片路径(包含完整路径,文件名及其扩展名): string</param>
 /// <param name="transparence">水印透明度(值越高透明度越低,范围在0.0f~1.0f之间): float</param>
 /// <param name="position">枚举 uinatlex.toolbox.imagemanager.watermarkposition : uinatlex.toolbox.imagemanager.watermarkposition</param>
 /// <param name="margin">水印边距: int</param>
 /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param>
 public void savewatermark(string readpath, string watermarkpath, float transparence, watermarkposition position, int margin, string writepath)
 {
  if (string.compare(readpath, writepath) == 0)
  throw new argumentexception("源图片与目标图片地址相同");
  if (transparence == 0.0f)
  save(readpath, writepath);
  else if (transparence == 1.0f)
  savewatermark(new bitmap(readpath), new bitmap(watermarkpath), position, margin, writepath);
  else
  savewatermark(new bitmap(readpath), settransparence(watermarkpath, transparence), position, margin, writepath);
 }
 #endregion 水印图片保存结束
 #region 图片切割保存开始
 #endregion 图片切割保存结束
 #region 图片缩放保存开始
 #endregion 图片缩放保存开始
 #endregion 保存图片到文件结束
 }
}
/*
 调用很简单 im.savewatermark(原图地址, 水印地址, 透明度, 水印位置, 边距,保存位置); 
 uinatlex.toolbox.imagemanager im = new uinatlex.toolbox.imagemanager();
 im.savewatermark(server.mappath("/原图.jpg"), server.mappath("/水印.jpg"), 0.5f, uinatlex.toolbox.imagemanager.watermarkposition.rigthbottom, 10, server.mappath("/原图.jpg"));
 */

在客户端页面中调用上面这个类

 protected void page_load(object sender, eventargs e)
 {
 string newfilename = server.mappath("img/") + datetime.now.millisecond + "" + datetime.now.second + ".jpg";
 imagemanager im = new imagemanager();
 //调用很简单 im.savewatermark(原图地址, 水印地址, 透明度, 水印位置, 边距,保存到的位置); 
 im.savewatermark(server.mappath("img/chrysanthemum.jpg"), server.mappath("img/woshi.jpg"), 0.9f, imagemanager.watermarkposition.rigthbottom, 10, newfilename);
 }

总结

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网