2016-07-23 70 views
0

我無法找到在線可用的bmp文件之間的任何區別,所以我可以很容易地判斷它們是24位還是32位。如何區分32位和24位bmp文件?另外我該如何讀取32位bmp文件到C++數組中?

我需要使用C++將32位bmp文件讀入rgb數組,而大多數教程僅適用於32位。

+0

[BITMAPINFOHEADER](https://msdn.microsoft.com/en-us/library/windows/desktop/dd318229.aspx)結構的* biBitCount *成員聲明每個像素的位數。如果您需要讀取位圖文件,請使用庫。在Windows上將是[Windows圖像組件](https://msdn.microsoft.com/en-us/library/windows/desktop/ee719902.aspx)。不要推出自己的。 BMP文件格式是**方式太複雜。 – IInspectable

+0

@IInspectable有沒有辦法創建我自己的結構來處理標題和其他垃圾數據,因爲我的主要工作是使用rgb值?坦率地說,使用WIC似乎比簡單複雜。 – Anurag

+0

@Auurag你是否用窗口開發,希望比學習WIC的方法更短?或者你問,因爲你在跨平臺工作? – Christophe

回答

0

描述位圖文件的格式here on MSDN:它以14個字節的文件頭開頭,後面跟着bitmap info header,其中包含您在biBitCount字段中查找的信息。

編輯:

正如在評論中指出iinspectable,位圖格式可以是複雜的。因此在Windows中,最好的方法是使用Windows API訪問上述結構的信息。

如果你工作的跨平臺的,你必須要照顧很多細節自己:

  • 不同file format versions:事實上,你需要閱讀,偏移量爲DWORD(32位無符號)使用文件的14找出which version of the data structure。您正在查看的信息位於文件的偏移量24(核心版本)或28(其他版本)。這是一個WORD,所以它是16位無符號。

  • 文件格式可以壓縮。核心版本並非如此。對於其他版本,它在以下DWORD(偏移30)處指示。

  • 所有整數存儲在little endian中。

但不是自己做這一切,你還可考慮CImg或另一個庫。

+0

你錯了。 [BITMAPFILEHEADER](https://msdn.microsoft。com/en-us/library/dd183374.aspx)之後可能會跟一個[BITMAPCOREINFO](https://msdn.microsoft.com/en-us/library/dd183373.aspx)。在這種情況下,* bcBitCount *的偏移量將是24.正如我所說的,不要自己滾動。 BMP從根本上**複雜。 – IInspectable

+0

@IInspectable謝謝你指出這一點。我做了相應的編輯。 – Christophe

相關問題