【发布时间】:2016-10-12 14:45:00
【问题描述】:
我遇到了一个问题,我将文件加载到位图中,获取所需的图像属性,然后处理位图。
foreach (string file in fiList)
{
newImage = new imageInfo();
newImage.OrigName = currFile.Name;
newImage.Location = currFile.FullName;
newImage.NewName = cleanFileName(newImage);
newImage.ManualNameChange = false;
newImage.Type = type;
newImage.Size = Math.Round(sizeInMB, 2) + " KB";
newImage.LastModified = currFile.LastWriteTime;
newImage.CreateDate = currFile.CreationTime;
tmpImage = Bitmap.FromFile(currFile.FullName);
newImage.DPI =
(int)Math.Ceiling(tmpImage.HorizontalResolution);
newImage.Width = tmpImage.Width;
newImage.Height = tmpImage.Height;
newImage.PixelFormat = tmpImage.PixelFormat.ToString();
tmpImage.Dispose();
...
}
我不断收到 OutOfMemory 错误,但在运行内存分析器时,该应用程序仅使用了它可以分配的 1.4GB 中的 200M。我看了看图片,这个文件只有 64MB jpg,所以即使转换为位图,也不应该消耗剩下的 1.2GB 的大部分。错误发生在 Bitmap.FromFile 方法上创建 tmpImage
当我仍然有足够的内存要分配时,为什么会出现 OutOfMemory 异常?
【问题讨论】:
-
我看到你已经解决了你的问题,但我只是想补充一点,虽然磁盘上的图像可能是 64MB,但它可能在某种程度上被压缩了。当在 .Net 中加载到内存中时,它不再被压缩,因此内存量将为 width * height * bytes per pixel.
-
确实如此,这就是我在问题中陈述这一点的原因。即使在 90% 的压缩下(这将是相当有损的),这仍然只是剩余内存的一半。