2015-02-23 4 views
0

У меня проблемы с памятью, считывание и закрытие нескольких изображений в формате JPG.У меня проблемы с памятью при чтении и закрытии нескольких изображений JPG


я загружаю JPG файлы в объект изображения, считывают информацию о файле (размер, размеры, даты и т.д.), и читать свои данные EXIF, чтобы получить геокод для Lat/Long. Затем я передаю информацию объекту ListView. Все это отлично работает в папках с до 60 или более JPG. После того, как я пройти определенное количество (не уверен, что порог на самом деле) я получаю мою любимую ошибку ...


************** Exception Text *** *********** System.OutOfMemoryException: Недостаточно памяти. в System.Drawing.Image.FromFile (String filename, Boolean useEmbeddedColorManagement) в System.Drawing.Image.FromFile (String filename)

... и т. д.


Я где-то утеплю память, но я немного новичок с приложениями .NET. Я вызываю эту процедуру из цикла, который читает коллекцию JPG-файлов в каталоге.

Public Function JPGDat(ByRef jpg As FileInfo) As ListViewItem 

    Dim filEntry(6) As String 
    Dim lstEntry As ListViewItem = Nothing 
    Dim pic As Image = Image.FromFile(jpg.FullName) 'HERE IS WHERE WE CRASH 

    filEntry(0) = jpg.Name 
    filEntry(1) = (Math.Round(jpg.Length/1024)).ToString() 'File Size 
    filEntry(2) = Format(pic.PhysicalDimension.Width, "0")  'Pixel width dimension 
    filEntry(3) = Format(pic.PhysicalDimension.Height, "0")  'Pixel height dimension 

    Try 
     Dim CLatt As Double = GetCoord(pic.GetPropertyItem(2)) 'Get Latitude from EXIF 
     Dim CLong As Double = GetCoord(pic.GetPropertyItem(4)) 'Get Longitude from EXIF 

     filEntry(4) = Format(CLatt, "0.000000000000000") 
     filEntry(5) = Format(CLong, "0.000000000000000") 
    Catch ex As Exception 
     filEntry(4) = "" 
     filEntry(5) = "" 
    End Try 
    filEntry(6) = "Date: " + Format(jpg.CreationTime, "yyyy-MM-dd") 

    lstEntry = New ListViewItem(filEntry) 
    If filEntry(4) <> "" Then 
     lstEntry.Checked = True 
    End If 
    pic.Dispose() 

    Return lstEntry 
End Function 
+0

В какой памяти диспетчер задач сообщает, что ваш процесс используется непосредственно перед его сбоем? – Dai

+0

Просто потому, что именно здесь происходит исключение OOM, это не значит, что это проблема. Вам нужно будет профилировать приложение, чтобы найти утечку. – user1620220

+0

Приношу свои извинения людям. Ошибка была в поврежденном файле JPG ... а не в коде. Еще одна попытка Try решила проблему. –

ответ

0

Убедитесь поставить команду открытого JPG в структуре Try ...

Try 
     pic = Image.FromFile(jpg.FullName) 
     filEntry(2) = Format(pic.PhysicalDimension.Width, "0")  'Pixel width dimension 
     filEntry(3) = Format(pic.PhysicalDimension.Height, "0")  'Pixel height dimension 

    Catch ex As Exception 
     MsgBox("Error in file " + jpg.FullName + vbCrLf + ex.Message) 
     JPGDat = New ListViewItem(filEntry) 

     Exit Function 
    End Try 

Таким образом, если вы получаете поврежденный JPG, вы не думаете, у вас есть утечка памяти!