2013-07-30 67 views
4

我正在處理一個應用程序,它必須處理大型bmp文件,這些文件通常太大而不適合內存。作爲我們在創建項目時開發的軟件的一部分,我的應用程序將數據從bmp文件轉換爲不同的格式,以便在部分中輕鬆檢索。直接從文件中讀取大量bmp數據

目前,由於文件通常太大而無法放入內存,因此軟件直接從文件中讀取一部分字節數據,對其進行處理,然後移至下一部分。用於讀取文件的代碼類似於如下所示(簡化爲清楚起見):

FileStream fs = File.OpenRead(fileName); 
fs.Seek(sectionStart, SeekOrigin.Begin); 

currentSectionAsBytes = new byte[sectionSize]; 
fs.Read(currentSectionAsBytes, 0, currentSectionAsBytes.Length); 

這一直很好,直到如今,因爲我們所有的工作文件的寬度被4整除,因此BMP文件沒有填充。最近,我們一直在處理不同大小的圖像,這些圖像在每行數據的末尾都有填充,導致採集的數據出錯。

我的問題是,有誰知道任何更好的方式直接從文件獲取bmp數據。如前所述,由於文件較大,我無法從文件中讀取位圖。目前我最好的想法是,在獲取currentSectionAsBytes之後,計算填充大小並手動刪除它。這看起來太麻煩和複雜了。必須有更好的解決方案。

+0

我很好奇你的項目處理位圖的目的是爲了加載到內存中。你正在處理來自「斯隆數字巡天」的圖像嗎?或者你的電腦過時了,你可以添加一些內存;)我最好的猜測是你應該編程一個例程,在讀取數據的同時過濾填充。 –

+0

@Mike de Klerk。沒有像我擔心的那樣激動人心:p圖像數據是從許多來源獲得的,其中文件大小超出了我們的控制範圍。同樣,該軟件被不同機器上的許多學者/學生使用,所以我們必須確保他們都可以運行它。我認爲你的想法可能是要走的路。我只是希望有一個更優雅的解決方案。我想我是一廂情願。 – OnABauer

回答

2

當你面對內存不足(因爲它會導致創建另一個數組)時,「從數組中手動​​移除」某個東西是一個壞主意。我想,你的問題的正確方法是將兩個額外的參數添加到您的處理方法,所以它的siganture將類似於:

void ProcessSection(byte[] data, int offset, int count); 

然後遍歷data不是從0data.Length,但offsetcount。這是在.Net中處理數組的常用方法(例如,查看fs.Read()方法),除此之外沒有什麼可以完成的。是的,你將不得不根據你的位圖屬性來計算偏移/計數。

Ofc,或者,您可以在調用fs.Seek方法(例如,當您計算sectionStart)時考慮偏移量,但我認爲第一個應用更具普遍性。

+0

感謝您的回覆。如果我理解正確,那麼最好的方法是每次從FileStream讀取一行,然後在移動到下一行之前跳過填充的單元格?我期待着這樣的事情,我只是不確定它是否是最好的解決方案。 – OnABauer

+0

是的,您應該在讀取操作之間跳過填充或讀取整行,但在處理時忽略與填充對應的字節。 –