memoria esaurita Image.FromFile

Perché ho un errore di memoria insufficiente? Grazie

if (File.Exists(photoURI)) { FileStream fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read); Image img = Image.FromStream(fs); fs.Close(); } 

Nella documentazione Image.FromFile , può essere Image.FromFile una OutOfMemoryException se:

Il file non ha un formato immagine valido.

-o-

GDI + non supporta il formato pixel del file.

Controlla il tuo formato di immagine.

Inoltre, se vuoi chiudere il stream subito dopo aver caricato l’immagine, devi fare una copia dell’immagine. Dai un’occhiata qui . GDI + deve mantenere il stream aperto per la durata dell’immagine.

Primo errore:

 if (File.Exists()) 

Il file system è volatile e pertanto l’accesso al file può cambiare tra la linea con la condizione if e la riga seguente. Non solo, ma File.Exists () potrebbe restituire true, ma il tuo FileStream potrebbe comunque generare un’eccezione se non hai i permessi di sicurezza sul file o se è già bloccato.

Invece, il modo corretto per gestirlo è con un blocco try / catch. Dedica invece il tuo tempo di sviluppo al gestore delle eccezioni, perché devi comunque scrivere quel codice.

Secondo errore:

 fs.Close(); 

Questa linea deve trovarsi all’interno di un blocco finale oppure è ansible lasciare le maniglie di file aperte in giro. Normalmente raccomando un blocco using per assicurare che questo tipo di risorsa sia correttamente smaltita, ma poiché hai già bisogno di try / catch, puoi usare un codice come questo:

 Image img = null; FileStream fs = null; try { fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read); img = Image.FromStream(fs); } finally { fs.Close(); } 

Non è ansible utilizzare Image.FromStream per il file, ma è necessario decodificare il file utilizzando TiffBitmapDecoder . Esempio di codice da MSDN:

 // Open a Stream and decode a TIFF image Stream imageStreamSource = new FileStream("tulipfarm.tif", FileMode.Open, FileAccess.Read, FileShare.Read); TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); BitmapSource bitmapSource = decoder.Frames[0]; // Draw the Image Image myImage = new Image(); myImage.Source = bitmapSource; myImage.Stretch = Stretch.None; myImage.Margin = new Thickness(20); 

Ho avuto lo stesso problema, eccezioni di memoria per un’immagine o una bitmap e ho provato a ridimensionarlo, dipingendolo su pannelli e scatole di immagini, il tutto. Ho avuto la memoria disponibile, quindi l’eccezione era un po ‘una falsa pista nel mio caso.

Dopo ore di kicking del PC ho scoperto che si trattava di una DLL di terze parti che non stava chiudendo un stream. Alcuni debug di “scrittura” che potrebbero essere utili per verificare se la memoria è effettivamente disponibile:

 proc = Process.GetCurrentProcess(); Console.WriteLine("Memory Usage" + proc.PrivateMemorySize64); 

Vedi questa risposta di Hans Passant:

GDI + è stato scritto un bel po ‘prima che .NET venisse a galla. Il wrapper SDK per esso è stato scritto in C ++. Per mantenerlo compatibile, non poteva usare le eccezioni. Le condizioni di errore sono state segnalate con i codici di errore. Che non si adatta mai bene, GDI + ha solo 20 codici di errore. Non è tanto per un pezzo così grande di codice.

Il codice di errore Status :: OutOfMemory è stato sovraccaricato per indicare cose diverse. A volte significa veramente memoria insufficiente, non può allocare spazio sufficiente per memorizzare i bit bitmap. Purtroppo, non so come sia successo, un problema di formato file immagine è riportato dallo stesso codice di errore. Non esiste un codice di errore dedicato che possa descriverlo in modo più accurato, immagino.

Deseleziona Encrypt contents to secure data nelle proprietà dei file – questo ha risolto il problema per me.

inserisci la descrizione dell'immagine qui