1.修改web.congif
<system.web> <httpHandlers> <remove
verb= "*" path= "*.asmx" /> <!--解決圖片防盜鏈問題--> <add
verb= "*" path= "*.jpg" type= "MyHttpHandler.Watermark" /> <add
verb= "*" path= "*.gif" type= "MyHttpHandler.Watermark" /> <add
verb= "*" path= "*.png" type= "MyHttpHandler.Watermark" /> </httpHandlers> </system.web> |
2.添加一個一般執行文件Watermark.ashx,代碼如下:
using System; using System.Data; using System.Web; using System.Collections; using System.Web.Services; using System.Web.Services.Protocols; using System.Drawing.Imaging; using System.Drawing; using System.IO; namespace MyHttpHandler { ///
<summary> ///
Summary description for $codebehindclassname$ ///
</summary> [WebServiceBinding(ConformsTo
= WsiProfiles.BasicProfile1_1)] public class Watermark
: IHttpHandler { public bool IsReusable { get { return false ; } } public void ProcessRequest(HttpContext
context) { //設置客戶端緩衝時間過期時間爲0,即立即過期 //context.Response.Expires
= 0; //清空服務器端爲此會話開啓的輸出緩存 //context.Response.Clear(); //設置輸出文件類型 context.Response.ContentType
= "image/jpg" ; //將請求文件寫入到輸出緩存中 #region
獲取XML配置信息 DataSet
dsConfing = new DataSet(); string watermarkConfigPath
= context.Server.MapPath( "~/Config/WaterMarkConfig.xml" ); if (System.IO.File.Exists(watermarkConfigPath)) dsConfing.ReadXml(watermarkConfigPath); else { //添加默認的水印配置 } DataRow
drConfing = dsConfing.Tables[0].Rows[0]; #endregion string currentHost
= drConfing[ "allowhost" ].ToString(); //判斷是否是本地網站引用圖片,如果是則返回正確的圖片 if (context.Request.Url.Authority.Equals(currentHost,
StringComparison.InvariantCultureIgnoreCase)) { string localPath
= context.Request.Url.LocalPath; localPath
= localPath.Remove(localPath.LastIndexOf( '/' )).ToLower(); //
"/images/userphoto" if (drConfing[ "isflag" ].Equals( "true" )
&& drConfing[ "files" ].ToString().ToLower().IndexOf(localPath)
> 0) { #region
水印代碼 string sImgStartPhysicalPath
= context.Request.PhysicalPath; System.Drawing.Image
imgStart = System.Drawing.Image.FromFile(sImgStartPhysicalPath); //備份原圖片 //int
indexOf = sImgStartPhysicalPath.LastIndexOf("."); //string
bakPath = sImgStartPhysicalPath.Remove(indexOf) + "_bak" + sImgStartPhysicalPath.Substring(indexOf); //imgStart.Save(bakPath); Graphics
gh = System.Drawing.Graphics.FromImage(imgStart); if (drConfing[ "type" ].Equals( "img" )) { System.Drawing.Image
imgWatermark = System.Drawing.Image.FromFile(context.Server.MapPath(drConfing[ "img-path" ].ToString())); Rectangle
rg = SetImgPosition(drConfing[ "position" ].ToString(),
imgStart.Width, imgStart.Height, imgWatermark.Width, imgWatermark.Height); gh.DrawImage(imgWatermark,
rg, 0, 0, imgWatermark.Width, imgWatermark.Height, GraphicsUnit.Pixel); gh.Save(); gh.Dispose(); imgWatermark.Dispose(); } else if (drConfing[ "type" ].Equals( "font" )) { //文字水印 string content
= drConfing[ "font-content" ].ToString(); float Size
= ( float )Convert.ToDouble(drConfing[ "font-size" ].ToString()); FontStyle
fontStyle = (FontStyle) int .Parse(drConfing[ "font-style" ].ToString()); System.Drawing.Font
f = new System.Drawing.Font( "Arial" ,
Size, fontStyle); Color
G_Color = Color.FromName(drConfing[ "font-color" ].ToString()); System.Drawing.Brush
b = new System.Drawing.SolidBrush(G_Color); SizeF
sizeF = gh.MeasureString(content, f); gh.DrawString(content,
f, b, SetFontPosition(drConfing[ "position" ].ToString(),
imgStart.Width, imgStart.Height, ( int )sizeF.Width,
( int )sizeF.Height)); gh.Save(); gh.Dispose(); } //將請求文件寫入到輸出緩存中 imgStart.Save(context.Response.OutputStream,
ImageFormat.Jpeg); imgStart.Dispose(); #endregion } else { #region
輸出原圖 //將請求文件寫入到輸出緩存中 context.Response.WriteFile(context.Request.Url.AbsolutePath); #endregion } } //如果不是本地引用,則是盜鏈本站圖片 else { //將請求文件寫入到輸出緩存中 context.Response.WriteFile(context.Request.PhysicalApplicationPath
+ drConfing[ "errimgpath" ].ToString());
} //將輸出緩存中的信息傳送到客戶端 context.Response.End(); } ///
<summary> ///
圖片繪畫水印的位置 ///
</summary> ///
<param name="positionConfig">位置類型</param> ///
<param name="width">原圖片寬</param> ///
<param name="height"></param> ///
<param name="watermarkWidth">水印圖寬</param> ///
<param name="watermarkHeight"></param> ///
<returns></returns> private Rectangle
SetImgPosition( string positionConfig, int width, int height, int watermarkWidth, int watermarkHeight) { int xpos
= 0; int ypos
= 0; int margin
= 10; int width_margin
= width - margin; int height_margin
= height - margin; double proportion
= 1d; //水印圖片縮放比例 //int
if ((width_margin
> watermarkWidth * proportion) && (height_margin > watermarkHeight * proportion)) { } else if ((width_margin
> watermarkWidth * proportion) && (height_margin < watermarkHeight * proportion)) { proportion
= Convert.ToDouble( height_margin) / Convert.ToDouble( watermarkHeight); } else if ((width_margin
< watermarkWidth * proportion) && (height_margin > watermarkHeight * proportion)) { proportion
= Convert.ToDouble(width_margin) / Convert.ToDouble(watermarkWidth); } else { double proportionW
= Convert.ToDouble(width_margin) / Convert.ToDouble(watermarkWidth); double proportionH
= Convert.ToDouble(height_margin) / Convert.ToDouble(watermarkHeight);
proportion
= proportionW >= proportionH ? proportionH : proportionW; } watermarkWidth
= Convert.ToInt32(watermarkWidth * proportion); watermarkHeight
= Convert.ToInt32(watermarkHeight * proportion); switch (positionConfig) { case "top-left" : xpos
= margin; ypos
= margin; break ; case "top-right" : xpos
= width_margin - watermarkWidth; ypos
= margin; break ; case "bottom-left" : xpos
= margin; ypos
= height_margin - watermarkHeight; break ; case "bottom-right" : xpos
= width_margin - watermarkWidth ; ypos
= height_margin - watermarkHeight ; break ; default : xpos
= width_margin - watermarkWidth ; ypos
= height_margin - watermarkHeight; break ; } return new Rectangle(xpos,ypos,watermarkWidth,watermarkHeight); } ///
<summary> ///
圖片繪畫文字位置 ///
</summary> ///
<param name="positionConfig">位置類型</param> ///
<param name="width">原圖片寬</param> ///
<param name="height"></param> ///
<param name="fontWidth">文字長度</param> ///
<param name="fontHeight"></param> ///
<returns></returns> private Point
SetFontPosition( string positionConfig,
int width,
int height,
int fontWidth,
int fontHeight) { int xpos
= 0; int ypos
= 0; int margin
= 10; int width_margin
= width - margin; int height_margin
= height - margin; double proportion
= 1d; //水印圖片縮放比例 //int
if ((width_margin
> fontWidth * proportion) && (height_margin > fontHeight * proportion)) { } else if ((width_margin
> fontWidth * proportion) && (height_margin < fontHeight * proportion)) { proportion
= Convert.ToDouble(height_margin) / Convert.ToDouble(fontHeight); } else if ((width_margin
< fontWidth * proportion) && (height_margin > fontHeight * proportion)) { proportion
= Convert.ToDouble(width_margin) / Convert.ToDouble(fontWidth); } else { double proportionH
= Convert.ToDouble(height_margin) / Convert.ToDouble(fontHeight); double proportionW
= Convert.ToDouble(width_margin) / Convert.ToDouble(fontWidth); proportion
= proportionW >= proportionH ? proportionH : proportionW; } fontWidth
= Convert.ToInt32(fontWidth * proportion); fontHeight
= Convert.ToInt32(fontHeight * proportion); switch (positionConfig) { case "top-left" : xpos
= margin; ypos
= margin; break ; case "top-right" : xpos
= width_margin - fontWidth; ypos
= margin; break ; case "bottom-left" : xpos
= margin; ypos
= height_margin - fontHeight; break ; case "bottom-right" : xpos
= width_margin - fontWidth; ypos
= height_margin - fontHeight; break ; default : xpos
= width_margin - fontWidth; ypos
= height_margin - fontHeight; break ; } return new Point(xpos,
ypos); } } } |
3.配置文件的WaterMarkConfig.xml,內容如下:
<?xml
version= "1.0" encoding= "utf-8" ?> <watermark> <allowhost>localhost:6219</allowhost><!--允許訪問的域名--> <isflag> true </isflag><!--
true 、 false --> <type>font</type><!--
img、font--> <files>/config|/upfiles/ab</files><!--需要加水印的文件夾--> <position>bottom-right</position><!--
top-left、top-right、bottom-left、bottom-right--> <img-path>~/UpFiles/Watermark.png</img-path><!--
水印位置 --> <font-style>1</font-style><!--普通文本
0, 加粗文本 1, 傾斜文本 2, 帶下劃線的文本 4, 中間有直線通過的文本 8--> <font-size>60</font-size> <font-color>red</font-color> <font-content>¥:8000元</font-content>
<errimgpath>images/error.jpg</errimgpath><!--
盜圖片的請求返回的跟目錄下的某圖片 --> </watermark>
|