2011-12-15 113 views
1

我需要在MFC/WinAPI應用程序窗口上顯示位圖。位圖大小可以是多種 - 例如40MB,100MB,500MB,700MB,1GB等等。不適合應用程序窗口的巨大位圖應該用滾動條顯示。處理巨大的位圖

問題是,即使內存是通過CreateFileMapping + CreateDIBSection分配的,系統也無法爲一些大尺寸創建位圖。

是否有處理這種情況的方法嗎?我想我需要將我的位圖分成許多小塊,但我不確定這是否正確。

+0

我會認真考慮一種分頁技術(特別是對於非常大的圖像!):考慮一個遊戲,只有一小部分紋理(你看到的)會一次加載。此外,在這種情況下,「較低分辨率版本」等技術用於距離內的事物或(也可能是「加載時」)。當然,這在某種程度上使問題複雜化,並且特別是*使一些圖像格式難以解碼/加載成塊。找到已經做了這個或寫的圖書館 - 但不是真的!太複雜了! - 你自己的:-)(但也許預分割或格式友好的大規模圖像?) – 2011-12-15 08:11:42

+1

WIC api擅長處理巨大的位圖。獲得64位版本的Windows是快速解決方案。 http://msdn.microsoft.com/en-us/library/windows/desktop/ee719655%28v=vs.85%29.aspx – 2011-12-15 09:59:09

回答

2

什麼尺寸的位圖的不可爲你創造?您可能遇到的限制是虛擬地址空間,對於32位代碼而言,它是2GB,3GB或4GB - 取決於環境。最直接的解決方案是轉向64位代碼。

呈現這個形象,你也許會想實現一個自定義窗口/控制該位塊傳輸到客戶端區域的源圖像的一部分,並且將管理滾動條,使用戶通過圖像瀏覽。與開發多年的基於scollbar的窗口相比,實施這種窗口不太可能有任何特殊性。 Scroll Bar Functions給你這個。

更新上CreateFileMapping/MapViewOfFile

CreateFileMapping分配的內存不能立即映射到進程的地址空間,這讓你一個選項,以分配超過您可以映射。請注意,Windows在滿足分配請求時實際上並未預留實際頁面,系統僅檢查此類分配是否可行,並且稍後將按需分配。

你可以使用這個簡單的探測工具FileMappingVirtualAddress.exe看到了整個事情的作品和排序如何估計有多少你可以在你的應用程序分配。該實用程序儘可能在啓動時儘可能多地執行256 MB塊,並通過手動選中一個框,在已有文件映射上執行MapViewOfFile。您將能夠看到真正的限制是虛擬地址空間(取決於環境的2,3或4 GB),但這並不意味着您不能分配更多。

enter image description here

另外請注意,如果您申請MapViewOfFile一大塊,該系統需要與一個連續的地址塊,以滿足這一點,所以這個地址空間必須是可用和空間碎片可能是一個問題。

對於大位圖,您可以使其實際上不需要全部位圖,並且可以通過切片處理圖像切片。

您也可以通過trunctate下載鏈接瀏覽Trac以獲取64位版本和32位版本,而不使用/LARGEADDRESSAWARE,以瞭解它們在行動方式上的差異。

+0

創建失敗的位圖大小爲〜700MB。我已經通過CreateFileMapping成功創建了這個大小的句柄,但是CreateDIBSection失敗(返回null)。我有WinXP 32bit與3,5GB內存,虛擬內存設置爲4GB。 – Rom098 2011-12-15 09:10:21

0

Windows中的總GDI資源和單個位圖大小是受限制的資源。同時,純數組大小僅受虛擬地址空間和可用物理內存的限制。因此,您需要將整個圖像保持爲普通的像素陣列,只將所需的部分轉換爲GDI位圖進行顯示。