Image.FromFile()报错内存不足

yaotomo 2018-11-04 09:02:55
网站上传文件要做一个水印图和缩略图,运行几天后就会报错内存不足
应该是Image.FromFile这里报的,资源没有释放干净
可是我觉得我都释放了,using,dispose都用了
因为上传非常频繁,常常几百张,GC.Collect()不合适的,其实我也试过不管用
请帮帮小弟,这个问题困扰很久了

下面是我的代码

//修改后的缩略图方法
public string MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string type)
{
string errMsg = "";
try
{
using (Image originalImage = Image.FromFile(originalImagePath))
{
try
{
//新加,修正竖拍照片
RotateImage(originalImage);

int ow = originalImage.Width;
int oh = originalImage.Height;
int towidth = width;
int toheight = height;
if (type == "normal") //水印图
{
//宽<高,竖图
if (ow < oh)
{
towidth = 1024;
decimal wh = (decimal)oh / ow; //宽高比
toheight = (int)(wh * towidth);
}
}
if (type == "thumbnail")
{
//宽<高,竖图
if (ow < oh)
{
width = 160;
height = 220;
towidth = 160;
toheight = 220;
}
}

int x = 0;
int y = 0;

//新建一个bmp图片
using (Image bitmap = new System.Drawing.Bitmap(towidth, toheight))
{
//新建一个画板
Graphics g = System.Drawing.Graphics.FromImage(bitmap);
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//清空画布并以透明背景色填充
g.Clear(Color.Transparent);
//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
new Rectangle(x, y, ow, oh),
GraphicsUnit.Pixel);
try
{
//以jpg格式保存缩略图
if (!Directory.Exists(thumbnailPath))
{
Directory.CreateDirectory(thumbnailPath);
}
if (type == "thumbnail")
{
bitmap.Save(thumbnailPath + Path.GetFileName(originalImagePath), System.Drawing.Imaging.ImageFormat.Jpeg);
}
//如果是普通大小,要添加水印
if (type == "normal")
{
g.DrawImage(bitmap, 0, 0, bitmap.Width, bitmap.Height);
using (Font f = new Font("宋体", 15))
{
using (Brush b = new SolidBrush(Color.White))
{
SizeF ef = g.MeasureString(_WatermarkText, f);
int num = (int)(toheight * 0.05);
float xt = (towidth - (ef.Width / 2f)) - 10f;
float yt = (toheight - num) - (ef.Height / 2f);
StringFormat format = new StringFormat { Alignment = StringAlignment.Center };
g.DrawString(_WatermarkText, f, b, new PointF(xt, yt), format);
_WatermarkFile = ow < oh ? _WatermarkFile.Replace("1.0", "1.1") : _WatermarkFile;
Image _WaterImage = Image.FromFile(_WatermarkFile);
if (_WaterImage != null)
{

ImageAttributes imageAttr = new ImageAttributes();
towidth = (towidth - _WaterImage.Width) - 10;
toheight = (toheight - _WaterImage.Height) - 10;
g.DrawImage(_WaterImage, new Rectangle(towidth, toheight, _WaterImage.Width, _WaterImage.Height), 0, 0, _WaterImage.Width, _WaterImage.Height, GraphicsUnit.Pixel, imageAttr);
}
}
}
//以jpg格式保存缩略图
bitmap.Save(thumbnailPath + Path.GetFileName(originalImagePath), System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
catch (Exception e)
{
errMsg = GetInnerException(e) ;
}
finally
{
bitmap.Dispose();
g.Dispose();
}
}
}
catch (Exception ex)
{
errMsg = GetInnerException(e) ;
}
finally
{
originalImage.Dispose();
}
}
}
catch (Exception ex)
{
errMsg = GetInnerException(e) ;
}
return errMsg;
}

...全文
994 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_17766193 2019-01-25
  • 打赏
  • 举报
回复
思路, 根据每个任务,生成一个任务号, 当任务执行完成,释放该任务号里面所占内存资源及线程资源
司马义 2019-01-25
  • 打赏
  • 举报
回复
要加清理内存代码,我没有记错的话应该是 Beep()
吹风的兔子 2018-11-24
  • 打赏
  • 举报
回复
https://bbs.csdn.net/topics/390794261 第8楼: 谢谢,问题解决了,是图片问题,实验图片是被我从.bmp直接重命名为.jpg的,在这里出了差错。
吹风的兔子 2018-11-24
  • 打赏
  • 举报
回复
打开任务管理器,菜单栏>查看>选择列>勾选: 用户对象,GDI对象,句柄数 —— 这三个对象,任意一个 超过 10000 程序都会崩溃。 理论上应该是你有 对象没有释放 —— 多上传几张,看这三个里面 是不是有哪个 一直在增加,从未被释放。
  • 打赏
  • 举报
回复
加水印和生成缩略图,通常应该在上传过程中就做了呀,为什么要先把图片保存然后再读出来再加水印生成缩略图呢。
吉普赛的歌 2018-11-05
  • 打赏
  • 举报
回复 1
如果你实在找不到原因, 最快捷的办法就是将这一块单独出来, 做成控制台程序。 然后用 Proccess 做外部调用。 调用完, 不管它内部有没有释放, 反正外部调用完进程结束了一定是会释放的了。
本人QQ-554433626 2018-11-05
  • 打赏
  • 举报
回复
_WaterImage不是没释放嘛 Image.FromFile(path);path文件被破坏,或者是空图片也会报内存不足,使用之前对path判断

FileInfo fi=new FileInfo(path);
if(fi.Length>0){}
  • 打赏
  • 举报
回复
RotateImage里面是干吗的?旋转图片?这部分有做释放吗? 当然如果你懂windbg的话,可以抓dump分析
threenewbee 2018-11-04
  • 打赏
  • 举报
回复
看下任务管理器,是内存用尽了么?还是内存有很多,有可能是gdi资源泄露,而不是内存。

62,072

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧