У меня возникает проблема, когда я загружаю файл в растровое изображение, получая нужные мне свойства изображения, а затем удаляя битмап.Исключение OutOfMemory Загрузка растрового изображения из файла
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, но при запуске профилировщика памяти, то Appication только с помощью 200М 1.4GB, что он может выделить. Я посмотрел изображение, и этот файл имеет только 64 МБ jpg, поэтому даже после преобразования в растровое изображение не должно потреблять большую часть оставшегося 1,2 ГБ. Ошибка происходит в Bitmap.FromFile
. Метод для создания tmpImage
Почему я должен получать исключение OutOfMemory, когда у меня еще много памяти для выделения?
Я вижу, что вы решили проблему, но я просто хотел добавить, что, хотя изображение может быть 64 МБ на диске, оно, вероятно, сжато до некоторой степени. При загрузке в память в .Net он больше не сжимается, поэтому объем памяти будет _width * height * bytes per pixel_. –
Это правда, поэтому я и сказал это в своем вопросе. Даже при 90% сжатии, хотя это было бы довольно убыточным, это все равно оставалось бы только половиной оставшейся памяти. –