2011-01-13 142 views
1

我有一個內存問題,我正在使用一個算法來「平化」PDF文檔中的頁面。CreateDibSection在磁盤而不是物理內存

HBITMAP hbmp = CreateDibSection(...); 
ThirdPartyBmpManipulation(hbmp, "C:\\file.pdf", 0); //renders page 0 in file.pdf 
void * hdib = ConvertBitmap(hbmp); //copy a Dib Section to a Dib 
DeleteObject(hbmp); //frees the HBitmap while the Dib is now in memory 

問題是,我有一個非常大的位圖,並在某些情況下,我不能保持HBITMAP在內存中,而我分配給被複制到DIB。

所以這是一個遠射,但我可以以某種方式分配磁盤上的Dib部分,並仍然有一個HBITMAP它? (對我的ConvertBitmap函數使用相同的句柄)

+0

聽起來像一個很好的問題。我會有興趣知道答案。但爲什麼你仍然使用舊的Windows API?這真的很古老。爲什麼不使用GDI +? – Rafid 2011-01-13 17:13:58

+0

@Promather GDI +只是GDI的一個包裝,使它真的很慢;-) – 2011-01-13 17:27:32

回答

1

什麼是故障模式?你說「物理內存」:Windows使用虛擬內存,它將頁面切換到磁盤,你不需要擔心物理內存超出性能影響。如果您的地址空間不足,則使用該磁盤可能無法爲您提供幫助。

但是,CreateDIBSection可以採取HANDLE文件映射(使用CreateFileMapping創建)。如果功能和相關HBITMAP功能的內部足夠聰明,則可以通過利用該功能來避免耗盡地址空間。如果他們「聰明」,他們將使用MapViewOfFile將文件的相對較小的「窗口」根據需要映射到進程的地址空間中。

相關問題