华域联盟 .Net ASP.NET 图片加水印防盗链实现代码

ASP.NET 图片加水印防盗链实现代码

首先建一个类:

复制代码 代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Drawing;

/// <summary>

///Class1 的摘要说明

/// </summary>

public class Class1:IHttpHandler //调用接口

{

public Class1()

{

//

//TODO: 在此处添加构造函数逻辑

//

}

public bool IsReusable

{

get { return true; }

}

public void ProcessRequest(HttpContext context)

{

HttpRequest req = context.Request;

if (req.UrlReferrer != null && req.UrlReferrer.Host.Length > 0) //反盗链代码判断

{

System.Drawing.Image img = System.Drawing.Image.FromFile(context.Request.PhysicalPath);

System.Drawing.Graphics g = Graphics.FromImage(img);

g.DrawString("三国演义", new Font("宋体", 20, FontStyle.Bold), Brushes.White, 10, 10);

img.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

context.Response.Flush();

context.Response.End();

}

else

{

context.Response.Write("您不能盗链本站图片");

}

}

}

在web.config中注册接口:

复制代码 代码如下:

<httpHandlers>

<add verb="*" path="images/*.jpg" type="Class1,App_Code"/>

</httpHandlers>

url:http://greatverve.cnblogs.com/archive/2011/12/20/asp-net-hotlinking.html

参考:

1.修改web.config

复制代码 代码如下:

<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>

[WebService(Namespace = "http://tempuri.org/")]
[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>
您可能感兴趣的文章:

  • 如何在ASP.NET Core中给上传图片功能添加水印实例代码
  • ASP.NET百度Ueditor编辑器实现上传图片添加水印效果
  • Asp.net开发之webform图片水印和图片验证码的实现方法
  • asp.net继承IHttpHandler接口实现给网站图片添加水印功能实例
  • ASP.NET简单好用功能齐全图片上传工具类(水印、缩略图、裁剪等)
  • Asp.net简单实现给图片增加文字水印
  • asp.net如何在图片上加水印文字具体实现
  • asp.net上传图片并作处理水印与缩略图的实例代码
  • asp.net中上传图片文件实现防伪图片水印并写入数据库
  • ASP.NET实现图片自动添加水印

本文由 华域联盟 原创撰写:华域联盟 » ASP.NET 图片加水印防盗链实现代码

转载请保留出处和原文链接:https://www.cnhackhy.com/42991.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部