生成缩略图的问题,生成后无法删除
生成缩略图后,再对这张图片操作,就出错:该进程无法访问文件“”,因为该文件正由另一进程使用。
代码如下:
//从文件取得图片对象
System.Drawing.Image image = System.Drawing.Image.FromFile(originalFilename);
//新建一个bmp图片
System.Drawing.Image bitmap = new System.Drawing.Bitmap(size.Width,size.Height);
//新建一个画板
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
......
//结束
bitmap.Dispose();
image.Dispose();
g.Dispose();
是否没有完全释放资源?
问题点数:20、回复次数:7Top
1 楼anantnt203120(阿南)回复于 2005-12-16 09:45:28 得分 0
保存到数据里,再从数据库里取,就没有这个问题。Top
2 楼wolanda(wolanda)回复于 2005-12-16 10:13:26 得分 0
保存到数据里是什么意思?
你是指把图片存到数据库里?
图片名称我是存到数据库里的,然后再从数据库里取出来操作的
如果我生成了这张图片,马上对它进行删除操作,就出错了
但过一段时间再进行删除操作就可以Top
3 楼amnoh(会走路的鱼)回复于 2005-12-16 11:19:27 得分 5
楼主,你把关键的代码给省略了,
bitmap.Dispose();
image.Dispose();
g.Dispose();
这几句释放的是图像处理相关的资源,
但你的图像是怎么保存的??
应当用Stream了吧,看看那个Stream是不是正常关闭了,否则,再操作时肯定会"该进程无法访问文件,因为该文件正由另一进程使用"的,Top
4 楼wolanda(wolanda)回复于 2005-12-16 11:36:21 得分 0
省略的代码是这样的
System.Drawing.Size size = new Size(width , height);
//新建一个bmp图片
System.Drawing.Image bitmap = new System.Drawing.Bitmap(size.Width,size.Height);
//新建一个画板
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//清空一下画布(指定边沿颜色)
g.Clear(Color.White);
//在指定位置画图
g.DrawImage(image, new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
new System.Drawing.Rectangle(0, 0, image.Width,image.Height),
System.Drawing.GraphicsUnit.Pixel);
//保存高清晰度的缩略图
bitmap.Save(strGoodFile, System.Drawing.Imaging.ImageFormat.Jpeg);
请指点一下Top
5 楼tiaoci(我挑刺,我快乐)回复于 2005-12-16 17:26:22 得分 0
这是.NET的一个BUG,你可以先把文件读取到MemoryStream中
再生成图象Top
6 楼tiaoci(我挑刺,我快乐)回复于 2005-12-16 17:29:18 得分 10
今天刚刚写完,顺便给你吧 :)
/// <summary>
/// 装载图片并且防止图片被锁定
/// http://support.microsoft.com/kb/311754/EN-US/
/// </summary>
/// <param name="fileName">图片文件</param>
/// <returns>返回装载的图片对象</returns>
public static Image LoadImage(string fileName)
{
using(FileStream stream = new FileStream(
fileName, FileMode.Open, FileAccess.Read))
{
using(BinaryReader reader = new BinaryReader(stream))
{
// 取得所有的图片数据
byte[] buffer = new byte[stream.Length];
reader.Read(buffer, 0, (int)stream.Length);
// 然后创建一个内存中的Stream对象去生成图片
// 这样文件就不会被锁定了
using(MemoryStream ms = new MemoryStream(buffer))
{
return Image.FromStream(ms);
}
}
}
}Top
7 楼greennetboy(我的老婆叫静静)回复于 2005-12-17 03:10:48 得分 5
http://blog.csdn.net/greennetboy/archive/2005/12/09/547616.aspx
http://www.chinamacro.com/blog/visit_detail.aspx?blogID=46Top




