把 hu core 移除掉。
跟命名空间有关系吗?
@胡晓凯: 跟你使用的 Hu.Core 的功能有关系。
@Launcher: 这个里有个从网上找的增加水印的方法
/// <summary> /// 水印图片 /// 【如果图片需要缩略,请使用skeletonize.Resizepic()方法对图片进行缩略】 /// 返回图片虚拟路径,和一个警告信息,可根据此信息获取图片合成信息 /// </summary> /// <param name="picpath">需要水印的图片路径</param> /// <param name="waterspath">水印图片路径</param> /// <param name="watermodel">水印模式</param> /// <param name="spath">文件保存路径</param> /// <param name="imgtype">保存文件类型</param> /// <param name="filecache">原文件处理方式</param> /// <param name="warning">处理警告信息</param> /// <returns>错误,返回错误信息;成功,返回图片路径</returns> public static string makewatermark(string picpath, string waterspath, Commonfun.WaterType watermodel, string spath, Commonfun.ImageType imgtype, Commonfun.FileCache filecache, out string warning) { var resetImage = picpath; #region //反馈信息 System.Text.StringBuilder checkmessage = new System.Text.StringBuilder(); //检测源文件 string _sourceimg_common_mappath = ""; bool checkfile = false; //检测水印源文件 string _sourceimg_water_mappath = ""; bool checkfilewater = false; checkfile = Commonfun.FileExistMapPath(picpath, Commonfun.FileCheckModel.C, out _sourceimg_common_mappath); checkfilewater = Commonfun.FileExistMapPath(waterspath, Commonfun.FileCheckModel.C, out _sourceimg_water_mappath); System.Drawing.Image _sourceimg_common = null; System.Drawing.Image _sourceimg_water = null; if (checkfile == true) { //从指定源文件,创建image对象 _sourceimg_common = System.Drawing.Image.FromFile(_sourceimg_common_mappath); } else { checkmessage.Append("error:找不到需要的水印图片!" + picpath + ";"); } if (checkfilewater == true) { //从指定源文件,创建image对象 _sourceimg_water = System.Drawing.Image.FromFile(_sourceimg_water_mappath); } else { checkmessage.Append("error:找不到需要水印图片!" + waterspath + ";"); } #endregion #region if (string.IsNullOrEmpty(checkmessage.ToString())) { //源图宽、高 int _sourceimg_common_width = _sourceimg_common.Width; int _sourceimg_common_height = _sourceimg_common.Height; //水印图片宽、高 int _sourceimg_water_width = _sourceimg_water.Width; int _sourceimg_water_height = _sourceimg_water.Height; #region 水印坐标 //水印坐标 int _sourceimg_water_point_x = 0; int _sourceimg_water_point_y = 0; switch (watermodel) { case Commonfun.WaterType.Center: _sourceimg_water_point_x = (_sourceimg_common_width - _sourceimg_water_width) / 2; _sourceimg_water_point_y = (_sourceimg_common_height - _sourceimg_water_height) / 2; ; break; case Commonfun.WaterType.CenterDown: _sourceimg_water_point_x = (_sourceimg_common_width - _sourceimg_water_width) / 2; _sourceimg_water_point_y = _sourceimg_common_height - _sourceimg_water_height; ; break; case Commonfun.WaterType.CenterUp: _sourceimg_water_point_x = (_sourceimg_common_width - _sourceimg_water_width) / 2; _sourceimg_water_point_y = 0; ; break; case Commonfun.WaterType.LeftDown: _sourceimg_water_point_x = 0; _sourceimg_water_point_y = _sourceimg_common_height - _sourceimg_water_height; ; break; case Commonfun.WaterType.LeftUp: ; break; case Commonfun.WaterType.Random: Random r = new Random(); int x_random = r.Next(0, _sourceimg_common_width); int y_random = r.Next(0, _sourceimg_common_height); _sourceimg_water_point_x = x_random > (_sourceimg_common_width - _sourceimg_water_width) ? _sourceimg_common_width - _sourceimg_water_width : x_random; _sourceimg_water_point_y = y_random > (_sourceimg_common_height - _sourceimg_water_height) ? _sourceimg_common_height - _sourceimg_water_height : y_random; ; break; case Commonfun.WaterType.RightDown: _sourceimg_water_point_x = _sourceimg_common_width - _sourceimg_water_width; _sourceimg_water_point_y = _sourceimg_common_height - _sourceimg_water_height; ; break; case Commonfun.WaterType.RightUp: _sourceimg_water_point_x = _sourceimg_common_width - _sourceimg_water_width; _sourceimg_water_point_y = 0; ; break; } #endregion //从源图创建画板 System.Drawing.Graphics _g_common = Graphics.FromImage(_sourceimg_common); //设置画笔 _g_common.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; _g_common.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; _g_common.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; //绘制水印图片 _g_common.DrawImage(_sourceimg_water, new Rectangle(_sourceimg_water_point_x, _sourceimg_water_point_y, _sourceimg_water_width, _sourceimg_water_height), new Rectangle(0, 0, _sourceimg_water_width, _sourceimg_water_height), GraphicsUnit.Pixel); //保存图片 string _spath_common_mappath = ""; //全局文件名 //获取图片类型的hashcode值,生成图片后缀名 int extro = imgtype.GetHashCode(); string extend = extro == 0 ? ".jpg" : (extro == 1 ? ".gif" : (extro == 2 ? ".png" : ".jpg")); spath = spath + Guid.NewGuid().ToString() + extend; Commonfun.FileExistMapPath(spath, Commonfun.FileCheckModel.M, out _spath_common_mappath); switch (imgtype) { case Commonfun.ImageType.JPEG: _sourceimg_common.Save(_spath_common_mappath, System.Drawing.Imaging.ImageFormat.Jpeg); break; case Commonfun.ImageType.GIF: _sourceimg_common.Save(_spath_common_mappath, System.Drawing.Imaging.ImageFormat.Gif); break; case Commonfun.ImageType.PNG: _sourceimg_common.Save(_spath_common_mappath, System.Drawing.Imaging.ImageFormat.Png); break; } //释放 _sourceimg_common.Dispose(); _sourceimg_water.Dispose(); _g_common.Dispose(); //处理原文件 int filecachecode = filecache.GetHashCode(); //删除原文件 if (filecachecode == 1) { System.IO.File.Delete(_sourceimg_common_mappath); } warning = ""; } else { spath = String.Empty; } #endregion //释放 if (_sourceimg_common != null) { _sourceimg_common.Dispose(); } if (_sourceimg_water != null) { _sourceimg_water.Dispose(); } warning = checkmessage.ToString().TrimEnd(';'); return String.IsNullOrWhiteSpace(spath) ? resetImage : spath; }
@胡晓凯: 看不懂。这是啥:Commonfun.FileCache filecache?
@Launcher: 是另外的类:
public class Commonfun
{
/// <summary>
/// 原图文件是否保存
/// Delete:保存
/// Save:不保存,删除
/// </summary>
public enum FileCache
{
Save,
Delete
}
}
@胡晓凯: 报内存不足错误时,用 Clr Profiler 分析下内存占用情况。
@Launcher: 昨天看了 一天网站的内存变化,没有占用太大的(服务器16G的内存),其中我在Image.FromFile 上下增加了try catch,到现在没有出现内存不足的错误!
直接用.NET自带的功能处理图片是非常占内存的。。。
可以的话请用unsafe代码处理,具体看以下文章: