2016-10-12 4 views
-1

У меня возникает проблема, когда я загружаю файл в растровое изображение, получая нужные мне свойства изображения, а затем удаляя битмап.Исключение 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, когда у меня еще много памяти для выделения?

+3

Я вижу, что вы решили проблему, но я просто хотел добавить, что, хотя изображение может быть 64 МБ на диске, оно, вероятно, сжато до некоторой степени. При загрузке в память в .Net он больше не сжимается, поэтому объем памяти будет _width * height * bytes per pixel_. –

+0

Это правда, поэтому я и сказал это в своем вопросе. Даже при 90% сжатии, хотя это было бы довольно убыточным, это все равно оставалось бы только половиной оставшейся памяти. –

ответ

-1

После некоторого рытья это фактически не имеет никакого отношения к распределению памяти программы. Эта проблема на самом деле связана с попыткой загрузить поврежденное изображение в память. По какой-то причине, когда изображение повреждено, это вызывает выброс OutOfMemory Exception. Это немного ложный позитив.

Смежные вопросы