2015-02-23 28 views
0

我有閱讀和關閉多個JPG圖像的內存問題。我有閱讀和關閉多個JPG圖像的內存問題


我加載的JPG文件轉換爲圖像對象,讀取文件信息(大小,尺寸,日期等),並閱讀他們的EXIF數據中獲取緯度/地理編碼長。然後我將這些信息推送給一個ListView對象。這對所有JPG格式的文件夾都很有用。有一次,我晃過了一定數量(不知道是什麼的門檻實際上是)我得到我最喜歡的錯誤...


**************異常文本*** *********** System.OutOfMemoryException: 內存不足。 System.Drawing.Image.FromFile(String filename,Boolean useEmbeddedColorManagement) at 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 2015-02-23 21:50:40

+0

僅僅因爲這是OOM例外發生的地方,並不意味着問題出在哪裏。您需要對您的應用程序進行配置以查找泄漏。 – user1620220 2015-02-23 21:53:31

+0

我對此表示歉意。該錯誤是在一個損壞的JPG文件...不是代碼。增加一個Try命令解決了這個問題。 – 2015-02-23 22:10:44

回答

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,你會不會覺得你有內存泄漏!