為圖片添加水印
利用.net中System.Drawing命名空間下的常用類(lèi)我們就可以輕松的為圖片添加文字水印和圖片水印,并且可以自定義水印文字和水印圖片的大小、位置、顏色、透明度等等!對(duì)于jpg或者png等圖片,可以直接通過(guò)Graphics g= Graphics.FromImage(image)來(lái)獲得Graphics對(duì)象,但對(duì)于gif圖片,通過(guò)這種方法無(wú)法獲得Graphics對(duì)象,解決這個(gè)問(wèn)題的方法是首先根據(jù).gif文件的大小生成一個(gè)位圖作圖區(qū),然后將原圖復(fù)制到作圖區(qū),做進(jìn)行處理,以下是水印添加類(lèi)的完整代碼:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Drawing.Drawing2D;
namespace JillZhang

{
public enum MarkType
{
Text,Image
}
/**//// <summary>
/// 給圖片添加水印得類(lèi)得描述
/// </summary>
public class WaterMark
{
---------------------成員變量---------------------#region ---------------------成員變量---------------------
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};
private Image _image=null;
private Image _markedIamge=null;
private MarkType _markType=MarkType.Text;
#endregion

---------------------構(gòu)造函數(shù)---------------------#region ---------------------構(gòu)造函數(shù)---------------------
/**//// <summary>
/// 實(shí)例化一個(gè)水印類(lèi)
/// </summary>
public WaterMark()
{
}
/**//// <summary>
/// 初始化一個(gè)只添加文字水印得實(shí)例
/// </summary>
/// <param name="text">水印文字</param>
/// <param name="fontFamily">文字字體</param>
/// <param name="bold">是否粗體</param>
/// <param name="color">字體顏色</param>
/// <param name="markX">標(biāo)記位置橫坐標(biāo)</param>
/// <param name="markY">標(biāo)記位置縱坐標(biāo)</param>
public WaterMark(string text,string fontFamily,bool bold,Color color,int markX,int markY)
{
this._markType=MarkType.Text;
this._text=text;
this._fontFamily=fontFamily;
this._textbold=bold;
this._textColor=color;
this._markX=markX;
this._markY=MarkY;
this.Mark();
}
/**//// <summary>
/// 實(shí)例化一個(gè)只添加圖片水印得實(shí)例
/// </summary>
/// <param name="imagePath">水印圖片路徑</param>
/// <param name="tranparence">透明度</param>
/// <param name="markX">標(biāo)記位置橫坐標(biāo)</param>
/// <param name="markY">標(biāo)記位置縱坐標(biāo)</param>
public WaterMark(string imagePath,float tranparence,int markX,int markY)
{
this._markType=MarkType.Image;
this._imgPath=imagePath;
this._markX=markX;
this._markY=MarkY;
this._transparency=tranparence;
this.Mark();
}
#endregion

---------------------公共屬性---------------------#region ---------------------公共屬性---------------------
/**//// <summary>
/// 水印類(lèi)型
/// </summary>
public MarkType WaterMarkType
{
get
{
return _markType;
}
set
{
_markType=value;
}
} 
/**//// <summary>
/// 文字水印得內(nèi)容
/// </summary>
public string Text
{
get
{return _text;}
set
{_text=value;}
}
/**//// <summary>
/// 水印圖片得路徑
/// </summary>
public string WaterImagePath
{
get
{
return _imgPath;
}
set
{
this._imgPath=value;
}
}
/**//// <summary>
/// 水印圖片
/// </summary>
public Image WaterImage
{
get
{
try
{
return Image.FromFile(this.WaterImagePath);
}
catch
{
return null;
}
}
}
/**//// <summary>
/// 添加水印位置得橫坐標(biāo)
/// </summary>
public int MarkX
{
get
{return _markX;}
set
{_markX=value;}
}
/**//// <summary>
/// 添加水印位置得縱坐標(biāo)
/// </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 TextFontFamilyStr
{
get
{return _fontFamily;}
set
{_fontFamily=value;}
}
public FontFamily TextFontFamily
{
get
{return new FontFamily(this.TextFontFamilyStr);}
}
/**//// <summary>
/// 水印文字是否加粗
/// </summary>
public bool Bold
{
get
{return _textbold;}
set
{_textbold=value;}
}
/**//// <summary>
/// 原圖
/// </summary>
public Image SourceImage
{
get
{
return _image;
}
set
{
_image=value;
}
}
/**//// <summary>
/// 加過(guò)水印之后得圖
/// </summary>
public Image MarkedImage
{
get
{
return this._markedIamge;
}
}
#endregion

---------------------方法事件---------------------#region ---------------------方法事件---------------------
public Image Mark(Image img,MarkType markType,string text,Image waterImg,int markx,int marky,
bool bold,Color textColor,float transparence,FontFamily fontFamily)
{
//首先先判斷該圖片是否是 gif動(dòng)畫(huà),如果為gif動(dòng)畫(huà)不對(duì)圖片進(jìn)行改動(dòng)
foreach(Guid guid in img.FrameDimensionsList)
{
FrameDimension dimension= new FrameDimension(guid);
if(img.GetFrameCount(dimension)>1)
{
return img;
}
}
try
{
//添加文字水印
if(markType==MarkType.Text)
{
//根據(jù)源圖片生成新的Bitmap對(duì)象作為作圖區(qū),為了給gif圖片添加水印,才有此周折
Bitmap newBitmap=new Bitmap(img.Width,img.Height,PixelFormat.Format24bppRgb);
//設(shè)置新建位圖得分辨率
newBitmap.SetResolution(img.HorizontalResolution,img.VerticalResolution);
//創(chuàng)建Graphics對(duì)象,以對(duì)該位圖進(jìn)行操作
Graphics g = Graphics.FromImage(newBitmap);
//消除鋸齒
g.SmoothingMode=SmoothingMode.AntiAlias;
//將原圖拷貝到作圖區(qū)
g.DrawImage(img,new Rectangle(0,0,img.Width,img.Height),0,0,img.Width,img.Height,GraphicsUnit.Pixel);
//聲明字體對(duì)象
Font cFont = null;
//用來(lái)測(cè)試水印文本長(zhǎng)度得尺子
SizeF size=new SizeF();
//探測(cè)出一個(gè)適合圖片大小得字體大小,以適應(yīng)水印文字大小得自適應(yīng)
for(int i=0;i<6;i++)
{
//創(chuàng)建一個(gè)字體對(duì)象
cFont= new Font(fontFamily,sizes[i]);
//是否加粗
if(!bold)
{
cFont= new Font(fontFamily,sizes[i],FontStyle.Regular);
}
else
{
cFont=new Font(fontFamily,sizes[i],FontStyle.Bold);
}
//測(cè)量文本大小
size=g.MeasureString(this.Text,cFont);
//匹配第一個(gè)符合要求得字體大小
if((ushort)size.Width<(ushort)img.Width)
{
break;
}
}
//創(chuàng)建刷子對(duì)象,準(zhǔn)備給圖片寫(xiě)上文字
Brush brush= new SolidBrush(textColor);
//在指定得位置寫(xiě)上文字
g.DrawString(text,cFont,brush,markx,marky);
//釋放Graphics對(duì)象
g.Dispose();
//將生成得圖片讀入MemoryStream
System.IO.MemoryStream ms = new System.IO.MemoryStream();
newBitmap.Save(ms,ImageFormat.Jpeg);
//重新生成Image對(duì)象
img=System.Drawing.Image.FromStream(ms);
//返回新的Image對(duì)象
return img;
}
//添加圖像水印
else if(markType==MarkType.Image)
{
//獲得水印圖像
Image markImg = waterImg;
//創(chuàng)建顏色矩陣
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, transparence, 0}, //注意:此處為0.0f為完全透明,1.0f為完全不透明
new float[]
{0, 0, 0, 0, 1}};
ColorMatrix colorMatrix= new ColorMatrix(ptsArray);
//新建一個(gè)Image屬性
ImageAttributes imageAttributes= new ImageAttributes();
//將顏色矩陣添加到屬性
imageAttributes.SetColorMatrix(colorMatrix,ColorMatrixFlag.Default,
ColorAdjustType.Default);
//生成位圖作圖區(qū)
Bitmap newBitmap=new Bitmap(img.Width,img.Height,PixelFormat.Format24bppRgb);
//設(shè)置分辨率
newBitmap.SetResolution(img.HorizontalResolution,img.VerticalResolution);
//創(chuàng)建Graphics
Graphics g = Graphics.FromImage(newBitmap);
//消除鋸齒
g.SmoothingMode=SmoothingMode.AntiAlias;
//拷貝原圖到作圖區(qū)
g.DrawImage(img,new Rectangle(0,0,img.Width,img.Height),0,0,img.Width,img.Height,GraphicsUnit.Pixel);
//如果原圖過(guò)小
if(markImg.Width>img.Width||markImg.Height>img.Height)
{
System.Drawing.Image.GetThumbnailImageAbort callb=null;
//對(duì)水印圖片生成縮略圖,縮小到原圖得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(markx,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對(duì)象
img=Image.FromStream(ms);
return img;
}
//原圖足夠大
else
{
//添加水印
g.DrawImage(markImg,new Rectangle(markx,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對(duì)象
img=Image.FromStream(ms);
return img;
}
}
return img;
}
catch
{
return img;
} 
}
/**//// <summary>
/// 添加水印,此方法適用于gif格式得圖片
/// </summary>
/// <param name="image">需要添加水印得圖片</param>
/// <returns>添加水印之后得圖片</returns>
private void Mark()
{
this._markedIamge=Mark(this.SourceImage,this.WaterMarkType,this._text,this.WaterImage,this._markX,this._markY,this._textbold,this._textColor,this._transparency,this.TextFontFamily);
}
#endregion
}
}
利用該類(lèi),您可以輕松的對(duì)圖片加水印,但也有不足,通過(guò)這種方法添加水印,會(huì)破壞.gif動(dòng)畫(huà),因?yàn)槲夷壳斑€不知道如何判斷.gif文件是否是動(dòng)畫(huà),這個(gè)問(wèn)題還需要各位網(wǎng)友的建議和幫助
作者:jillzhang
出處:http://jillzhang.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
出處:http://jillzhang.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

浙公網(wǎng)安備 33010602011771號(hào)