为什么 GDI 不允许我删除大图像?

发布于 2024-08-06 20:58:29 字数 471 浏览 2 评论 0原文

我的 ASP.NET 应用程序具有图像裁剪和调整大小功能。这需要删除上传的临时图像。一切正常,但当我尝试删除大于 80px x 80px 的图像时,我收到“文件被另一个进程锁定...”错误,即使我已经释放了所有资源。

这是一个片段:

System.Drawing.Image tempimg = System.Drawing.Image.FromFile(temppath);
System.Drawing.Image img = (System.Drawing.Image) tempimg.Clone(); //advice from another forum
tempimg.Dispose();

img = resizeImage(img, 200, 200); //delete only works if it's 80, 80
img.Save(newpath);
img.Dispose();

File.Delete(temppath);

My ASP.NET application has an image cropping and resizing features. This requires that the uploaded temporary image be deleted. Everything works fine, but when I try to delete an image larger than 80px by 80px I get a "File is locked by another process..." error, even though I've released all resources.

Here's a snippet:

System.Drawing.Image tempimg = System.Drawing.Image.FromFile(temppath);
System.Drawing.Image img = (System.Drawing.Image) tempimg.Clone(); //advice from another forum
tempimg.Dispose();

img = resizeImage(img, 200, 200); //delete only works if it's 80, 80
img.Save(newpath);
img.Dispose();

File.Delete(temppath);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

云朵有点甜 2024-08-13 20:58:29

我认为您没有处理分配给 img 变量的第一个 Image 实例。

考虑一下这个:

System.Drawing.Image tempimg = System.Drawing.Image.FromFile(temppath);
System.Drawing.Image img = (System.Drawing.Image) tempimg.Clone();
tempimg.Dispose();

System.Drawing.Image img2 = resizeImage(img, 200, 200);
img2.Save(newpath);
img2.Dispose();
img.Dispose();

File.Delete(temppath);

I think you are not disposing the first Image instance assigned to the img variable.

Consider this instead:

System.Drawing.Image tempimg = System.Drawing.Image.FromFile(temppath);
System.Drawing.Image img = (System.Drawing.Image) tempimg.Clone();
tempimg.Dispose();

System.Drawing.Image img2 = resizeImage(img, 200, 200);
img2.Save(newpath);
img2.Dispose();
img.Dispose();

File.Delete(temppath);
乖乖 2024-08-13 20:58:29

如果您以这种方式创建图像,它将不会被锁定:

using (FileStream fs = new FileStream(info.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    byte[] data = new byte[fs.Length];
                    int read = fs.Read(data, 0, (int)fs.Length);
                    MemoryStream ms = new MemoryStream(data, false);
                    return Image.FromStream(ms, false, false); // prevent GDI from holding image file open
                }

If you create the image this way, it won't be locked:

using (FileStream fs = new FileStream(info.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    byte[] data = new byte[fs.Length];
                    int read = fs.Read(data, 0, (int)fs.Length);
                    MemoryStream ms = new MemoryStream(data, false);
                    return Image.FromStream(ms, false, false); // prevent GDI from holding image file open
                }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文