1

我使用以下代码来缩放和裁剪文件夹中的所有图像。

string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file);
string fileExtension = Path.GetExtension(file);
string filePath = Path.GetDirectoryName(file);
string newFileName = string.Empty;
long fileSize = new FileInfo(file).Length;

if (fileSize > fileSizeLimit)
{
    string tempFile = System.IO.Path.GetTempFileName();
    File.Copy(file, tempFile, true);
    Bitmap sourceImage = (Bitmap)System.Drawing.Image.FromFile(tempFile);

    System.Drawing.Image imgPhoto = ScaleCrop(sourceImage, sourceImage.Width / 4, sourceImage.Height / 4, AnchorPosition.Top);
    Bitmap bitImage = new Bitmap(imgPhoto);
    File.Delete(file);

    newFileName = filePath + "\\" + fileNameWithoutExtension + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + CoilWarehouseProcessed + fileExtension;

    bitImage.Save(newFileName, System.Drawing.Imaging.ImageFormat.Jpeg);

    imgPhoto.Dispose();
    bitImage.Dispose();
}

如果我在本地运行应用程序(在 VS2010 中处于调试模式)并将其指向网络驱动器,那么每次都会处理所有图像。

如果我从我们的本地网络服务器运行它,问题是该应用程序可能不处理任何图像,它可能处理 5 个,它可能处理 1 个,它永远不会处理给定文件夹中的所有图像,只会处理其中一些图像......然后它挂在客户端浏览器中。

没有可通过事件日志查看的事件……应用程序无论如何都不会崩溃或错误……它会处理图像的事实证明这不是权限问题。

任何想法为什么会发生这种情况?

编辑:感谢 wazdev,但我最终测试了一个侵入性较小的(并且也不喜欢依赖于 3rd 方软件的依赖项)解决方案,到目前为止一切似乎都很好......基本上我改变了它,以便当它复制流以生成新图像“System.Drawing.Image imgPhoto = ...”以使用 using 语句确保处理“临时”图像。我还将原始(未裁剪/未缩放的图像)文件的删除移动到最后一个操作(在测试中它运行良好,只有时间会告诉一旦更多用户上线并测试并发性):

string tempFile = System.IO.Path.GetTempFileName();
File.Copy(file, tempFile, true);
Bitmap sourceImage = (Bitmap)System.Drawing.Image.FromFile(tempFile);

System.Drawing.Image imgPhoto = ScaleCrop(sourceImage, sourceImage.Width / 4, sourceImage.Height / 4, AnchorPosition.Top);

Bitmap bitImage;

using (var bmpTemp = new Bitmap(imgPhoto))
{
    bitImage = new Bitmap(bmpTemp);
}

newFileName = filePath + "\\" + fileNameWithoutExtension + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + CoilWarehouseProcessed + fileExtension;

bitImage.Save(newFileName, System.Drawing.Imaging.ImageFormat.Jpeg);

imgPhoto.Dispose();
bitImage.Dispose();
File.Delete(file);

EDIT2:它已经上线了几天,我每天都对其进行测试,并且运行良好。这就是我所做的一切;

基本上在 ScaleCrop() 调用中有一个 GC.Collect 和一个 Wait For Pending Finalisers() 调用。我删除了等待挂起的调用并将 GC.Collect() 移到 File.Delete() 之后。

4

1 回答 1

2

过去当 RAM 耗尽导致分页到磁盘时,我已经看到过这种行为。我在利用 ImageResizing.net 库方面取得了很大的成功:http: //imageresizing.net/

我更新了我的代码以使用这个库,并且从未回头。

高温高压

(我与 imageresizing.net 没有任何关系——我只是一个非常快乐的用户)

于 2016-03-01T10:18:11.763 回答