.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);

}

.net为图片添加水印(转) jpg png和gif格式的更多相关文章

  1. Android 图片添加水印图片或者文字

    给图片添加水印的基本思路都是载入原图,添加文字或者载入水印图片,保存图片这三个部分 添加水印图片: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  2. java实现给图片添加水印

    package michael.io.image; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.aw ...

  3. java.imageIo给图片添加水印

    最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印; 一下提供下个方法,希望大家可以用得着: package com.blogs.image; import java ...

  4. ASP.NET -- WebForm -- 给图片添加水印标记

    ASP.NET -- WebForm: 给图片添加水印标记 ASP.NET:使用 WebForm(C#) 制作一个简单的为图片添加水印的页面. 1. Test2.aspx文件 <%@ Page ...

  5. JAVA给图片添加水印

    package com.test; import org.junit.Test; import javax.imageio.ImageIO; import java.awt.*; import jav ...

  6. 【Python】给图片添加水印的Python及Golang实现

    前言 不知道大家有没有这样的习惯,一篇比较得意的博客在发表一段时间之后会特别关注,前段时间一篇写到凌晨的博客被 码迷 这个网关爬取之后发表了,因为搜索引擎先爬取码迷的,所以我的博客无法被搜索到,即使直 ...

  7. iOS边练边学--(Quartz2D)图片添加水印

    一.给图片添加水印的基本步骤 加载图片 手动创建位图上下文 绘制原生的图片 给原生的图片添加文字 生成一张图片给我们,从上下文中获取图片 关闭上下文 二.注意:位图上下文的获取方式跟layer上下文不 ...

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

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

  9. 海报工厂之(一)android 如何给图片添加水印和文字

    在Android中如何给图片添加水印,下面截取了部分核心代码,仅供参考: /**      * 获取图片缩小的图片      * @param src      * @return      */   ...

随机推荐

  1. 1011 World Cup Betting (20 分)

    1011 World Cup Betting (20 分) With the 2010 FIFA World Cup running, football fans the world over wer ...

  2. pandas的merge函数

    pandas.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index= ...

  3. HFDS核心技术

    HDFS 设计的前提与目标 HDFS体系结构1 HDFS体系结构2 HDFS特性与优点 高容错性保障机制 HDFS不适合的场景 HDFS2.0的新特征 HA-QJM Federation 快照 异构层 ...

  4. ElasticSearch 索引模块——集成IK中文分词

    下载插件地址 https://github.com/medcl/elasticsearch-analysis-ik/tree/v1.10.0 对这个插件在window下进行解压 用maven工具对插件 ...

  5. 在配置静态IP的时候遇到 :bringing up interface eth0 : error unknown connection

    首先这是动态ip配置成功的结果 接下来切换到root用户来配置静态的 按照静态ip的配置方法配置好文件后(具体过程这里就不多加说明) 然后保存退出 当我们重启网卡的时候问题来了(因为本人有点强迫症,多 ...

  6. faker模块基本用法

    引言: 自动化脚本编写时,一般会遇到需要构造数据的情况,比如注册时的基本信息:每次执行脚本都要重新构造数据显然是很费时费力的事情,所以可以用到faker模块来构造:方便快捷,神器也: 一.安装 pip ...

  7. 安装vue.js

    1.  下载node https://nodejs.org/dist/v8.11.2/node-v8.11.2-x64.msi 2. 查看npm版本 在cmd下输入命令:npm -v 如果低于3.0版 ...

  8. VBA 禁止保存

    禁止保存 在workbook事件中 Private Sub Workbook_BeforeClose(Cancel As Boolean)    Me.Saved = TrueEnd Sub Priv ...

  9. OpenCV版本下载

    https://sourceforge.net/projects/opencvlibrary/files/opencv-win/

  10. ios localization

    1. 在工程文件中选择支持的语言,“Localizations” 2. 添加资源文件 Localizable.strings, (app默认从该资源文件读取字符串) 3. 通过 NSLocalized ...