2012-06-16 11 views
6

Sto lavorando a un progetto universitario e sono rimasto bloccato con problemi di memoria. carico un bitmap che impiega circa 1,5 GB su HDD con codice qui sotto:Elaborazione su bitmap di grandi dimensioni (fino a 3 GB)

Bitmap bmp = new Bitmap(pathToFile); 

Il problema è che l'oggetto appena creato Bitmap utilizza circa 3,5GB di RAM che è qualcosa che non riesco a capire (che è involucro davvero GRANDE: E). Ho bisogno di arrivare all'array di pixel, e l'uso della classe Bitmap è davvero utile (utilizzo il metodo LockBits() in un secondo momento ed elabora l'array byte per byte) ma in questo caso è il blocker totale. Quindi, ecco la mia domanda:

C'è un modo semplice per estrarre l'array di pixel senza prestare ulteriori 2 GB?

Sto usando C# solo per estrarre l'array necessario, che verrà successivamente elaborato in C++ - forse posso estrarre tutti i dati necessari in C++ (ma il problema di conversione appare qui - mi sto concentrando sul formato 24bgr)?

PS: Ho bisogno di mantenere l'intera bitmap in memoria in modo da dividerlo in parti non è una soluzione.

PS2: Giusto per chiarire alcuni aspetti: conosco la differenza tra estensione del file e formato del file. Il file caricato è bitmap non compresso di 3 byte per pixel di dimensioni di ~ 1.42 GB (16k x 32k pixel), quindi perché l'oggetto Bitmap è più di due volte più grande? Non sono in corso problemi di decompressione e conversione in altri formati.

+0

Eventuali duplicati: [http://stackoverflow.com/questions/569889/how-do- i-use-large-bitmaps-in-net? rq = 1] (http://stackoverflow.com/questions/569889/how-do-i-use-large-bitmaps-in-net?rq=1) – Jason

+0

@ Jason: Sì, ma quella domanda non ha una risposta reale. Non so perché hanno supervisionato i file mappati in memoria. –

+0

Quale codifica utilizza la bitmap? C'è una compressione RLE? –

risposta

1

Considerare l'utilizzo di file di mappatura della memoria per accedere ai dati HUGE :). Un esempio focalizzato su ciò che ti serve può essere trovato qui: http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx È in codice gestito ma potresti anche usarlo da codice nativo equivalente.

Fatemi sapere se avete bisogno di maggiori dettagli.

+0

Puoi essere più specifico e mostrare come può essere usato in questo caso particolare? –

+0

Bene, attraversi la bitmap con una vista mappata in memoria, leggi i dati in blocchi e inseriscili nella parte C++. Penso che potrebbe persino essere più efficiente eseguire tutto in C++ e elaborare i dati bitmap mentre si attraversa il file mappato mem. –

+0

Il tutto è che con MMF non si caricano tutti i dati in memoria. Solo una piccola parte di esso. E puoi attraversarlo senza realmente preoccuparti che non sia tutto nella memoria. –

Problemi correlati