2008-09-26 66 views
1

我希望能夠在C++ MFC應用程序中使用CDC派生類寫入大型(例如20,000 x 20,000)像素位圖位圖。我已經嘗試使用MSDN文檔中描述的內存DC,但這些似乎只限於與當前顯示驅動程序兼容的尺寸。如何在C++/MFC/GDI中創建一個非常大的位圖

我目前使用位圖打印驅動程序來完成這項工作,但速度非常慢,並且由於後臺處理GDI信息而使用了大量的中間存儲空間。

我正在尋找的解決方案不應該涉及元文件或假脫機,因爲我繪製的模型需要數百萬GDI調用才能呈現。

我可以通過多個內存DC使用分而治之的方法,但它似乎是一個非常笨拙和不雅的技術。

有什麼想法?

回答

2

CDC和CBitmap似乎只支持設備相關的位圖,您可能有更多的運氣創建您的位圖::CreateDIBSection,然後附加一個CBitmap。不幸的是,原始的GDI界面有點古怪。

在32位BPP中,至少在32位應用程序中,您可能不會有太多的運氣,因爲它在大約1.5 GB的內存中出現,但我得到了一個有效的HBITMAP,帶有16 bpp :

BITMAPINFOHEADER bmi = { sizeof(bmi) }; 
bmi.biWidth = 20000; 
bmi.biHeight = 20000; 
bmi.biPlanes = 1; 
bmi.biBitCount = 16; 
HDC hdc = CreateCompatibleDC(NULL); 
BYTE* pbData = 0; 
HBITMAP hbm = CreateDIBSection(hdc, (BITMAPINFO*)&bmi, DIB_RGB_COLORS, (void**)&pbData, NULL, 0); 
DeleteObject(SelectObject(hdc, hbm)); 
+0

謝謝西蒙,就是我之後。我在每個像素8位,所以應該是這樣。 – 2008-09-26 08:18:56

1

這是不常見的,因爲我經常基於屏幕創建一個DC,用於比屏幕大得多的位圖圖像 - 在某些情況下加上3000像素 - 完全沒有問題。你有沒有一些示例代碼可以顯示這個問題?

1

考慮到如此大的圖像分辨率,您無法使用兼容的位圖創建圖像。

實施例:

像素深度= 32位每像素

像素數= 20.000 * 20.000 = 400.000.000

總字節數=像素數* 4 = 1.600.000.000字節= 4個字節= 1.562.500 kb〜= 1525 MB〜= 1.5GB

我在猜測最終意圖,但假設您想要創建並允許用戶使用非常詳細的縮放來瀏覽巨大的地圖。 您應該創建一個自定義圖像文件格式;您可以在該文件中放入包含位圖網格的各種圖層,以加快渲染速度。渲染過程可以使用GDI DIB或GDI +創建部分圖像,然後將它們渲染在一起。當然,這需要一些實驗/優化來達到完美的用戶感受。

好運

+0

或者使用SVG,當然:) – 2008-09-26 07:52:25

+0

xoreax,相當合適的大小,並且映射到應用程序。顏色深度是8位的碼垛,對於原始位圖而言,其進入量少於400mb,與JPEG相比要小得多。 Simon,你的CreateDIB答案現在已經成功了。我稍後會看看SVG。 – 2008-09-26 08:21:23

0

如果圖像必須是這項決議 - 說一個高分辨率的X射線掃描 - 那麼你可能想看看在編寫定製的後臺程序爲它 - 1.5 GB是非常昂貴的 - 即使是現代桌面。

如果它是基於矢量的,那麼您可以查看SVG,因爲它支持視圖端口,並且大多數允許您呈現爲其他格式。我通過蠟染(Java)使用SVG到JPG,所以它可以做到。

1

爲了讓您的內存使用量保持在可接受的範圍內,您必須使用「分而治之」策略。這不是黑客,如果實施正確,它實際上是處理無限大小位圖的非常優雅的方式。如果你設計的是正確的,你可以結合'圖像的唯一渲染/顯示部分','以低分辨率渲染整個圖像進行屏幕顯示','將整個東西渲染到磁盤上的位圖'一個引擎和屏蔽你的代碼的用戶(很可能是你自己在兩週內))。我從事的產品有相同的問題:將(可能較大的)地圖渲染到屏幕或.bmp文件。

相關問題