2012-06-16 22 views
6

Pracuję nad projektem uniwersyteckim i utknąłem z problemem pamięci. załadować bitmapę, która trwa około 1,5GB na HDD z kodem poniżej:Przetwarzanie na dużych bitmapach (do 3 GB)

Bitmap bmp = new Bitmap(pathToFile); 

Problem jest, że obiekt Bitmap nowo utworzony wykorzystuje około 3,5GB pamięci RAM, która jest coś nie mogę zrozumieć (to naprawdę duże opakowanie: E). Muszę dostać się do tablicy pikseli, a użycie klasy Bitmap jest naprawdę pomocne (później używam metody LockBits() i przetwarzam bajt tablicy na bajt), ale w tym przypadku jest to totalna blokada. Oto moje pytanie:

Czy istnieje prosty sposób na wyodrębnienie macierzy pikseli bez pożyczania dodatkowych 2 GB?

Używam C# tylko do wyodrębnienia potrzebnej tablicy, która jest później przetwarzana w języku C++ - może mogę wyodrębnić wszystkie potrzebne dane w języku C++ (ale pojawia się problem z konwersją - koncentruję się na formacie 24bgr)?

PS: Muszę zachować całą bitmapę w pamięci, więc podzielenie jej na części nie jest rozwiązaniem.

PS2: Tylko w celu wyjaśnienia niektórych problemów: Znam różnicę między rozszerzeniem pliku a formatem pliku. Załadowany plik jest nieskompresowany w postaci mapy bitowej 3 bajty na piksel o rozmiarze ~ 1.42GB (16k x 32k pikseli), dlaczego obiekt Bitmap jest ponad dwa razy większy? Wszelkie problemy z dekompresją i konwersja do innego formatu nie mają miejsca.

+0

Możliwy duplikat: [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: Tak, ale to pytanie nie ma odpowiedzi. Nie wiem, dlaczego nadzorowali pliki mapowane w pamięci. –

+0

Jakie kodowanie wykorzystuje bitmapa? Czy jest kompresja RLE? –

Odpowiedz

1

Rozważ użycie plików mapowanych na pamięć, aby uzyskać dostęp do OGROMNYCH danych :). Przykład koncentrujący się na tym, czego potrzebujesz, można znaleźć tutaj: http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx Jest to kod zarządzany, ale równie dobrze można go używać z równoważnego natywnego kodu.

Daj mi znać, jeśli potrzebujesz więcej informacji.

+0

Czy możesz być bardziej konkretny i pokazać, w jaki sposób można go użyć w tym konkretnym przypadku? –

+0

Po prostu przechodzisz przez mapę bitową z widokiem mapowanym w pamięci, czytasz dane w porcjach i wciskasz do części C++. Myślę, że nawet bardziej wydajne byłoby zrobienie tego wszystkiego w C++ i przetwarzanie danych bitmapowych podczas przechodzenia przez plik mapowany mem. –

+0

Cała sprawa polega na tym, że przy MMF nie ładujesz wszystkich danych do pamięci. Tylko niewielka część tego. I możesz przejść przez to bez troski, że to nie wszystko w pamięci. –

Powiązane problemy