.net为图片添加水印(转) jpg png和gif格式

.net为图片添加水印(转) jpg png和gif格式,转自csdn的hyde82,现在跟大家一起来分享下:

利 用.net中System.Drawing命名空间下的常用类我们就可以轻松的为图片添加文字水印和图片水印,并且可以自定义水印文字和水印图片的大小、 位置、颜色、透明度等等!对于jpg或者png等图片,可以直接通过Graphics g= Graphics.FromImage(image)来获得Graphics对象,但对于gif图片,通过这种方法无法获得Graphics对象,解决这 个问题的方法是首先根据.gif文件的大小生成一个位图作图区,然后将原图复制到作图区,做进行处理,以下是水印添加类的完整代码:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Drawing.Drawing2D;

namespace JillZhang
{
/** <summary>
/// 给图片添加水印得类得描述
/// </summary>
public class WaterMark
{
private bool _textMark=false;
private bool _imgMark=false;
private string _text="";
private string _imgPath="";
private int _markX=0;
private int _markY=0;
private float _transparency=1;
private string _fontFamily="宋体";
private Color _textColor=Color.Black;
private bool _textbold=false;
int[] sizes=new int[]{48,32,16,8,6,4};
/** <summary>
/// 实例化一个水印类
/// </summary>
public WaterMark()
{
  
}
/** <summary>
/// 初始化一个只添加文字水印得实例
/// </summary>
/// <param name="text">水印文字</param>
/// <param name="fontFamily">文字字体</param>
/// <param name="bold">是否粗体</param>
/// <param name="color">字体颜色</param>
/// <param name="markX">标记位置横坐标</param>
/// <param name="markY">标记位置纵坐标</param>
public WaterMark(string text,string fontFamily,bool bold,Color color,int markX,int markY)
{
   this._imgMark=false;
   this._textMark=true;
   this._text=text;
   this._fontFamily=fontFamily;
   this._textbold=bold;
   this._textColor=color;
   this._markX=markX;
   this._markY=MarkY;
}
/** <summary>
/// 实例化一个只添加图片水印得实例
/// </summary>
/// <param name="imagePath">水印图片路径</param>
/// <param name="tranparence">透明度</param>
/// <param name="markX">标记位置横坐标</param>
/// <param name="markY">标记位置纵坐标</param>
public WaterMark(string imagePath,float tranparence,int markX,int markY)
{
   this._textMark=false;
   this._imgMark=true;
   this._imgPath=imagePath;
   this._markX=markX;
   this._markY=MarkY;
   this._transparency=tranparence;
}
/** <summary>
/// 是否添加文字水印
/// </summary>
public bool TextMark
{
   get{return _textMark;}
   set{_textMark=value;}
}
/** <summary>
/// 是否添加图片水印
/// </summary>
public bool ImageMark
{
   get{return _imgMark;}
   set{_imgMark=value;}
}
/** <summary>
/// 文字水印得内容
/// </summary>
public string Text
{
   get{return _text;}
   set{_text=value;}
}
/** <summary>
/// 图片水印得图片地址
/// </summary>
public string ImagePath
{
   get{return _imgPath;}
   set{_imgPath=value;}
}
/** <summary>
/// 添加水印位置得横坐标
/// </summary>
public int MarkX
{
   get{return _markX;}
   set{_markX=value;}
}
/** <summary>
/// 添加水印位置得纵坐标
/// </summary>
public int MarkY
{
   get{return _markY;}
   set{_markY=value;}
}
/** <summary>
/// 水印得透明度
/// </summary>
public float Transparency
{
   get{
    if(_transparency>1.0f)
    {
     _transparency=1.0f;
    }
    return _transparency;}
   set{_transparency=value;}
}
/** <summary>
/// 水印文字得颜色
/// </summary>
public Color TextColor
{
   get{return _textColor;}
   set{_textColor=value;}
}
/** <summary>
/// 水印文字得字体
/// </summary>
public string TextFontFamily
{
   get{return _fontFamily;}
   set{_fontFamily=value;}
}
/** <summary>
/// 水印文字是否加粗
/// </summary>
public bool Bold
{
   get{return _textbold;}
   set{_textbold=value;}
}
/** <summary>
/// 添加水印,此方法适用于gif格式得图片
/// </summary>
/// <param name="image">需要添加水印得图片</param>
/// <returns>添加水印之后得图片</returns>
public Image Mark(Image img)
{
   try
   {
    //添加文字水印
    if(this.TextMark)
    {
     //根据源图片生成新的Bitmap对象作为作图区,为了给gif图片添加水印,才有此周折
     Bitmap newBitmap=new Bitmap(img.Width,img.Height,PixelFormat.Format24bppRgb);
     //设置新建位图得分辨率
     newBitmap.SetResolution(img.HorizontalResolution,img.VerticalResolution);
     //创建Graphics对象,以对该位图进行操作
     Graphics g = Graphics.FromImage(newBitmap);
     //消除锯齿
     g.SmoothingMode=SmoothingMode.AntiAlias;
     //将原图拷贝到作图区
     g.DrawImage(img,new Rectangle(0,0,img.Width,img.Height),0,0,img.Width,img.Height,GraphicsUnit.Pixel);
     //声明字体对象
     Font cFont = null;
     //用来测试水印文本长度得尺子
     SizeF size=new SizeF();
     //探测出一个适合图片大小得字体大小,以适应水印文字大小得自适应
     for(int i=0;i<6;i++)
     {
      //创建一个字体对象
      cFont= new Font(this.TextFontFamily,sizes[i]);
      //是否加粗
      if(!this.Bold)
      {
       cFont= new Font(this.TextFontFamily,sizes[i],FontStyle.Regular);
      }
      else
      {
       cFont=new Font(this.TextFontFamily,sizes[i],FontStyle.Bold);
      }
      //测量文本大小
      size=g.MeasureString(this.Text,cFont);
      //匹配第一个符合要求得字体大小
      if((ushort)size.Width<(ushort)img.Width)
      {
       break;
      }
     }
     //创建刷子对象,准备给图片写上文字
     Brush brush= new SolidBrush(this.TextColor);
     //在指定得位置写上文字
     g.DrawString(this.Text,cFont,brush,this.MarkX,this.MarkY);
     //释放Graphics对象
     g.Dispose();  
     //将生成得图片读入MemoryStream
     System.IO.MemoryStream ms = new System.IO.MemoryStream();
     newBitmap.Save(ms,ImageFormat.Jpeg);
     //重新生成Image对象
     img=System.Drawing.Image.FromStream(ms);
     //返回新的Image对象
     return img;

}
    //添加图像水印
    if(this.ImageMark)
    {
     //获得水印图像
     Image markImg = Image.FromFile(this.ImagePath);
     //创建颜色矩阵
     float[][] ptsArray ={
           new float[] {1, 0, 0, 0, 0},
           new float[] {0, 1, 0, 0, 0},
           new float[] {0, 0, 1, 0, 0},
           new float[] {0, 0, 0, this.Transparency, 0}, //注意:此处为0.0f为完全透明,1.0f为完全不透明
           new float[] {0, 0, 0, 0, 1}};
     ColorMatrix colorMatrix= new ColorMatrix(ptsArray);
     //新建一个Image属性
     ImageAttributes imageAttributes= new ImageAttributes();
     //将颜色矩阵添加到属性
     imageAttributes.SetColorMatrix(colorMatrix,ColorMatrixFlag.Default,
      ColorAdjustType.Default);
     //生成位图作图区
     Bitmap newBitmap=new Bitmap(img.Width,img.Height,PixelFormat.Format24bppRgb);
     //设置分辨率
     newBitmap.SetResolution(img.HorizontalResolution,img.VerticalResolution);
     //创建Graphics
     Graphics g = Graphics.FromImage(newBitmap);
     //消除锯齿
     g.SmoothingMode=SmoothingMode.AntiAlias;
     //拷贝原图到作图区
     g.DrawImage(img,new Rectangle(0,0,img.Width,img.Height),0,0,img.Width,img.Height,GraphicsUnit.Pixel);
     //如果原图过小
     if(markImg.Width>img.Width||markImg.Height>img.Height)
     {
      System.Drawing.Image.GetThumbnailImageAbort callb=null;
      //对水印图片生成缩略图,缩小到原图得1/4
      System.Drawing.Image new_img=markImg.GetThumbnailImage(img.Width/4,markImg.Height*img.Width/markImg.Width,callb,new System.IntPtr());
      //添加水印
      g.DrawImage(new_img,new Rectangle(this.MarkX,this.MarkY,new_img.Width,new_img.Height),0,0,new_img.Width,new_img.Height,GraphicsUnit.Pixel,imageAttributes);
      //释放缩略图
      new_img.Dispose();
      //释放Graphics
      g.Dispose();
      //将生成得图片读入MemoryStream
      System.IO.MemoryStream ms = new System.IO.MemoryStream();
      newBitmap.Save(ms,ImageFormat.Jpeg);
          //返回新的Image对象
      img=Image.FromStream(ms);
      return img;
     }
      //原图足够大
     else
     {
      //添加水印
      g.DrawImage(markImg,new Rectangle(this.MarkX,this.MarkY,markImg.Width,markImg.Height),0,0,markImg.Width,markImg.Height,GraphicsUnit.Pixel,imageAttributes);
      //释放Graphics
      g.Dispose();
      //将生成得图片读入MemoryStream
      System.IO.MemoryStream ms = new System.IO.MemoryStream();
      newBitmap.Save(ms,ImageFormat.Jpeg);
      //返回新的Image对象
      img=Image.FromStream(ms);
      return img;
     }    
    }
    return img;
   }
   catch
   {
               return img;  
   }  
}

}
}

通过该类,您可以轻松的对图片加水印,但也有不足,通过这种方法添加水印,会破坏.gif动画,因为我目前还不知道如何判断.gif文件是否是动画,这个问题还需要各位网友的建议和帮助

jacklean非动画只有1帧
2012-01-11 09:53

jacklean判断帧数(非动画只有和帧)然后逐帧加水印,然后合成新的动画,因为GIF加载到Bitmap中清淅度会变差,所以还要用OctreeQuantizer组件插值能改善一些

使用示例:

//测试添加文字水印(不可调透明)
    private void test()
    {
        JillZhang.WaterMark wm = new JillZhang.WaterMark();
        wm.MarkX = 10;
        wm.MarkY = 10;
        wm.Text = "TEST flash";
        wm.TextFontFamily = "微软雅黑";
        wm.TextColor = System.Drawing.Color.Orange;
        wm.TextMark = true;
        wm.Bold = true;
        System.Drawing.Image img = System.Drawing.Image.FromFile("E:\\Work\\test\\WebSite1\\flashh.jpg");
        img = wm.Mark(img);
        img.Save(Server.MapPath("pic\\") + "tt4" + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

}

转载于:https://www.cnblogs.com/yubufan/p/3429446.html

.net为图片添加水印(转) jpg png和gif格式相关推荐

  1. 分享几个用 Python 给图片添加水印的方法,简单实用

    作者 |俊欣 来源 |关于数据分析与可视化 今天来分享几种可以给图片添加水印的方法,都是十分的简单实用,大家在看了之后也可以私底下去自己试试,有些方法需要的代码量就比较少,有些方法需要的代码量就稍微多 ...

  2. php 怎么支持中文图片显示,给图片添加水印(支持中文)并生成缩略图_php

    // **************************************** // // 功能:给图片添加水印(支持中文)并生成缩略图 // 参数: $srcFile 图片文件名 // $d ...

  3. php绘图技术加水印,PHP图片添加水印功能示例小结

    本文实例总结了PHP图片添加水印功能.分享给大家供大家参考,具体如下: 例1.很简单图下添加水印函数 /** * 追加水印 * * @param string $source_img 原始图片url ...

  4. 【Python】分享几个用Python给图片添加水印的方法,简单实用

    今天来分享几种可以给图片添加水印的方法,都是十分的简单实用,大家在看了之后也可以私底下去自己试试,有些方法需要的代码量就比较少,有些方法需要的代码量就稍微多一些,那我们开始吧 opencv模块 首先我 ...

  5. 批量改名_手把手教你用Python批量给图片添加水印 | 知了干货分享

    我们在网上浏览一些文章的时候,经常会发现文章中会有一些图片,上面会有一些标识,而这些标识就是我们经常说的水印了.很多时候,我们需要给图片加上一些修饰,好让别人能直观的认识到这个图片的出处以及来源,同时 ...

  6. 使用ffmpeg 的 filter 给图片添加水印

    使用ffmpeg 的 filter 给图片添加水印. main.c #include <stdio.h>#include <libavfilter/avfilter.h> #i ...

  7. HttpHandler:给指定路径下的图片添加水印显示

    圣诞节,25日,要交ACCP5.0认证的项目,其中有这样一个要求:书店的所有图书的封面放在了\images\convers\下面,要求所有引用这一路径下的图片都添加书店的店名水印图片.就是说拦截Htt ...

  8. android opencv 水印,关于opencv对图片添加水印

    有一段时间没有写博客了,最近因为自己需要给图片添加水印,就写了个简单的图片添加水印 python:3.6.7 pycharm opencv是一个开源的库,是有c++编写,支持c ++,python,j ...

  9. int.TryParse非预期执行引发的思考 ASP.NET -- WebForm -- 给图片添加水印标记 Windows -- 使用批处理文件.bat删除旧文件...

    int.TryParse非预期执行引发的思考 问题出现 这天在写一个页面,想谨慎些就用了int.TryParse,结果出问题了. 代码如下: Copy int id = 1000; //Request ...

  10. c++批量重命名_手把手教你用Python批量给图片添加水印 | 知了干货分享

    我们在网上浏览一些文章的时候,经常会发现文章中会有一些图片,上面会有一些标识,而这些标识就是我们经常说的水印了.很多时候,我们需要给图片加上一些修饰,好让别人能直观的认识到这个图片的出处以及来源,同时 ...

最新文章

  1. python open函数参数newline_Python open() 函数
  2. 三年制专转本计算机,三年制专转本和五年制专转本的区别
  3. AOP和OOP的区别
  4. matlab 箱图不显示异常值_欧姆龙E5EZ温控器PV显示值跳动异常的处理,一看就懂...
  5. Java 设计模式 -- 代理模式
  6. 大数据营销有哪些价值
  7. 向架构师进军---系统架构设计基础知识
  8. freeswith 录制 MP4格式视频
  9. 公共代码之密码加解密
  10. 点云配准ICPNDT
  11. mac 重启后提示 路径/System/installation/Packages/OSinstall.mpkg 似乎已缺失或已损坏,的解决方法
  12. 机械公差与配合 常见问题
  13. 《老路用得上的商学课》26-30学习笔记
  14. 史上最全32个著名古镇
  15. html制作动态3d图片,如何制作3D动态图片?
  16. 天翼杯大数据算法应用大赛
  17. 面对人工智能,我们应有的态度
  18. BIM土建插件墙齐梁板操作,实现墙、柱的顶部、底部对齐
  19. BUUCTF Reverse/findKey
  20. UltraEdit关闭自动备份

热门文章

  1. presto查询报错
  2. spark-streaming-连接kafka的两种方式
  3. Hive复杂数据类型 struct
  4. LeetCode 654. Maximum Binary Tree最大二叉树 (C++)
  5. BRVAH(让RecyclerView变得更高效) (3)
  6. PHP中常见的面试题3(附答案)
  7. HTML5学习笔记(二):HTML基础学习之二
  8. VMware 虚拟机桥接网络设置
  9. 利用rowid删除数据,提升性能
  10. android退出一个含有listview的activity时报java.lang.IllegalA