2010-08-24 15 views
6

Sto tentando di caricare un'immagine estremamente grande (14473x25684), ma sto vincendo in un limite di memoria.OutofMemoryException - Caricamento di immagini estremamente grandi

Ecco un semplice programma per illustrare il problema:

static void Main(string[] args) 
{ 
    string largeimage = @"C:\Temp\test_image.jpg"; // 14473x25684 

    Image i = Bitmap.FromFile(largeimage); // OutofMemoryException was unhandled 
} 

Adesso ho capito che il problema non è rilevante per la quantità di memoria fisica che ho, ma piuttosto è una limitazione di indirizzamento. C'è qualcosa che posso fare per aggirare questa limitazione?

L'immagine è effettivamente valida e si apre bene in Photoshop (VM ​​Size: 916 MB) e ACDSee. Inoltre non infastidire Google le dimensioni in quanto le dimensioni elencate non sono esatte. :)

Grazie per il vostro tempo.

+0

Mi sono imbattuto in questo prima. Da quello che posso dire è la struttura che si sta facendo da parte. –

+0

Wow. Questa è una grande immagine. Sfortunatamente, la classe Bitmap framework non coprirà le tue esigenze. Potresti scoprire che prendere un approccio chunked, dove fai da solo l'intestazione della bitmap e campionare i pixel in una dimensione dell'immagine più gestibile è la soluzione migliore. È una sfida però, poiché comporta una piccola ricostruzione delle ruote. Sarei sorpreso se Photoshop e ACDSee caricassero in memoria l'intera immagine non compressa. – kbrimington

risposta

4

La classe Bitmap richiederà intorno 1.5GB di memoria per contenere tale istanza. L'allocatore di memoria .NET normalmente soffoca attorno al segno da 1 GB.

0

Il sistema operativo non può assegnare quantità di memoria contigue. Tutto quello che puoi fare è usare MemoryFailPoint e catturare InsufficientMemoryException. Ma questo ti fa risparmiare solo dall'arresto anomalo dell'app.
Per quanto mi riguarda, per aprire un file così grande dovresti usare il lettore binario e disegnare un file tramite System.Drawing.

qui è buono domande e risposte When is it OK to catch an OutOfMemoryException and how to handle it?

+0

Il sistema operativo può farlo (se si tratta di un sistema operativo a 64 bit), ma il framework .NET non può (anche se è a 64 bit). –

Problemi correlati