2012-06-16 74 views
6

我正在研究一些大學項目,並且遇到了內存問題。 我打開一個位圖大約需要1,5GB硬盤上用下面的代碼:處理大的位圖(高達3GB)

Bitmap bmp = new Bitmap(pathToFile); 

的問題是,新創建位圖對象使用有關的RAM 3,5GB這是我無法理解(這是真的是大包裝:E)。我需要進入像素數組,並且使用Bitmap類真的很有幫助(稍後我使用LockBits()方法,並且每字節處理數組字節),但在這種情況下,它是完全阻塞的。所以這裏是我的問題:

是否有任何簡單的方法來提取像素數組而不借出額外的2GB?我正在使用c#來提取所需的數組,這是後來在c + +處理 - 也許我可以提取所有需要的數據在c + +(但轉換問題出現在這裏 - 我專注於24bgr格式)? PS:我需要將整個位圖保存在內存中,因此將其分割爲多個部分是無法解決的。

PS2:只是澄清一些問題:我知道文件擴展名和文件格式之間的區別。加載的文件是未壓縮的位圖,每個像素大小爲3個字節〜1.42GB(16k x 32k像素),那麼爲什麼Bitmap對象的大小超過兩倍?任何解壓縮問題和轉換爲其他格式都不會發生。

+0

可能重複:[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:是的,但這個問題沒有真正的答案。不知道他們爲什麼監督內存映射文件。 –

+0

位圖使用什麼編碼?是否有RLE壓縮? –

回答

1

考慮使用內存映射文件來訪問您的巨大數據:)。 一個關於你需要什麼的例子可以在這裏找到:http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx 它在託管代碼中,但你也可以從等價的本地代碼中使用它。

讓我知道你是否需要更多的細節。

+0

你能更具體,並顯示它如何可以在這種特殊情況下使用? –

+0

那麼,你只需要使用內存映射視圖遍歷位圖,以塊的形式讀取數據並將其推送到C++部分。我認爲在C++中完成所有操作並在遍歷mem映射文件時處理位圖數據甚至可能更有效。 –

+0

整體而言,MMF不會將整個數據加載到內存中。只是它的一小部分。而且你可以在沒有實際關心它不在記憶中的情況下穿過它。 –