发布文章自动上传图片并生成水印
前段时间在网上看到新浪有一个提交文本(Html代码),自动上传图片的功能,觉得倒是很[实用,稍一琢磨,自己也写了这么一个东东。
根据所传入的Html代码,获取标签中的图片标签,将图片复制到当前服务器,替换Html代码中图片标签的src属性值。如果需要,还可以打上水印,堂堂正正的说版权归本公司(个人)所有,哈!
以下是主程序代码:
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Net;
using System.Drawing;
using System.Web;
using System.IO;
using System.Drawing.Imaging;
namespace JL.SWSystem.SWCommon.Mrhgw
{
/**//// <summary>
/// 根据传入的文本自动上传图片。
/// </summary>
public class ImageUploadAutomatic
{
静态构造器#region 静态构造器
/**//// <summary>
/// 静态构造器。
/// </summary>
static ImageUploadAutomatic()
{
htmimes[".jpe"] = "image/jpeg";
htmimes[".jpeg"] = "image/jpeg";
htmimes[".jpg"] = "image/jpeg";
htmimes[".png"] = "image/png";
htmimes[".gif"] = "image/gif";
htmimes[".tif"] = "image/tiff";
htmimes[".tiff"] = "image/tiff";
htmimes[".bmp"] = "image/bmp";
}
#endregion
变量#region 变量
/**//// <summary>
/// 存放包含编码解码器的多用途网际邮件扩充协议 (MIME) 类型的字符串的集合对象。
/// </summary>
private static Hashtable htmimes = new Hashtable();
/**//// <summary>
/// 传入的文本。
/// </summary>
private static string text = "";
/**//// <summary>
/// 文件上传的路径(非虚拟路径)。
/// </summary>
private static string filePath = "";
/**//// <summary>
/// 图片的引用路径(非虚拟路径)。
/// </summary>
private static string refersImagePath = "";
/**//// <summary>
/// 是否标记图片水印。
/// </summary>
private static bool isSignWatermark = false;
/**//// <summary>
/// 水印文本(以字符“|”标记换行。图片水印和文字水印选其一,优先图片水印)。
/// </summary>
private static string watermarkChars = "66xq.com";
/**//// <summary>
/// 水印图片(非虚拟路径。图片水印和文字水印选其一,优先图片水印)。
/// </summary>
private static string watermarkImage = "";
/**//// <summary>
/// 集合对象。
/// </summary>
private static List<ParamItem> imgPathColl = null;
/**//// <summary>
/// 水印图片。
/// </summary>
private static Image imgWatermark = null;
#endregion
属性#region 属性
/**//// <summary>
/// 获取或设置传入的文本。
/// </summary>
public static string Text
{
get { return text; }
set { text = value; }
}
/**//// <summary>
/// 获取或设置文件上传的路径(非虚拟路径)。
/// </summary>
public static string FilePath
{
get { return filePath; }
set { filePath = value; }
}
/**//// <summary>
/// 获取或设置图片的引用路径(非虚拟路径)。
/// </summary>
public static string RefersImagePath
{
get { return refersImagePath; }
set { refersImagePath = value; }
}
/**//// <summary>
/// 获取或设置是否标记图片水印。
/// </summary>
public static bool IsSignWatermark
{
get { return isSignWatermark; }
set { isSignWatermark = true; }
}
/**//// <summary>
/// 获取或设置水印文本(以字符“|”标记换行。图片水印和文字水印选其一,优先图片水印)。
/// </summary>
public static string WatermarkChars
{
get { return watermarkChars; }
set { watermarkChars = value; }
}
/**//// <summary>
/// 获取或设置水印图片(非虚拟路径。图片水印和文字水印选其一,优先图片水印)。
/// </summary>
public static string WatermarkImage
{
get { return watermarkImage; }
set { watermarkImage = value; }
}
/**//// <summary>
/// 获取已上传图片的集合对象。
/// </summary>
public static List<ParamItem> ImgPathColl
{
get { return imgPathColl; }
}
#endregion
重置所有参数#region 重置所有参数
/**//// <summary>
/// 重置所有参数。
/// </summary>
public static void Reset()
{
text = "";
filePath = "";
refersImagePath = "";
isSignWatermark = false;
watermarkChars = "";
watermarkImage = "";
imgPathColl = null;
}
#endregion
提交操作#region 提交操作
/**//// <summary>
/// 提交操作。
/// </summary>
public static void Submit()
{
if (text.Trim().Length == 0) return;
imgPathColl = new List<ParamItem>();
const string PATTERN_IMG = "<img\\s+[^>]*?src=[\"']?([^'\"\\s>]+)[\"']?[^>]*?>";
text = Regex.Replace(text, PATTERN_IMG, new MatchEvaluator(ImageUploadAutomatic.ReplaceCC), RegexOptions.IgnoreCase);
if (null != imgWatermark)
{
imgWatermark.Dispose();
imgWatermark = null;
}
}
/**//// <summary>
/// 搜索指定的匹配项,替换图片路径。
/// </summary>
/// <param name="match">捕获的正则匹配项</param>
/// <returns></returns>
public static string ReplaceCC(Match match)
{
if (!match.Success) return "";
HttpWebRequest req = null;
HttpWebResponse rep = null;
Image img = null;
string result = match.Value;
for(int i=0;i<match.Groups.Count;i++)
{
if (i == 0) continue;
Group gc = match.Groups[i];
try
{
if (gc.Value.Trim().Length == 0) return result;
string newFilename = CreateNewFilename(gc.Value);
if (newFilename == string.Empty) return result;
if (isSignWatermark && watermarkImage.Trim().Length > 0 && null == imgWatermark)
{
imgWatermark = Image.FromFile(HttpContext.Current.Server.MapPath(watermarkImage));
}
//首先查看该图片是不是本站内的图片。
if (File.Exists(HttpContext.Current.Server.MapPath(gc.Value)))
{
img = Image.FromFile(HttpContext.Current.Server.MapPath(gc.Value));
}
else
{
//其它网站的图片资源。
//获取图片资源。
req = (HttpWebRequest)HttpWebRequest.Create(gc.Value);
rep = (HttpWebResponse)req.GetResponse();
//生成图片。
img = Image.FromStream(rep.GetResponseStream());
}
//标记水印。
if (isSignWatermark)
{
if (watermarkImage.Trim().Length > 0)
img = ImageWatermark.MarkImage(img, imgWatermark);
else
img = ImageWatermark.MarkText(img);
}
//获取文件扩展名。
string sEx = newFilename.Substring(newFilename.LastIndexOf(".")).ToLower();
//保存图像。
SaveImage(img, System.Web.HttpContext.Current.Server.MapPath(filePath + "/" + newFilename), GetCodecInfo((string)htmimes[sEx]));
//添加上传路径到集合中,供其它地方调用。
imgPathColl.Add(new ParamItem(gc.Value, filePath + "/" + newFilename));
//替换图片路径。
result = result.Replace(gc.Value, refersImagePath + "/" + newFilename);
}
catch (System.UriFormatException)
{
//此处屏蔽由于错误的URI或相对地址的站内url所引发的异常,
//并复原返回值。
result = match.Value;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (null != img)
{
img.Dispose();
img = null;
}
if (null != rep)
{
rep.Close();
rep = null;
}
}
}
return result;
}
/**//// <summary>
/// 保存图片
/// </summary>
/// <param name="image">Image 对象</param>
/// <param name="savePath">保存路径</param>
/// <param name="ici">指定格式的编解码参数</param>
private static void SaveImage(System.Drawing.Image image, string savePath, ImageCodecInfo ici)
{
//设置 原图片 对象的 EncoderParameters 对象
EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, ((long)90));
image.Save(savePath, ici, parameters);
parameters.Dispose();
}
/**//// <summary>
/// 获取图像编码解码器的所有相关信息
/// </summary>
/// <param name="mimeType">包含编码解码器的多用途网际邮件扩充协议 (MIME) 类型的字符串</param>
/// <returns>返回图像编码解码器的所有相关信息</returns>
private static ImageCodecInfo GetCodecInfo(string mimeType)
{
ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
foreach (ImageCodecInfo ici in CodecInfo)
{
if (ici.MimeType == mimeType) return ici;
}
return null;
}
#endregion
生成新的图片文件名称#region 生成新的图片文件名称
/**//// <summary>
/// 生成新的图片名称。
/// </summary>
/// <param name="preImagePath">原文件路径</param>
/// <returns>返回新的图片名称</returns>
private static string CreateNewFilename(string preImagePath)
{
//遍历先前加入集合中的图片,看是否存在相同路径的图片,
//如果存在,则返回以前加入集合的新图片名称。
foreach (ParamItem item in imgPathColl)
{
if (preImagePath.Trim().ToLower() == item.PreImagePath.Trim().ToLower())
return string.Empty;
}
preImagePath = preImagePath.Trim();
int index = preImagePath.LastIndexOf(".");
if (index < 0) return string.Empty;
return Guid.NewGuid().ToString() + preImagePath.Substring(index, preImagePath.Length - index);
}
#endregion
}
}
以下是参数类代码:
using System.Text;
namespace JL.Automatic
{
/**//// <summary>
/// 参数类。
/// </summary>
public class ParamItem
{
/**//// <summary>
/// 默认构造器。
/// </summary>
public ParamItem()
{
}
/**//// <summary>
/// 构造器(重载二)。
/// </summary>
/// <param name="preImagePath">原图片地址</param>
/// <param name="currentImagePath">当前图片链接地址</param>
internal ParamItem(string preImagePath, string currentImagePath)
{
this.preImagePath = preImagePath;
this.currentImagePath = currentImagePath;
}
/**//// <summary>
/// 原图片地址。
/// </summary>
private string preImagePath = "";
/**//// <summary>
/// 当前图片链接地址。
/// </summary>
private string currentImagePath = "";
/**//// <summary>
/// 获取或设置原图片地址。
/// </summary>
public string PreImagePath
{
get { return this.preImagePath; }
set { this.preImagePath = value; }
}
/**//// <summary>
/// 获取或设置当前图片链接地址。
/// </summary>
public string CurrentImagePath
{
get { return this.currentImagePath; }
set { this.currentImagePath = value; }
}
}
}
以下是生成水图的代码:
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace JL.SWSystem.SWCommon.Mrhgw
{
/**//// <summary>
/// 标记水印。
/// </summary>
public class ImageWatermark
{
标记文本水印#region 标记文本水印
/**//// <summary>
/// 标记文本水印。
/// </summary>
/// <param name="preImage">原图片</param>
/// <returns></returns>
public static Image MarkText(Image imgPhoto)
{
string copyrightString = "66xq.com";
int phWidth = imgPhoto.Width;
int phHeight = imgPhoto.Height;
//Bitmap bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Format24bppRgb);
Bitmap bmPhoto = new Bitmap(imgPhoto);
Bitmap bmWatermark = new Bitmap(imgPhoto);
bmPhoto.SetResolution(72, 72);
Graphics grPhoto = Graphics.FromImage(imgPhoto);
grPhoto.SmoothingMode = SmoothingMode.AntiAlias;
grPhoto.CompositingQuality = CompositingQuality.HighQuality;
grPhoto.DrawImage(
imgPhoto,
new Rectangle(0, 0, phWidth, phHeight),
0,
0,
phWidth,
phHeight,
GraphicsUnit.Pixel);
int[] sizes = new int[] { 16, 14, 12, 10, 8, 6, 4 };
Font crFont = null;
SizeF crSize = new SizeF();
crFont = new Font("Lucida Sans U", 45,
FontStyle.Bold);
crSize = grPhoto.MeasureString(copyrightString,
crFont);
// for (int i=0 ;i<7; i++)
// {
// crFont = new Font("arial", sizes[i],
// FontStyle.Bold);
// crSize = grPhoto.MeasureString(Copyright,
// crFont);
//
// if((ushort)crSize.Width < (ushort)phWidth)
// break;
// }
int yPixlesFromBottom = (int)(phHeight * .05);
//float yPosFromBottom = ((phHeight - yPixlesFromBottom)-(crSize.Height/2));
float yPosFromBottom = (phHeight - 100);
float xCenterOfImg = (phWidth - 180);
StringFormat StrFormat = new StringFormat();
StrFormat.Alignment = StringAlignment.Center;
SolidBrush semiTransBrush2 =
new SolidBrush(Color.FromArgb(100, 0, 0, 0));
grPhoto.DrawString(copyrightString,
crFont,
semiTransBrush2,
new PointF(xCenterOfImg + 1, yPosFromBottom + 1),
StrFormat);
SolidBrush semiTransBrush = new SolidBrush(
Color.FromArgb(100, 255, 255, 255));
grPhoto.DrawString(copyrightString,
crFont,
semiTransBrush,
new PointF(xCenterOfImg, yPosFromBottom),
StrFormat);
Graphics g = Graphics.FromImage(bmPhoto);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.CompositingQuality = CompositingQuality.HighQuality;
g.DrawString(copyrightString, crFont, semiTransBrush, new PointF(250, 10), StrFormat);
return imgPhoto;
}
#endregion
标记图片水印#region 标记图片水印
/**//// <summary>
/// 标记图片水印。
/// </summary>
/// <param name="imgPhoto">原图片</param>
/// <param name="imgWatermark">背景图片</param>
/// <returns></returns>
public static Image MarkImage(Image imgPhoto, Image imgWatermark)
{
int phWidth = imgPhoto.Width;
int phHeight = imgPhoto.Height;
int wmWidth = imgWatermark.Width;
int wmHeight = imgWatermark.Height;
//Bitmap bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Format24bppRgb);
Bitmap bmPhoto = new Bitmap(imgPhoto);
Bitmap bmWatermark = new Bitmap(bmPhoto);
Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.SmoothingMode = SmoothingMode.AntiAlias;
grPhoto.CompositingQuality = CompositingQuality.HighQuality;
bmWatermark.SetResolution(
imgPhoto.HorizontalResolution,
imgPhoto.VerticalResolution);
Graphics grWatermark = Graphics.FromImage(bmWatermark);
ImageAttributes imageAttributes =
new ImageAttributes();
ColorMap colorMap = new ColorMap();
colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
ColorMap[] remapTable = { colorMap };
imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
float[][] colorMatrixElements = {
new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
new float[] {0.0f, 0.0f, 0.0f, 0.3f, 0.0f},
new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
};
ColorMatrix wmColorMatrix = new
ColorMatrix(colorMatrixElements);
//imageAttributes.SetColorMatrix(wmColorMatrix,
// ColorMatrixFlag.Default,
// ColorAdjustType.Bitmap);
int xPosOfWm = ((phWidth - wmWidth) - 10);
int yPosOfWm = (phHeight - wmHeight) - 10;
grWatermark.DrawImage(imgWatermark,
new Rectangle(xPosOfWm, yPosOfWm, wmWidth,
wmHeight),
0,
0,
wmWidth,
wmHeight,
GraphicsUnit.Pixel,
imageAttributes);
imgPhoto = bmWatermark;
grPhoto.Dispose();
grWatermark.Dispose();
return imgPhoto;
}
#endregion
}
}
以下是程序引用代码:
ImageUploadAutomatic.Text = content; //设置Html标签。
ImageUploadAutomatic.FilePath = "../Images/Uploads"; //设置图片上传路径。
ImageUploadAutomatic.RefersImagePath= "/Images/Uploads"; //设置图片引用路径。
ImageUploadAutomatic.IsSignWatermark = true; //确定生成水印。
ImageUploadAutomatic.WatermarkImage = "../Images/Mark.png"; //水印图片路径。
ImageUploadAutomatic.Submit(); //提交生成。
content = ImageUploadAutomatic.Text; //此处返回修改后的Html标签(仅修改了图片的链接地址)。
发布文章自动上传图片并生成水印相关推荐
- tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片...
本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...
- emlog发布文章自动变草稿修复方法
emlog写文章时总会自动保存,但有时会出现点击发布按钮他又给自动保存了,就导致发布的文章发布失败了自动转为草稿了.这个是怎么判断的?看看能不能改成点击发布时不要再执行自动保存的命令了. 修复方法: ...
- SEO优化:WordPress发布文章主动推送到百度,加快收录保护原创
工作实在太忙,也没时间打理网站.最近公司额外交待了一些网站 SEO 方面的优化任务让我关注(这就是啥都要会.啥都要做的苦逼运维的真实写照了...). 于是抽空看了下百度站长平台,至少看到了2个新消息: ...
- php自动生成网站地图txt,织梦网站地图生成插件+发布文章后自动生成地图
织梦网站地图生成插件,可同时在网站根目录生成5种地图文件. 下载地址(根据自己网站编码选择安装) 百度网盘 提取码: 3bjg 安装好后的生成菜单在模块一栏里面 如果你想把生成网站地图这个菜单放在生成 ...
- 织梦DEDE后台定时分时段自动更新发布文章插件
定时审核插件使用说明 一.立信CPA培训注册会计师考试网站 以超级管理员身份登录后台,依次选择[核心]à [定时审核管理],输入定时审核的时间段,如下图所示: 功能说明: 1. 可以设置若干时间段,在 ...
- 自动生成文章的html,文章自动更新工具|自动生成文件|自动伪原创|文章自动插入关键词工具...
概念网络发布一款自动更新文章的工具, 该套工具可用概念的文章站程序, 概念的发布站程序, 概念的企业站程序, 只要在服务器一直开着这个工具, 工具会更具配置文件的配置, 每天定时的更新网站的文章, 文 ...
- asp.net中上传图片并生成小图片,自动添加水印的代码 .
asp.net中上传图片并生成小图片,自动添加水印的代码 分类: .Net(C#) 2010-03-22 15:28 242人阅读 评论(0) 收藏 举报 /// 上传图片生成缩略图及水印 (来自:h ...
- 关键词文章自动生成的四大要点
关键词文章自动生成是我们很多网站和自媒体使用的文章素材获取方式,是我们获取素材进行二次创作的不错途径.怎样让我们的网站的文章更受搜索引擎和用户的欢迎,并获得不错的排名是我们SEOER需要考虑的. 文章 ...
- Python + Selenium 自动发布文章(二):简书
Python + Selenium 自动发布文章系列: Python + Selenium 自动发布文章(一):开源中国 Python + Selenium 自动发布文章(二):简书 Python + ...
最新文章
- R语言ggplot2可视化:使用堆叠的条形图(Stacked Barplot)可视化每个数据行(row)的缺失值的情况(Visualizing missing data counts in rows)
- UI布局分析工具-视图工具(Hierarchy Viewer)
- left join(左联接) left join(左联接) left join(左联接)
- 移动开发必须要了解的易盾加固生态
- Universal Windows Platform(UWP)应用的窗口特性
- 关闭mysql服务的方法有哪些_MySQL--启动和关闭MySQL服务
- ASP.NET版在线客服系统源码 带服务端
- ubuntu设置打开主目录(home文件夹)的快捷键
- airtest adb 远程连接_使用Airtest超快速开发App爬虫
- 基于nodej脚手架express-generator,生成express项目
- apple_Apple WWDC 2018主题总结
- 莫兰指数stata命令_一文读懂16个sp系列stata空间计量命令及应用
- 多元函数求极值中的a_二元函数求极值
- C++:从入门到放弃[2]变量和读入
- c语言方式表达教师节快乐,教师节丨纸短情长 难忘师恩 请您收下这封慰问信(内含表彰名单)...
- 《南极测绘地理信息应用服务关键技术研究》在西安通过了专家组的验收
- linux下读写emmc,nand,硬盘下的文件(一)
- 【ACM】算法题-阿尔法GO的缺陷(深度搜索解法)(C++)
- Thebrain12官方正式版来了,Beta拜拜!
- “摄像头用不了”+win8.1+DELL+外置摄像头+USB免驱的解决办法
热门文章
- Win11键盘在哪里设置?Win11键盘的设置方法
- Thread多线程用法示例
- 怎么调试内存溢出的c++代码_使用jvisualvm排查一次内存溢出(OOM)过程
- master节点重置后添加node报错_企业实战(23)基于Docker平台的Jenkins添加node节点与报错详解(2)...
- 陇东学院计算机学院教授有,陇东学院
- linux keepalived 脚本,Linux下安装Keepalived及原理分析
- 洛谷——P1614 爱与愁的心痛
- 基础选择器之id选择器(CSS、HTML)
- AWT_Swing_单选框(Java)
- python爬取京东手机配置信息(正则)